Vba excel если текст содержит

Обновлено: 07.07.2024

Нужно чтобы в B1-3 выводилось нужное значение в зависимости от того, какой текст содержится в А1-3. Если текст содержит "футболки", то выводим "Футболка". Если текст содержит "худи", то выводим "Худи" и т.д.

Пробовал =IFS(ПОИСК("футболка";A1); "Футболка"; ПОИСК("худи";A1); "Худи") , но срабатывает только на "футболка".
Пробовал =ЕСЛИ(ПОИСК("футболка";A1);"Футболка"), но не знаю как добавить условия еще и для худи и свитшотов.

Простой 7 комментариев

Я бы использовал VBA-функцию. Это на порядок проще, и ничуть не менее эффективно. VBA лишнее, из пушки по воробьям, есть встроенные функции, которые это делают, задача простейшая, а VBA-код требует сохранения в другом формате для постоянного использования, и часто требует (в зависимости от настроек безопасности) активации пользователем при старте, иначе работать не будет.

Ну вот например - сойдёт на время, пока John Smith, покажет, как эта простейшая задача решается встроенными функциями.


На листе - формула B1=get_category(A1) .

6139bf1269331772644410.jpg

* обходится той же lookup-таблицей, читаемой из макроса, но тогда нужно переписать макрос

- excel с настройками по умолчанию задолбает криками "там vba! там леший бродит! разрешить?"
- сохранять придется в xlsm

Ну без этого никуда. Впрочем, ничто не мешает подписать макрос и избавиться от первой проблемы. А второе так и вовсе не проблема.

Макрос загрузки элементарно изменяется со статически прописанного в коде списка на загрузку с листа. Или можно завести текстовую константу со списком в CSV и распарсить его в массив.

ProgrammerForever

если у вас есть проблема, и вы собираетесь решать ее с использованием регулярных выражений, то у вас есть две проблемы
Пробовал =IFS(ПОИСК("футболка";A1); "Футболка"; ПОИСК("худи";A1); "Худи") , но срабатывает только на "футболка".

У вас две проблемы. Вы смешиваете русские и английские названия функций, Excel так не умеет (если вы действительно делаете так именно в таблице, а не в описании задачи).
Второе. Футболка у вас работает потому, что это первое условие. Как только начинает обрабатываться другая ячейка, поиск футболки, происходящий первым, выдает ошибку, и формула также выдает ошибку. Нужно обернуть поиск в функцию iferror, которая будет исключать вывод ошибки. Например, так:

- старомодно вложенными IF-ами, хоть это и жесть:

-новомодными IFS-ами, лучше, хоть тоже не айс:


6139b3e322db7714584302.jpg

Естественно, использовать функции следует на том языке, какой у вас стоит, иначе тоже будет ошибка. Также нужно учитывать используемый в системе разделитель списков (; или ,).
Вместо IFERROR можно использовать в качестве обертки ISNUMBER.

Приведенные примеры неоптимальны, расширение списка проверок требует переписывания формулы каждый раз, количество вложенных проверок лимитированно, и, наверняка, это неоптимально с точки зрения вычислительных ресурсов. Лучше использовать Index-Match и список категорий, как-то так:

Мне нужно что-то вроде: if cells(1,1).value содержит слово 'форум'.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Проверка на совпадение + проверка строки на содержание спец. символов
В общем ситуация такая: есть типизированный файл, форма для добавления пользователей (которые.

Создать макрос для переноса примечания ячейки в содержание
Пусть на листе 1 в таблице 2х2 заполнены разным содержимым 4 ячейки и две из них с примечанием.

Проверка на содержание строки
Здесь проверяем на наличие букв a и b (10 и 11 соответственно). Если задавать строку s сразу в.

Проверка QListWidget на содержание
Подскажите, как можно проверить QListWidget на наличие в нем item'ов, Т.е. пустой он или нет?

To Kaleos. Здравствуйте. Иногда бывают ситуации, когда лучьше использовать функцию Like, которая относится к "группе строковых функций" (т.е. функций для работы с строками), так же, как и ф-я InStr(). И еще, часто (очень!) удобно использовать ф-ю совместно с массивом. Например:

Подскажите, как в данном случае правильно использовать оператор "Case". На ниже приведенный код ругается "Expected: end of statment". Т.е задача такая: в случае содержания в i-й ячейке "Форум1" переменной idForum присвоить значение "1", в случае содержания в i-й ячейке "Форум2" переменной idForum присвоить значение "2" и т.д.

If InStr(1, Cells(i, 1), "Форум3", vbTextCompare) <> 0 Then idForum = 3 Да, я так и делаю, были проблемы с условием, думал проблема в if-х, запустил "пошагово", оказалось: ошибка в коде, внутри if-а. Спасибо. Вы пробуете сделать выбор из того, что выбора не имеет. Т.е., если бы Вы проверяли только наличие слова "Форум1", тогда применение Select Case было бы оправданным, например

В Вашем случае Вы ищете три разных выражения, и тогда лучьше использовать что-то другое, как подсказывает, например, Pavel55.
И все-таки желательно применять .Value, vbTextCompare (vbBinaryCompare)

Добавлено через 4 часа 19 минут
Давайте тогда добьем строковую функцию instr() до конца.
Никогда не возникала у меня подобная ситуация, но не так давно участник форума Скрипт посоветовал применить Instr() совместно с функцией, к примеру, Ucase() - тоже строковая фукция. И буквально на следующий день. Поэтому и Вам передаю его совет. Все-таки лучьше застраховаться и писать в функции следующим образом (или что-то подобное):

Я пытаюсь написать макрос, в котором, если есть ячейка со словом «ИТОГО», он будет вводить тире в ячейку под ней. Например:

enter image description here

В приведенном выше случае я хотел бы поставить тире в ячейку F7 (примечание: может быть любое количество столбцов, поэтому это всегда будет строка 7, но не всегда столбец F).

В настоящее время я использую этот код, но он не работает, и я не могу понять, почему.

Помощь будет оценена. Надеюсь, я не делаю глупостей.

Это будет проходить по всем ячейкам в заданном диапазоне, который вы определяете ("RANGE TO SEARCH") , и добавлять тире в ячейку ниже, используя метод Offset() . В VBA рекомендуется никогда не использовать метод Select .

Это позволит вам динамически добавлять столбцы и автоматически вставлять дефис под любыми столбцами в строке C после 6, содержащей «Итого» без учета регистра. Примечание: если вы пройдете мимо ZZ6, вам нужно будет изменить код, но это должно привести вас туда, куда вам нужно.

Требование:
Найдите ячейку, содержащую слово TOTAL , затем введите прочерк в ячейке под ним.

Решение: В этом решении используется метод Find объекта Range , поскольку кажется целесообразным использовать его вместо грубой силы (цикл For…Next ). Для объяснения и подробностей о методе см. метод Range.Find (Excel)

Реализация:
Для обеспечения гибкости в эту функцию заключен метод Find :

Где:
sWhat : содержит string для поиска
rTrg : range для поиска

Функция возвращает True , если найдено какое-либо совпадение, в противном случае она возвращает False

Кроме того, каждый раз, когда функция находит совпадение, она передает полученный range процедуре Range_Find_Action для выполнения требуемого действия (т. Е. "введите тире в ячейку под ним" ). «Требуемое действие» выделено в отдельную процедуру для обеспечения гибкости и настройки.

Вот как называется функция:

Этот тест ищет "всего", чтобы показать эффект MatchCase:=False . Соответствие можно сделать чувствительным к регистру, изменив его на MatchCase:=True

Я пытаюсь написать макрос, где, если есть ячейка со словом "TOTAL", тогда она будет вводить тире в ячейке под ней. Например:

enter image description here

В вышеприведенном случае мне нужна тире в ячейке F7 (обратите внимание: может быть любое количество столбцов, поэтому всегда будет строка 7, но не всегда столбец F).

В настоящее время я использую этот код, но он не работает, и я не могу понять, почему.

Помощь была бы оценена. Надеюсь, я не делаю что-то глупое.

Это будет проходить через все ячейки в заданном диапазоне, который вы определяете ("RANGE TO SEARCH") и добавьте тире в ячейку ниже с помощью метода Offset() . Как наилучшая практика в VBA, вы никогда не должны использовать метод Select .

Это позволит вам динамически добавлять столбцы и автоматически вставлять тире под любые столбцы в строке C после 6, содержащих нечувствительность к регистру "Всего". Примечание. Если вы пройдете ZZ6, вам нужно будет изменить код, но это должно привести вас туда, куда вам нужно идти.

Это делает то же самое, улучшенное с CONTAINS:

Вы объявили "celltxt" и использовали "celltext" в instr.

Это то, что вы ищите?

Вы можете сделать что-то подобное

Что похоже на то, что у вас есть.

Требование:
Найдите ячейку, содержащую слово TOTAL и введите черту в ячейку под ней.

Решение. В этом решении используется метод Find объекта Range , так как представляется целесообразным использовать его, а не грубую силу (цикл For…Next ). Для объяснения и деталей о методе см. Метод Range.Find(Excel)

Реализация:
Для обеспечения гибкости метод Find обернут в эту функцию:

Куда:
sWhat : содержит string для поиска
rTrg : range для поиска

Функция возвращает True если какое-либо совпадение найдено, иначе возвращает False

Кроме того, каждый раз, когда функция находит совпадение, она передает полученный range в процедуру Range_Find_Action для выполнения требуемого действия (т. Range_Find_Action "Введите тире в ячейку под ней"). "Требуемое действие" находится в отдельной процедуре для обеспечения возможности настройки и гибкости.

Вот как называется функция:

Этот тест ищет "total", чтобы показать эффект MatchCase:=False . MatchCase:=True можно сделать чувствительным к регистру, изменив его на MatchCase:=True


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

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке "A" ячейку, содержащую "123" можно примерно так:

Минусами этого так сказать "классического" способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую "123" достаточно такого кода:

Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист "Данные";
2-я строка: Осуществляем поиск значения "123" в колонке "A", результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае - будет пустой, т.е. Nothing.

Полностью синтаксис оператора поиска выглядит так:

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

What - Строка с текстом, который ищем или любой другой тип данных Excel

After - Ячейка, после которой начать поиск. Обратите внимание, что это должна быть именно единичная ячейка, а не диапазон. Поиск начинается после этой ячейки, а не с нее. Поиск в этой ячейке произойдет только когда весь диапазон будет просмотрен и поиск начнется с начала диапазона и до этой ячейки включительно.

LookIn - Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

LookAt - Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

SearchOrder - Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

SearchDirection - Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

MatchCase - Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

MatchByte - Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

SearchFormat - Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

Чтобы продолжить поиск, можно использовать FindNext (искать "далее") или FindPrevious (искать "назад").

Примеры поиска функцией Find

Пример 1: Найти в диапазоне "A1:A50" все ячейки с текстом "asd" и поменять их все на "qwe"

Обратите внимание : Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

В ниже следующем примере используется другой вариант продолжения поиска - с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

Пример 3: Продолжение поиска с использованием Find с параметром After.

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом "курсив" и поменять их формат на обычный (не "курсив")

Хочу обратить внимание на то, что в этом примере я не стал использовать "защиту от зацикливания", как в Примерах 2 и 3, т.к. шрифт меняется и после "прохождения" по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

Поиск последней заполненной ячейки с помощью Find

Следующий пример - применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.

Пример 5: Найти последнюю колонку и столбец, заполненные данными

Для поиска функцией Find по маске (шаблону) можно применять символы:
* - для обозначения любого количества любых символов;
? - для обозначения одного любого символа;

- для обозначения символов *, ? и

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

?, чтобы искать именно звездочку (*), нужно написать

* и наконец, чтобы найти в тексте тильду, необходимо написать

Поиск в скрытых строках и столбцах

Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

Пример 8: Найти 1 марта 2018 г.

Искать часть даты - сложнее. Например, чтобы найти все ячейки, где месяц "март", недостаточно искать "03" или "3". Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел - это выбрать формат в котором месяц прописью для ячеек с датами и искать слово "март" в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

Книги по теме:






Посмотреть все книги по программированию

Комментарии к статье:

10.09.17 Дмитрий Очень толковая и полезная статья. Помогла мне существенно ускорить мой код. Спасибо!
23.11.17 Гость Спасибо, хорошая статья.
03.12.17 Владимир Спасибо! Использую в своих проектах.
07.12.17 Эд Спасибо, очень пригодилась Ваша статья!
19.01.18 Николай .find не ищет значение в ячейке, если ячейка в скрытой строке.
.match позволяет не беспокоится о том, что на листах с источниками данных строка с искомым значением будет скрыта из-за установленного фильтра.
05.02.18 Владимир Большое спасибо! Очень толково и понятно.
11.03.18 Гость Здравствуйте,
А если мне требуется найти ячейку в определенном столбце с определенным значением, например "строка 1" и если я нахожу такую, то через несколько строк(неизвестно сколько) мне нужно раскрасить следующую ячейку в другом столбце(самую ближайшую) и остановить цикл, и опять по новой искать дальше "строка 1". Можете посоветовать?
26.03.18 Гость Спасибо! Все бы так описывали! Все доступно и понятно))
23.05.18 Аркадий В VBA я новичок. Активно использую интернет для своих вопросов, однако таких информативных, лаконичных и простых в понимании сайтов не много. Огромное спасибо автору! Адрес уже в закладках.
21.07.18 Гость Спасибо! Уже несколько недель искала подобное!
25.07.18 Joann Метод .find (в случае далнейших множественных обращений к этому механизму) разумно вынести в отдельную функцию, как из управляющей процедуры передать в эту функцию ее параметры (обязательный текстовый параметр 'what:=' - передается без проблем, а вот значения ('xlValues', 'xlWhole', . ) для 'LookIn:=', 'LookAt:=', . - приводят к ошибке)?
15.08.18 Марат Спасибо за статью, пополнил свои знания в части метода Find. Простые переборы хороши на небольших диапазонах. А когда нужно обработать сотни тысяч ячеек, Find - хороший инструмент!
28.08.18 Гость Познавательно и подробно. Спасибо за статью.
16.10.18 Гость Хорошая статья. Спасибо
29.10.18 Sega Полезная статейка. Спасибо.
14.11.18 Гость Статья для начинающих, а тонкости поиска по дате нет ни одного примера
02.02.19 Ибрагим Чушь полная, плагиат!
01.03.19 inexsu.wordpress.com Loop While Not c Is Nothing And c.Address <> firstResult
Когда c станет Nothing, c.Address даст ошибку
Решение https://inexsu.wordpress.com/2018/03/05/range-findnext-method/
01.03.19 Администратор Вы правы, такое действительно может произойти, например, если менять значения найденных ячеек. Т.е., например, ищем значения "asd" и меняем их на "qwe". При замене последнего значения, FindNext ничего уже не найдет, вернет Nothing и произойдет ошибка в условии.
Внес изменения в статье. Спасибо вам за подсказку.
07.04.19 Гость Добрый день. есть 2 таблица на разных листах. макрос нашел нужные ячейки с ИНН по 1 условию, затем мне надо чтобы макрос нашел в таблице 2 на листе 2 все названия клиентов с инн по условию 1 из таблицы 1 с листа 1. как тогда использовать find.
07.04.19 Гость Лучше использовать функцию ВПР
21.05.19 Гость Очень подробная статья. Отдельное спасибо за множество примеров.
17.10.19 Михаил Спасибо большое все понятно доступно и очень полезно
31.10.19 Гость Спасибо.
01.11.19 Гость ку
01.11.19 Гость 2 раза
19.11.19 Kamol Отлично.
Поиск с двумя значениями Пример в колонке А="123" и В="456"
25.12.19 Гость Спасибо!
05.03.20 Гость Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу "омпьюте", "пьюте" слово компьютер а по запросу "ком" слова компьютер и ком"

Читайте также: