Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 8
1

Поиск значения в ячейке

06.01.2016, 14:28. Просмотров 3975. Ответов 23
Метки нет (Все метки)

Добрый день!
Имеется некая ячейка, содержащая текст.
Имеется таблица 20*20, содержащая ключевые слова.

Как при помощи макроса запустить проверку ячейки, чтобы при нахождении в ней любого слова из столбца 1 - выполнить макрос 1, из столбца 2 - выполнить макрос 2, и так для каждого столбца ключевых слов.

Пример:

Ячейка = "мама мыла раму"

Таблица ключевых слов:
....1.......|......2......|.......3....
Мама...|..Дядя...|..Дедка
Папа....|...Тетя...|...Бабка

Выполнить макрос #1 так как ячейка содержит слово из первого столбца.

Надеюсь не сильно запутал. Спасибо))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2016, 14:28
Ответы с готовыми решениями:

Поиск максимального значения в ячейке
Как на листе найти (программно)ячейку с максимальным значением.

Поиск значения и переход к ячейке, VBA
Доброго времени суток Я задолбалась не могу никак осуществить поиск по книге Excel такой, что...

Поиск значения в ячейке А1 через Cells.Find
Привет. Никак не могу понять, как через Cells.Find найти значение в ячейке А1. Какой параметр надо...

Макрос на запись в ячейке значения в зависимости от значения в другой
Можете отредактировать код так, чтобы в зависимости от содержания ячейки, например А1 в ячейке А2...

23
4048 / 2172 / 918
Регистрация: 01.12.2010
Сообщений: 4,527
06.01.2016, 15:30 2
Excel ? Word ?

Если в ячейке будет текст "папа + тетя = адюльтер", то какой макрос нужно выполнить 1, 2 или 1+2
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 8
06.01.2016, 16:20  [ТС] 3
VBA для Excel.
Массив ключевых слов и специфика текста в ячейке исключает одновременное упоминание двух ключей.
Так что возможно лишь одно совпадение -> один макрос.
Спасибо.
0
4048 / 2172 / 918
Регистрация: 01.12.2010
Сообщений: 4,527
06.01.2016, 16:56 4
Один из возможных вариантов :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Test()
    Dim iWord As Variant, iCell As Range
 
    For Each iWord In Split([A1])
        Set iCell = [A5:T24].Find(iWord, , xlValues, xlWhole)
        If Not iCell Is Nothing Then
           Run Choose(iCell.Column, "Change", "Delta", "Sum", и т.д.)
           Exit For
        End If
    Next
End Sub
Или так, если в таблице ключевых слов первый столбец, не [A:A] :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Test2()
    Dim iWord As Variant, iSource As Range, iCell As Range
    Set iSource = [C5:V24]
 
    For Each iWord In Split([A1])
        Set iCell = iSource.Find(iWord, , xlValues, xlWhole)
        If Not iCell Is Nothing Then
           Run Choose(iCell.Column - iSource.Column + 1, "Change", "Delta", "Sum", и т.д.)
           Exit For
        End If
    Next
End Sub
P.S. При желании, можно использовать массив
1
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
06.01.2016, 17:02 5
Добавляем к значению ячейки по пробелу по концам (в переменной).
Цикл по 20х20 (можно 2 вложенных), к каждому значению прибавляем пробелы, ищем используя Instr()
Если нашли - анализ столбца, выполнение макроса, выход.
Можно и иначе сделать - 20х20 в словарь с столбцом, split ячейки, перебор этого массива, проверка по словарю, выполнение макроса, выход.
Т.к. так и не сказали что за таблица и ячейка - только алгоритм.
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 8
07.01.2016, 13:32  [ТС] 6
Спасибо, вечером опробую.
Если не получится - выложу файл-образец.

Добавлено через 16 часов 26 минут
pashulka, большое спасибо, очень компактный код, все работает прекрасно
Вот только как добавить поиск по ключу из двух слов?

Ну тоесть Дядя он ищет, а вот Дядя Вася - уже нет.
0
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 13:36 7
Мой алгоритм в первом варианте избавлен от этой проблемы.
0
4048 / 2172 / 918
Регистрация: 01.12.2010
Сообщений: 4,527
07.01.2016, 13:40 8
alucard91, В этом случае - можно выбрать другой критерий разделения ключей, например, запятую

Код
A1 = Дядя Вася, мама, мыла, раму 'можно без пробелов
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Test1v2()
    Dim iWord As Variant, iCell As Range
 
    For Each iWord In Split([A1], ",")
        Set iCell = [A5:T24].Find(Trim(iWord), , xlValues, xlWhole)
        If Not iCell Is Nothing Then
           'Выполнение необходимого макроса
           Exit For
        End If
    Next
End Sub
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 8
07.01.2016, 14:40  [ТС] 9
Hugo121, простите, Ваш вариант с пробелами показался мне слишком запутанным.
pashulka, текст в А1 редактированию не подлежит, так что буду пытаться составить более четкие ключи для избежания колизий.
Да и вообще я видимо слишком много хочу от экселя))
Но начальная проблема решена, вопрос закрыт, всем спасибо!
0
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 14:44 10
Да что там сложного - добавить пробелы по концам, чтоб находить слова целиком...
Вообще если бы был сразу показан материал для работы - всем было бы легче.
0
4048 / 2172 / 918
Регистрация: 01.12.2010
Сообщений: 4,527
07.01.2016, 14:57 11
alucard91, Если не подлежит редактированию, то как узнать что сколько слов должен содержать ключ ?
Может Вы хотите перебрать все варианты ?
Или же Вам достаточно частичного совпадения ... тогда замените xlWhole на xlPart или добавьте символ подстановки "*"
0
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 15:48 12
Цитата Сообщение от pashulka Посмотреть сообщение
как узнать что сколько слов должен содержать ключ ?
- так все ключи говорят что известны - есть где-то некая таблица.
0
4048 / 2172 / 918
Регистрация: 01.12.2010
Сообщений: 4,527
07.01.2016, 16:03 13
Hugo121, Имелось ввиду, что если изначально - было достаточно искать любое слово из перечисленных, т.е. есть строка "дядю вася мама мыла раму" и мы ищем, сначала дядю, потом васю и т.д.
То теперь, когда выяснилось, что искомое значение может содержать несколько слов, возник мой вопрос.
0
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 16:23 14
Вопрос понятен.
Но без примера и подробного описания задачи непонятно, что вообще оптимальнее искать - ключей изначально ясно что всего 400, что там в строке - непонятно (может там слов в пару раз больше).
Да и вообще где это всё... может там вообще нигде ни одного привычного пробела нет Хотя раз код отработал - значит были.
Где должен быть код - это выяснили
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 8
07.01.2016, 16:26  [ТС] 15
Спасибо за оживленный дискус)
Приведу документ в удобоваримый вид и выложу завтра сюда с полным описанием задачи.
Извините за конфуз)
0
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 16:40 16
Не нужен обязательно оригинал (личные и секретные данные убирайте), нужен полный аналог - форматы, расположение данных, ну и в данном случае свои макросы не лишним будет показать, если возможно.
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 8
07.01.2016, 21:28  [ТС] 17
Секретных данных нет, условия и задачи постарался максимально расписать в самом документе.
От использования разных макросов в зависимости от результата совпадения в таблице ушел к одному макросу, зависящему от этого результата.

PS: кнопку убрал в сторону и забыл вернуть, она на той же вкладке что и описание, только сбоку.

Большое спасибо за внимание.
0
Вложения
Тип файла: rar T&P Notices 2016.rar (142.6 Кб, 5 просмотров)
4048 / 2172 / 918
Регистрация: 01.12.2010
Сообщений: 4,527
07.01.2016, 22:37 18
alucard91, На первый взгляд, реальный разделитель данных, у Вас это - и в этом случае, можно протестировать :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim iWord As Variant, iSource As Range, iCell As Range
iWord = Replace([A1], " ", "-", , 1) ': iWord = Replace(iWord, ".", "")
 
Set iSource = [AG2:BE14]
For Each iWord In Split(iWord, "-")
    Set iCell = iSource.Find(Trim(iWord), , xlValues, xlWhole)
    If Not iCell Is Nothing Then
       '''
       Exit For
    End If
Next
0
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 22:57 19
Добавил небольшой код, подправил чуть существующее (минимально - выход если не нашёлся ключ, и выбор не А1, а первой ячейки найденного диапазона, и убрал удаление диапазона, ибо это мне мешало Заменил на очистку - смотрите там есть остатки!)
Это для начала, там ведь нужно поиск ключей переделывать, а некогда...
1
Вложения
Тип файла: rar T&P Notices 2016.rar (142.1 Кб, 1 просмотров)
6637 / 2655 / 490
Регистрация: 19.10.2012
Сообщений: 8,009
07.01.2016, 23:10 20
Переделал поиск - проверяйте.
0
Вложения
Тип файла: rar T&P Notices 2016-2.rar (143.6 Кб, 11 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2016, 23:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Поиск значения в ячейке
Добрый вечер. Возник такой вопрос. Если мне нужно из несколько значений в одной ячейке, найти одно...

Поиск конкретного значения в ячейке
Доброго времени суток. Передо мной стоит такая задача: К примеру есть 3 столбика: A B C, под...

Поиск и сравнения значения в ячейке таблицы
Добрый день! Значения приходят в таблицу main колонка Manf_str, значения приходят с накладных и...

Поиск значения одной ячейки в другой ячейке
Здравствуйте, нужна помощь профессионалов Excel ))) Есть такая задача... Нужно найти значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.