Vba excel если текст содержит
Обновлено: 07.07.2024
Нужно чтобы в B1-3 выводилось нужное значение в зависимости от того, какой текст содержится в А1-3. Если текст содержит "футболки", то выводим "Футболка". Если текст содержит "худи", то выводим "Худи" и т.д.
Пробовал =IFS(ПОИСК("футболка";A1); "Футболка"; ПОИСК("худи";A1); "Худи") , но срабатывает только на "футболка".
Пробовал =ЕСЛИ(ПОИСК("футболка";A1);"Футболка"), но не знаю как добавить условия еще и для худи и свитшотов.
Простой 7 комментариев
Я бы использовал VBA-функцию. Это на порядок проще, и ничуть не менее эффективно. VBA лишнее, из пушки по воробьям, есть встроенные функции, которые это делают, задача простейшая, а VBA-код требует сохранения в другом формате для постоянного использования, и часто требует (в зависимости от настроек безопасности) активации пользователем при старте, иначе работать не будет.Ну вот например - сойдёт на время, пока John Smith, покажет, как эта простейшая задача решается встроенными функциями.
На листе - формула B1=get_category(A1) .
* обходится той же lookup-таблицей, читаемой из макроса, но тогда нужно переписать макрос
- excel с настройками по умолчанию задолбает криками "там vba! там леший бродит! разрешить?"
- сохранять придется в xlsm
Ну без этого никуда. Впрочем, ничто не мешает подписать макрос и избавиться от первой проблемы. А второе так и вовсе не проблема.
Макрос загрузки элементарно изменяется со статически прописанного в коде списка на загрузку с листа. Или можно завести текстовую константу со списком в CSV и распарсить его в массив.
если у вас есть проблема, и вы собираетесь решать ее с использованием регулярных выражений, то у вас есть две проблемы
Пробовал =IFS(ПОИСК("футболка";A1); "Футболка"; ПОИСК("худи";A1); "Худи") , но срабатывает только на "футболка".
У вас две проблемы. Вы смешиваете русские и английские названия функций, Excel так не умеет (если вы действительно делаете так именно в таблице, а не в описании задачи).
Второе. Футболка у вас работает потому, что это первое условие. Как только начинает обрабатываться другая ячейка, поиск футболки, происходящий первым, выдает ошибку, и формула также выдает ошибку. Нужно обернуть поиск в функцию iferror, которая будет исключать вывод ошибки. Например, так:
- старомодно вложенными IF-ами, хоть это и жесть:
-новомодными IFS-ами, лучше, хоть тоже не айс:
Естественно, использовать функции следует на том языке, какой у вас стоит, иначе тоже будет ошибка. Также нужно учитывать используемый в системе разделитель списков (; или ,).
Вместо IFERROR можно использовать в качестве обертки ISNUMBER.
Приведенные примеры неоптимальны, расширение списка проверок требует переписывания формулы каждый раз, количество вложенных проверок лимитированно, и, наверняка, это неоптимально с точки зрения вычислительных ресурсов. Лучше использовать Index-Match и список категорий, как-то так:
Мне нужно что-то вроде: if cells(1,1).value содержит слово 'форум'.
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
Проверка на совпадение + проверка строки на содержание спец. символов
В общем ситуация такая: есть типизированный файл, форма для добавления пользователей (которые.
Создать макрос для переноса примечания ячейки в содержание
Пусть на листе 1 в таблице 2х2 заполнены разным содержимым 4 ячейки и две из них с примечанием.
Проверка на содержание строки
Здесь проверяем на наличие букв a и b (10 и 11 соответственно). Если задавать строку s сразу в.
Проверка QListWidget на содержание
Подскажите, как можно проверить QListWidget на наличие в нем item'ов, Т.е. пустой он или нет?
Подскажите, как в данном случае правильно использовать оператор "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() - тоже строковая фукция. И буквально на следующий день. Поэтому и Вам передаю его совет. Все-таки лучьше застраховаться и писать в функции следующим образом (или что-то подобное):
Я пытаюсь написать макрос, в котором, если есть ячейка со словом «ИТОГО», он будет вводить тире в ячейку под ней. Например:
В приведенном выше случае я хотел бы поставить тире в ячейку 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", тогда она будет вводить тире в ячейке под ней. Например:
В вышеприведенном случае мне нужна тире в ячейке 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
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу "омпьюте", "пьюте" слово компьютер а по запросу "ком" слова компьютер и ком"
Читайте также: