Excel макрос поиск текста в ячейке

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

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

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

Sheets("Данные").Select
For y = 1 To Cells.SpecialCells(xlLastCell).Row
    If Cells(y, 1) = "123" Then
        Exit For
    End If
Next y
MsgBox "Нашел в строке: " + CStr(y)

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

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

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

Sheets("Данные").Select
Set fcell = Columns("A:A").Find("123")
If Not fcell Is Nothing Then
    MsgBox "Нашел в строке: " + CStr(fcell.Row)
End If

Вкратце опишу что делают строчки данного кода:
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»

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", LookIn:=xlValues)
  Do While Not c Is Nothing
    c.Value = "qwe"
    Set c = .FindNext(c)
  Loop
End With

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

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

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .Find("asd", After:=c, lookin:=xlValues)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

lLastRow = Cells.SpecialCells(xlLastCell).Row
lLastCol = Cells.SpecialCells(xlLastCell).Column
Application.FindFormat.Font.Italic = True
With Worksheets(1).Range(Cells(1, 1), Cells(lLastRow, lLastCol))
  Set c = .Find("", SearchFormat:=True)
  Do While Not c Is Nothing
    c.Font.Italic = False
    Set c = .Find("", After:=c, SearchFormat:=True)
  Loop
End With

Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

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

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

With Application.FindFormat.Font 
  .Name = "Arial" 
  .FontStyle = "Regular" 
  .Size = 10 
End With

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

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

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

Set c = Worksheets(1).UsedRange.Find("*", SearchDirection:=xlPrevious)
If Not c Is Nothing Then
  lLastRow = c.Row: lLastCol = c.Column 
Else
  lLastRow = 1: lLastCol = 1
End If
MsgBox "lLastRow=" & lLastRow & " lLastCol=" & lLastCol

В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

Поиск по шаблону (маске)

При поиске можно так же использовать шаблоны, чтобы найти текст по маске, следующий пример это демонстрирует.

Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

With Worksheets(1).Cells
  Set c = .Find("т??т*", LookIn:=xlValues, LookAt:=xlWhole)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Color = RGB(255, 0, 0)
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

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

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

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

  • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
  • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

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

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

d = Date
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

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

d = #3/1/2018#
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

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

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

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

d = #3/1/1900#
Set c = Cells.Find(Format(d, "m/d/"), LookIn:=xlFormulas, LookAt:=xlPart)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

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

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

Параметры метода Range.Find

Наименование Описание
Обязательный параметр
What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant.
Необязательные параметры
After Ячейка, после которой следует начать поиск.
LookIn Уточняет область поиска. Список констант xlFindLookIn:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
  • ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.

В примерах используются переменные:

  • myPhrase – переменная для записи поисковой фразы;
  • myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

Set myCell = Range(«A1:L30»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

MsgBox «Строка найденной ячейки: « & myCell.Row

MsgBox «Столбец найденной ячейки: « & myCell.Column

MsgBox «Адрес найденной ячейки: « & myCell.Address

Else

MsgBox «Искомая фраза не найдена»

End If

End Sub

В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан". Затем проводим поиск этой фразы в диапазоне "A1:L30" с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.

Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30" есть ячейка со строкой, содержащей подстроку "стакан", и когда такой ячейки нет.

Пример 2

Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

Set myCell = Rows(1).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

Else: MsgBox «Искомая фраза не найдена»

End If

End Sub

Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15, и 129526,15, и 526,15254. То есть, как и в предыдущем примере, поиск идет по подстроке.

Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:

Set myCell = Rows(1).Find(myPhrase, , , xlWhole)

Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.

Пример 3

Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

Set myCell = Range(«A:A»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Номер начальной строки: « & myCell.Row

Else: MsgBox «Даты « & myPhrase & » в таблице нет»

End If

End Sub

Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.

Поиск и подсветка результатов в Excel

Макрос запрашивает строку для поиска, после чего ищет введенный текст в первом столбце листа, и подсвечивает результаты поиска.

При запуске макроса появляется диалоговое окно (InputBox), позволяющее задать текст для поиска.

Макрос подсвечивает красным цветом внутри ячейки текст, совпадающий с искомым
(+ выделяет найденное полужирным начертанием)

Перед началом поиска, цвет всех ячеек первого столбца сбрасывается (на черный)

Option Compare Text
 
Sub Find_n_Highlight()
    On Error Resume Next: Err.Clear
    Dim ra As Range, cell As Range, res, txt$, v, pos&
    res = InputBox("Введите текст, который необходимо подсветить в таблице", "Поиск и подсветка текста", "диз")
    If VarType(res) = vbBoolean Then Exit Sub    ' нажата кнопка ОТМЕНА
    txt$ = Trim(res): If Len(txt) = 0 Then Exit Sub    ' текст не введен, или состоит из пробелов

    Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp))    ' диапазон для поиска
    Application.ScreenUpdating = False
    ra.Font.Color = 0: ra.Font.Bold = 0  ' сброс цветового выделения

    For Each cell In ra.Cells    ' перебираем все ячейки
        pos = 1
        If cell.Text Like "*" & txt & "*" Then
            arr = Split(cell.Text, txt, , vbTextCompare)   ' разбивает текст ячейки на части
            If UBound(arr) > 0 Then    ' если подстрока найдена
                For Each v In arr    ' перебираем все вхождения
                    pos = pos + Len(v)    ' начальная позиция
                    With cell.Characters(pos, Len(txt))
                        .Font.ColorIndex = 3    ' выделяем цветом
                        .Font.Bold = True    ' и полужирным начертанием
                    End With
                    pos = pos + Len(txt)
                Next v
            End If
        End If
    Next cell
End Sub
  • 95128 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

  1. Image titled Use "Find" in Excel VBA Macros Step 1

    1

    Learn the following key concepts of the FIND command:

    • The syntax of .Find is:
      • expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
      • Expression (Required): is any valid range Object. So if we take an example then the range would be Range(“A1:A” & lastRow) where lastRow has been DIMensioned as type long and there is a statement: lastRow = oSht.Range(«A» & Rows.Count).End(xlUp).Row (or something similar) preceding its use in the .Find required expression.
      • What (Optional Variant): is the “Search value”
      • After (Optional Variant): The cell after which you want the search to begin.
      • LookIn (Optional Variant): The type of information. (xlValues or xlFormulas)
      • LookAt (Optional Variant): Can be one of the following XlLookAt constants: xlWhole or xlPart.
      • SearchOrder (Optional Variant): Can be one of the following #** XlSearchOrder constants: xlByRows or xlByColumns.
      • SearchDirection: Can be one of these XlSearchDirection constants. xlNext default xlPrevious
      • MatchCase (Optional Variant): True to make the search case sensitive. The default value is False.
      • MatchByte (Optional Variant): Used only if you’ve selected or installed double-byte language support. True to have double-byte characters match only double-byte characters. False to have double-byte characters match their single-byte equivalents.
      • SearchFormat (Optional Variant): The search format.
  2. Image titled Use "Find" in Excel VBA Macros Step 2

    2

    You can adapt the following code to your own uses by copying it (down to where it says #** End Sub) in Advanced Editing and pasting it to a word processor and doing a REPLACE ALL for «#** » (w/o the quotes but with the trailing space please). Then in Excel Preferences, set the Ribbon Developer status to Checked or On so you can work with macros. On the Ribbon, click on Developer, and then the Record icon and just click in cell A1 and then do Stop Recording (of your dummy macro). Click on the Editor icon button and copy your REPLACE(d) ALL text from your word processor from here right over the macro, and save the workbook.

    Advertisement

  3. Image titled Use "Find" in Excel VBA Macros Step 3

    3

    Open a new Excel workbook. Save the workbook as «Overall Status» and Sheet1 as «Article Views and Other».

  4. Image titled Use "Find" in Excel VBA Macros Step 4

    4

    In your browser, go to https://www.wikihow.com/User:Chris-Garthwaite and do (View More) under Articles Started, and select just to the left of the first top one down to just to the right of the bottom one’s Views, and copy it. Make sure you don’t get any excess info, just the articles and number of views. Then paste that data into the «Article Views and Other» worksheet at cell C17. Then, in your browser, go to https://www.wikihow.com/User:Xhohx and copy all 100 expanded (View More) Articles and Views from there too please, and paste those in the cell right below the ones you did before.

  5. Image titled Use "Find" in Excel VBA Macros Step 5

    5

    Then. on your toolbar, choose Macros, Macros, and Run the following pasted-in REPLACE(d) ALL macro to test it.

      • Sub Macro2_FindArticle()
      • ‘ Finds an Article String, returns cell address and goes to Article cell
      • ‘ Macro2_FindArticle Macro
      • Dim oSht As Worksheet
      • Dim StrFinder As String
      • Dim lastRow As Range
      • Dim aCell As Range
      • Set oSht = Sheets(«Article Views and Other»)
      • Set lastRow = ActiveWorkbook.Sheets(«Article Views and Other»).Range(«C17:C217»)
      • Application.ScreenUpdating = True
      • Do Until StrFinder <> «»
      • StrFinder = Application.InputBox _
      • (Prompt:=»Article Name or string to search for: «, _
      • Title:=»Article Search», _
      • Type:=2)
      • Set aCell = lastRow.Find(What:=StrFinder, LookIn:=xlValues, _
      • LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      • MatchCase:=False)
      • If Not aCell Is Nothing Then
      • MsgBox «Value Found in Cell » & aCell.Address
      • End If
      • aCell.Select
      • Application.ScreenUpdating = False
      • Exit Sub
      • Loop
      • End Sub
      • You should have a list of articles something like this redacted image, probably without the colored background.
  6. Image titled Use "Find" in Excel VBA Macros Step 6

    6

    Note that if you were to use Excel’s menu-driven Find command, it would return in the upper left corner (to the left of the formula bar) the cell reference it found, if any, for the string you searched on in the given range of cells, but you would have to hit the right arrow and left arrow (or some such combination) to select the actual cell as the sole ActiveCell I believe. At least, that’s how Excel functions in this author’s experience — not obviously high lighting the cell for me or obviously selecting it, as it used to do in older versions of Excel.

  7. Image titled Use "Find" in Excel VBA Macros Step 7

    7

    Note that the underline used at the right end of code lines is to extend the line to the next line down, so the next line is in fact part of the entire sub-procedure or expression.

  8. Image titled Use "Find" in Excel VBA Macros Step 8

    8

    You can easily adapt this code by changing the sheet name reference and the cell range reference, and if it’s not an Article you’re searching for, you can certainly change that everywhere as well.

  9. Image titled Use "Find" in Excel VBA Macros Step 9

    9

    Here are two more macros that work together to update Related wikiHows:

      • Sub Macro10()
      • ‘ Macro10 Macro
      • ‘ Keyboard Shortcut: Option+Cmd+n
      • Windows(«OVERALL STATUS.xlsm»).Activate
      • Sheets(«Relateds»).Select
      • Application.Goto Reference:=»TopRow»
      • Application.CutCopyMode = False
      • Selection.Delete Shift:=xlUp
      • ActiveWorkbook.Names.Add Name:=»TopRow», RefersToR1C1:=»=Relateds!R166″
      • Range(«B166»).Select
      • Selection.Copy
      • Application.Goto Reference:=»Searcher»
      • ‘ Searcher is a Defined Name Variable comprised of the Article Names
      • ‘ and Views pasted AS TRANSPOSED from rows TO COLUMNS in row 1.
      • Macro3_FindRelated
      • End Sub
      • Sub Macro3_FindRelated()
      • ‘ Finds a Related wikiHow String and goes to Article cell,
      • ‘ where User then Arrow keys down and inputs a 1,
      • ‘ indicating that that Columnar Article is a Related for the Row Article.
      • ‘ There are both row totals and columnar totals to keep track of Total Relateds/Article
      • ‘ and how many Articles the Columnar Article is a Related for.
      • ‘ Uses the Named Variable Range, «Searcher», on the worksheet «Relateds» as a Range Object
      • ‘ Macro3_FindRelated Macro
      • Dim oSht As Worksheet
      • Dim StrFinder As String
      • Dim aCell As Range
      • Dim rng As Range
      • Set oSht = Sheets(«Relateds»)
      • Windows(«OVERALL STATUS.xlsm»).Activate
      • Sheets(«Relateds»).Select
      • Set rng = Worksheets(«Relateds»).Range(«Searcher»)
      • Application.ScreenUpdating = True
      • Do Until StrFinder <> «»
      • StrFinder = Application.InputBox _
      • (Prompt:=»Article Name or string to search for: «, _
      • Title:=»Article Search», _
      • Type:=2)
      • Set aCell = rng.Find(What:=StrFinder, LookIn:=xlValues, _
      • LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      • MatchCase:=False)
      • aCell.Select
      • Application.ScreenUpdating = False
      • Exit Sub
      • Loop
      • End Sub
      • In cell H1 is xxxxxxxxxxxxxxxxxx and I1 is blank. From J1 to ET1 are the Article Titles and in EU1 is Other — a reconciling account rarely used. From J4 to EW4 are the Article views and their Total. From J6 to ET6 are the Article#s from 141 down to 1 (most recent at far left, oldest at far right). All of that was pasted as Transposed from cell range B10:G153.
      • In cell A166 is [xxxxxxxxxxxxxxxxxxx| and that is copied far down below, as it gets deleted with continued usage.
      • In cell B166 is the formula =IF(ISERR(MID(A166,D166+2,(E166-D166)-2)),»»,MID(A166,D166+2,(E166-D166)-2)) which returns the value, xxxxxxxxxxxxxxxxxx.
      • In cell D166 is the formula =IF(ISERR(FIND(«[«,A166)),»»,FIND(«[«,A166)), which returns the value of 1.
      • In cell E166 is the formula =IF(ISERR(FIND(«|»,A166)),»»,FIND(«|»,A166)), which returns 21.
      • In cell A9 is the formula =»*[[«&B9&»|How to «&B9&»]]»
      • When the formula in A9 is copied to A10, and the Article Name Find the Diagonal of a Square Using Its Area is in B10, A10 returns the value, *[[Find the Diagonal of a Square Using Its Area|How to Find the Diagonal of a Square Using Its Area]]
      • Whether copied from the first sheet in the workbook, Article Views and Other, or from this sheet, Relateds, these ready-to-become-Related formatted entries in column A are then pasted, if they’re appropriate How-To’s for the article being updated, to cell B167 and below before the following macro is run and command v pasting is done into the InputBox to locate the Article in the top Searcher area to arrow key down and update the proper row (Article) with a 1 to.
  10. Advertisement

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • The Type:=2 code in the Application.InputBox section means that it is a string. Type 0 is a formula; type 1 is a number; type 4 is a logical value (True or False); type 8 is a cell reference, as a range object; type 16 is an error value, such as #N/A; and type 64 is an array of values.

Thanks for submitting a tip for review!

Advertisement

References

About This Article

Thanks to all authors for creating a page that has been read 51,615 times.

Is this article up to date?

3 / 3 / 1

Регистрация: 28.09.2015

Сообщений: 271

1

Поиск текста с выводом адреса ячейки

07.09.2017, 20:01. Показов 3898. Ответов 13


Студворк — интернет-сервис помощи студентам

Добрый вечер, специалисты по экселю.
Помогите разобраться с проблемой.

В книге несколько листов.
На листах 1,2,3,4 в некоторых ячейках находится текст.
На листе «Поиск» — находится столбец C5:C17 — в котором вписаны слова, по которым я хочу осуществить поиск.

Как макросом — провести поиск ключевых слов по листам 1,2,3,4 и вывести найденный текст — в третью строку листа «Поиск» — с выводом адреса ячейки, в которой был найден этот текст ?



0



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

08.09.2017, 11:06

2

на листе один текст всегда в одном экземпляре?



0



3 / 3 / 1

Регистрация: 28.09.2015

Сообщений: 271

08.09.2017, 11:11

 [ТС]

3

Vlad999 , нет — может быть несколько ячеек с похожим текстом



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

08.09.2017, 11:22

4

для одного.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub vvv()
Dim Ws As Worksheet, i%, FR As Range, adr$, f$
For i = 5 To Cells(Rows.Count, 3).End(xlUp).Row
f = Cells(i, 3).Value
    For Each Ws In Sheets
    If Ws.Name <> "Поиск" Then
       Set FR = Ws.Cells.Find(f)
       If Not FR Is Nothing Then adr = adr & " " & Ws.Name & "!" & FR.Address
    End If
    Next
Cells(i, 5) = adr
adr = ""
Next
End Sub

для нескольких чуть позже. пока занят.



0



3 / 3 / 1

Регистрация: 28.09.2015

Сообщений: 271

08.09.2017, 12:26

 [ТС]

5

Vlad999 , ясно



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

08.09.2017, 12:43

6

yl3d, результат записывать в одну ячейку или один адрес — одна ячейка?

Добавлено через 6 минут
проверяйте

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub vvv()
Dim Ws As Worksheet, i%, FR As Range, adr$, f$, a$, ms()
For i = 5 To Cells(Rows.Count, 3).End(xlUp).Row
f = Cells(i, 3).Value
    For Each Ws In Sheets
    If Ws.Name <> "Поиск" Then
       Set FR = Ws.Cells.Find(f)
       If Not FR Is Nothing Then
          adr = adr & " " & Ws.Name & "!" & FR.Address
          '---цикл по следующим найденным ячейкам
          a = FR.Address '---запоминаем адрес первой найденной ячейки
          Do
            Set FR = Ws.Cells.FindNext(FR)
            If FR.Address = a Then Exit Do
            adr = adr & " " & Ws.Name & "!" & FR.Address
          Loop
          '-----------
        End If
    End If
    Next
'Cells(i, 5) = adr 'если в одну
'если один адрес - одна ячейка
ms = Split(Mid(adr, 2, 1000))
Cells(i, 5).Resize(, UBound(ms) + 1) = ms
'-------------------------
adr = ""
Next
End Sub



0



3 / 3 / 1

Регистрация: 28.09.2015

Сообщений: 271

08.09.2017, 13:16

 [ТС]

7

Vlad999 , один адрес- одна ячейка.

Добавлено через 29 минут
Vlad999 , не работает.
Выдает ошибку «run-time error ’13’: Type mistmatch»
и подсвечивает строку кода: ms = Split(Mid(adr, 2, 1000))



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

08.09.2017, 13:31

8

Лучший ответ Сообщение было отмечено yl3d как решение

Решение

1. уберите скобки у ms

Visual Basic
1
Dim ms

2. замените часть кода, это еще одна проверка если искомое не найдено.

Visual Basic
1
2
3
4
If adr <> "" Then
  ms = Split(Mid(adr, 2, 1000))
  Cells(i, 5).Resize(, UBound(ms) + 1) = ms
End If



1



3 / 3 / 1

Регистрация: 28.09.2015

Сообщений: 271

08.09.2017, 15:30

 [ТС]

9

Vlad999 , спасибо большое.
Все работает.



0



0 / 0 / 0

Регистрация: 22.02.2022

Сообщений: 3

25.02.2022, 13:06

10

Добрый день,

очень полезный макрос

подскажите пожалуйста как решить проблему, если макрос обрабатывает значение которого нет на листах, то он спотыкается, как этого избежать?



0



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

25.02.2022, 15:44

11

файл показываем, и что ищете в нем?



0



0 / 0 / 0

Регистрация: 22.02.2022

Сообщений: 3

25.02.2022, 15:57

12

я взял файл из этой темы, добавил все изменения и ввел в столбец с исходными данными новое значение, которое заведомо отсутствует, скрипт выдает ошибку на нем, файл с расширением .xlsm не дает загрузить

Добавлено через 2 минуты

Код

Sub vvv()
Dim Ws As Worksheet, i%, FR As Range, adr$, f$, a$, ms
For i = 5 To Cells(Rows.Count, 3).End(xlUp).Row
f = Cells(i, 3).Value
    For Each Ws In Sheets
    If Ws.Name <> "Search" Then
       Set FR = Ws.Cells.Find(f)
             If Not FR Is Nothing Then
          adr = adr & " " & Ws.Name & "!" & FR.Address
          '---
          a = FR.Address
          Do
            Set FR = Ws.Cells.FindNext(FR)
            If FR.Address = a Then Exit Do
            adr = adr & " " & Ws.Name & "!" & FR.Address
                        Loop
          '-----------
        
        End If
    End If
    Next
'Cells(i, 5) = adr 
ms = Split(Mid(adr, 2, 1000))
Cells(i, 5).Resize(, UBound(ms) + 1) = ms
'-------------------------
 adr = ""

Next
 If adr <> "" Then
  ms = Split(Mid(adr, 2, 1000))
  Cells(i, 5).Resize(, UBound(ms) + 1) = ms
End If
End Sub



0



0 / 0 / 0

Регистрация: 22.02.2022

Сообщений: 3

25.02.2022, 16:03

13

заменил .xlsm на .xls



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

25.02.2022, 16:59

14

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub vvv()
Dim Ws As Worksheet, i%, FR As Range, adr$, f$, a$, ms
For i = 5 To Cells(Rows.Count, 3).End(xlUp).Row
f = Cells(i, 3).Value
    For Each Ws In Sheets
    If Ws.Name <> "Search" Then
    Set FR = Ws.Cells.Find(f)
        If Not FR Is Nothing Then
              adr = adr & " " & Ws.Name & "!" & FR.Address
              a = FR.Address
            Do
                Set FR = Ws.Cells.FindNext(FR)
                If FR.Address = a Then Exit Do
                adr = adr & " " & Ws.Name & "!" & FR.Address
            Loop
        End If
    End If
Next
If adr <> "" Then
  ms = Split(Mid(adr, 2, 1000))
  Cells(i, 5).Resize(, UBound(ms) + 1) = ms
  adr = ""
End If
Next
End Sub



1



Поиск заданного текста в ячейках, с подсветкой найденных вхождений

·         Макросы VBA Excel

·         Работа с диапазонами ячеек и листами

·         Текстовые строки

·         Поиск в Excel

·         Ячейки Excel

·         текстовые строки

Макрос запрашивает строку для поиска, после чего ищет введенный текст в первом столбце листа, и подсвечивает результаты поиска.

При запуске макроса появляется диалоговое окно (InputBox), позволяющее задать текст для поиска.

Макрос подсвечивает красным цветом внутри ячейки текст, совпадающий с искомым
(+ выделяет найденное полужирным начертанием)

Перед началом поиска, цвет всех ячеек первого столбца сбрасывается (на черный)

Option Compare Text

Sub Find_n_Highlight()

    On Error Resume Next: Err.Clear

    Dim ra As Range, cell As Range, res, txt$, v, pos&

    res = InputBox(«Введите текст, который необходимо подсветить в таблице», «Поиск и подсветка текста», «диз»)

    If VarType(res) = vbBoolean Then Exit Sub    ‘ нажата кнопка ОТМЕНА

    txt$ = Trim(res): If Len(txt) = 0 Then Exit Sub    ‘ текст не введен, или состоит из пробелов

    Set ra = Range([A2], Range(«A» & Rows.Count).End(xlUp))    ‘ диапазон для поиска

    Application.ScreenUpdating = False

    ra.Font.Color = 0: ra.Font.Bold = 0  ‘ сброс цветового выделения

    For Each cell In ra.Cells    ‘ перебираем все ячейки

        pos = 1

        If cell.Text Like «*» & txt & «*» Then

            arr = Split(cell.Text, txt, , vbTextCompare)   ‘ разбивает текст ячейки на части

            If UBound(arr) > 0 Then    ‘ если подстрока найдена

                For Each v In arr    ‘ перебираем все вхождения

                    pos = pos + Len(v)    ‘ начальная позиция

                    With cell.Characters(pos, Len(txt))

                        .Font.ColorIndex = 3    ‘ выделяем цветом

                        .Font.Bold = True    ‘ и полужирным начертанием

                    End With

                    pos = pos + Len(txt)

                Next v

            End If

        End If

    Next cell

End Sub

Вложение

Размер

Загрузки

Последняя загрузка

HighlightText.zip

14.63 КБ

4

1 год 24 недели назад

·         33417 просмотров

Комментарии

Начало формы

Настройки просмотра комментариев

Плоский список — свёрнутый Плоский список — развёрнутый Древовидный — свёрнутый Древовидный — развёрнутый  

По дате — сначала новые По дате — сначала старые  

10 комментариев на страницу 30 комментариев на страницу 50 комментариев на страницу 70 комментариев на страницу 90 комментариев на страницу 150 комментариев на страницу 200 комментариев на страницу 250 комментариев на страницу 300 комментариев на страницу  

Выберите нужный метод показа комментариев и нажмите «Сохранить установки».

Конец формы

# 1Ответ администратора сайта , 13 Окт 2014 — 20:26.

Валерий, конечно я принимаю заказы.
На сайте ведь есть кнопка «Оформить заказ»…

·        ответить

# 2Валерий, 13 Окт 2014 — 18:55.

Еще заказы принимаете?

·         ответить

# 3Ответ администратора сайта , 5 Сен 2014 — 16:06.

Здравствуйте
Это совсем другой макрос нужен
Можно сделать под заказ (мы берем заказы на сумму от 1000 рублей)

·        ответить

# 4Гость, 5 Сен 2014 — 14:54.

Спасибо!
А не могли бы помочь как на основе(а можно и не на основе) этого кода сделать макрос такой.
Искать значения(слово) из столбца F( в нем искомое слово, строк множество пока не станет пусто) в столбце A(возможно несколько повторений искомого текста) и если находит, то брать значение соответствующей ячейки этой строки в столбце G(строка та же что и искомое слово) и подставлять в соответствующую ячейку B(правее ячейки из A). И зациклить пока все слова из F не будут найдены в A и подставлены значения из G.
Небольшая благодарность не заставит себя ждать :)

·         ответить

# 5Администратор сайта, 4 Фев 2014 — 22:58.

Здравствуйте, Влад.
Сделать можно все что угодно, — но только под заказ.
Потому что идей у пользователей много, а у меня свободного времени — намного меньше)

·         ответить

# 6Влад, 4 Фев 2014 — 14:06.

Хорошая задумка, но ещё было бы гибче работа в таком формате.
1. Было бы альтернативное окно, в котором можно ввести список (допустим до 1000 значений, либо без ограничений) для массовой подсветки.

2. Предусмотреть поиск не по частичному совпадению, а полному. Например, в массиве указано отчество ВИКТОРОВИЧ, а ищем ВИКТОР. Следовательно, если ВИКТОР не найден, тогда отчество остается не подсвеченным.

Мысли вслух.

·         ответить

# 7Гость, 11 Янв 2014 — 14:52.

Хотел отблагодарить, но не вижу как. Дайте кошелек пожалуйста.

·         ответить

# 8Гость, 11 Янв 2014 — 14:39.

Вывел в виде кнопок на ленту: поиск по А — сброс, поиск по В — сброс.
Для работы с сем. ядром для сайта — самое то. Спасибо огромное!

·         ответить

# 9Ответ администратора сайта , 11 Янв 2014 — 14:36.

Можно и так сделать. Любой каприз за ваши деньги)

·        ответить

# 10Гость, 11 Янв 2014 — 14:20.

Вот было бы супер, если бы окошко не пряталось, и в нем была кнопка «сбросить подсветку»

·         ответить

# 11Ответ администратора сайта , 11 Янв 2014 — 14:17.

Сброс подсветки выполняется легко, — достаточно выделить первый столбец, поставить «цвет текста» = автоматически, и отжать кнопку «Ж»

В виде макроса (для первого столбца) это будет выглядеть так:

Sub СнятьПодсветку()

    Range(«a:a»).Font.Bold = False

    Range(«a:a»).Font.ColorIndex = xlColorIndexAutomatic

End Sub

·        ответить

# 12Гость, 11 Янв 2014 — 14:11.

Класс! Спасибо большое!
Хорошо бы еще макрос, который будет сбрасывать подсветку.

·         ответить

# 13Ответ администратора сайта , 1 Май 2013 — 12:57.

Макрос ищет и подсвечивает искомый текст только в первом столбце
(в диапазоне ячеек с A2 до последней заполненной ячейки в столбце A)
А у вас, возможно, данные в другом столбце расположены.

·        ответить

# 14Гость, 1 Май 2013 — 11:27.

Скопировал код, вставил, при запуске макроса вылезает окно поиска, но сам поиск не происходит и ничего не подсвечивается. Не пойму в чем проблема.

·         ответить

# 15ipumov1, 21 Янв 2013 — 18:48.

То что нужно. Спасибо большое!
PS только почему то мою тему на планете эксель удалили.

·         ответить

Отправить комментарий

Хитрости »

4 Январь 2016              119564 просмотров


Найти в ячейке любое слово из списка

Предположим, вы получаете от поставщика/заказчика/клиента заполненную таблицу с перечнем продукции:
Таблица заказа
и эту таблицу необходимо сравнить с артикулами/кодами товара в имеющемся у вас каталоге продукции:
Таблица артикулов
Как видно — в нашем каталоге только артикулы без наименований. У заказчика же помимо артикулов еще и название товара, т.е. много лишнего. И вам надо понять какие товары присутствуют в вашем каталоге, а какие нет:
Что получить
Стандартных формул в Excel для подобного поиска и сравнения нет. Конечно, можно попробовать применить ВПР с подстановочными символами сначала к одной таблице, а затем к другой. Но если подобную операцию необходимо проделывать раз за разом, то прописывать по несколько формул к каждой таблице прямо скажем — не комильфо.
Поэтому я и решил сегодня продемонстрировать формулу, которая без всяких доп. манипуляций поможет такое сравнение сделать. Чтобы разобраться самостоятельно рекомендую скачать файл:
Скачать файл:

  Tips_All_AnyoneOfArray.xls (49,5 KiB, 25 670 скачиваний)

На листе «Заказ» в этом файле таблица, полученная от заказчика, а на листе «Каталог» наши артикулы.
Сама формула на примере файла будет выглядеть так:

=ПРОСМОТР(2;1/ПОИСК(Каталог!$A$2:$A$11;A2);Каталог!$A$2:$A$11)
=LOOKUP(2,1/SEARCH(Каталог!$A$2:$A$11,A2),Каталог!$A$2:$A$11)

эта формула вернет название артикула, если в тексте есть хоть один артикул из каталога и

#Н/Д(#N/A)

если артикул не найден в каталоге.
Прежде чем облагородить эту формулу всякими дополнениями(вроде виде убирания ненужных

#Н/Д(#N/A)

) давайте разберемся как она работает.
Кратко о принципе работы функция

ПРОСМОТР(LOOKUP)

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

  1. Она ищет не обязательно именно точное совпадение с искомым, а максимально приближенное к нему. Если точнее — равное или большее искомому.
  2. Функция ПРОСМОТР(LOOKUP) старается преобразовать непосредственно в массив любое выражение, записанное вторым аргументом.
  3. Этими особенностями мы и будем пользоваться.

Как уже упомянул выше — в качестве диапазона для поиска значения обычно приводится массив ячеек, но т.к. функция ПРОСМОТР(LOOKUP) старается преобразовать непосредственно в массив любое выражение — она вычисляет данное ей выражение 1/ПОИСК(Каталог!$A$2:$A$11;A2), работая в итоге с результатами этого вычисления.
Само же выражение работает следующим образом: ПОИСК(Каталог!$A$2:$A$11;A2) ищет поочередно каждое значение из списка Каталога в ячейке A2(в наименовании артикула из таблицы Заказчика). Если значение найдено, то возвращается номер позиции первого символа найденного значения(т.е. какое-то число). Если значение не найдено — возвращается значение ошибки #ЗНАЧ!(#VALUE!). Т.е. получается следующий массив: {55:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!}
По идее, после того, как функция ПРОСМОТР(LOOKUP) вычислит это выражение, она будет последовательно просматривать результаты функции ПОИСК(SEARCH) в поисках заданного нами искомого значения, пока не найдет значение максимально близкое к искомому(оптимально равное или чуть больше него). Но т.к. функция ПОИСК(SEARCH) может вернуть неизвестно какие по величине значения, мы, чтобы не гадать и не думать над тем, какое число задать для поиска, сначала единицу делим на выражение ПОИСК(Каталог!$A$2:$A$11;A2), чтобы получить массив вида:{0,0181818181818182:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!}
А в качестве искомого значения мы подсовываем функции ПРОСМОТР(LOOKUP) число 2 — т.е. заведомо большее число, чем может вообще встретиться в массиве(т.к. единица, поделенная на любое число будет меньше двух), чем заставляем её найти последнее подходящее совпадение из каталога(т.е. последнее не ошибочное значение). После этого функция ПРОСМОТР(LOOKUP) запомнит эту позицию и вернет значение из массива Каталог!$A$2:$A$11(третий аргумент), записанное в этом массиве для этой позиции.
Вы можете просмотреть этапы вычисления функции самостоятельно для каждой ячейки, я здесь просто приведу этапы чуть в расширенном для понимания виде:

  1. =ПРОСМОТР(2;1/ПОИСК(Каталог!$A$2:$A$11;A2);Каталог!$A$2:$A$11)
  2. =ПРОСМОТР(2;
    1/{55:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!};
    Каталог!$A$2:$A$11)
  3. =ПРОСМОТР(2;{0,0181818181818182:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!:#ЗНАЧ!};Каталог!$A$2:$A$11)
  4. =ПРОСМОТР(2;
    1;
    {«FM2-3320″:»CV455689″:»Q5949X»:»CE321A»:»CE322A»:»CE323A»:»00064073″:»CX292708″:»CX292709″:»CX292710″})
  5. =»FM2-3320″

Теперь немного облагородим функцию и сделаем еще пару реализаций
Реализация 1:
Вместо артикулов и #Н/Д(#N/A) выведем для найденных позиций «Есть», а для отсутствующих «Не найден в каталоге»:
=ЕСЛИ(ЕНД(ПРОСМОТР(2;1/ПОИСК(Каталог!$A$2:$A$11;A2)));»Не найден в каталоге»;»Есть»)
=IF(ISNA(LOOKUP(2,1/SEARCH(Каталог!$A$2:$A$11,A2))),»Не найден в каталоге»,»Есть»)
работа функции проста — с ПРОСМОТР(LOOKUP) разобрались, поэтому остались только ЕНД и ЕСЛИ.
ЕНД(ISNA) проверяет вложенное в неё выражение на предмет ошибки #Н/Д(#N/A). Если ошибка есть — ЕНД возвращает ИСТИНА(TRUE), а если ошибки нет — ЛОЖЬ(FALSE).
ЕСЛИ(IF) проверяет выражение из первого аргумента на выполнение. Если выражение выполняется(т.е. оно равно ИСТИНА(TRUE)), то функция запишет значение из второго аргумента(«Не найден в каталоге»). А если не выполняется(ЛОЖЬ(FALSE)) — то значение из третьего(«Есть»).
Т.е. все вместе получается: если наша основная функция возвращает значение ошибки #Н/Д(#N/A), то мы записываем в ячейку «Не найден в каталоге», в противном случае — «Есть».

Реализация 2:
Вместо #Н/Д выведем «Не найден в каталоге», но при этом если артикулы найдены — выведем названия этих артикулов:
=ЕСЛИОШИБКА(ПРОСМОТР(2;1/ПОИСК(Каталог!$A$2:$A$11;A2);Каталог!$A$2:$A$11);»Нет в каталоге»)
=IFERROR(LOOKUP(2,1/SEARCH(Каталог!$A$2:$A$11,A2),Каталог!$A$2:$A$11),»Нет в каталоге»)
Про функция ЕСЛИОШИБКА(IFERROR) я подробно рассказывал в этой статье: Как в ячейке с формулой вместо ошибки показать 0.
Если вкратце, то функция проверяет выражение, записанное первым аргументом(наша основная функция). Если в итоге получаем любую ошибку, то ЕСЛИОШИБКА запишет значение из второго аргумента(в нашем случае это текст «Не найден в каталоге»). Если же выражение(проверяемая функция) не возвращает ошибку, то функция ЕСЛИОШИБКА запишет именно то значение, которое было получено проверяемой функцией(в нашем случае это будет наименование артикула).

Реализация 3
Надо не просто определить какому артикулу соответствует, но и вывести цену для наименования по этому артикулу(сами цены должны быть расположены в столбце B листа Каталог):
=ЕСЛИОШИБКА(ПРОСМОТР(2;1/ПОИСК(Каталог!$A$2:$A$11;A2);Каталог!$B$2:$B$11);»»)
=IFERROR(LOOKUP(2,1/SEARCH(Каталог!$A$2:$A$11,A2),Каталог!$B$2:$B$11),»»)


Пара важных замечаний:

  • данные на листе с артикулами не должны содержать пустых ячеек. Иначе с большой долей вероятности формула будет возвращать значение именно пустой ячейки, а не то, которое подходит под условия поиска
  • формула осуществляет поиск таким образом, что ищется любое совпадение. Например, в качестве артикула записана цифра 1, а в строке наименований может встречаться помимо целой 1 еще и 123, 651123, FG1412NM и т.п. Для всех этих наименований может быть подобран артикул 1, т.к. он содержится в каждом наименовании. Как правило это может произойти, если артикул 1 расположен в конце списка

Поэтому желательно перед использованием формулы отсортировать список по возрастанию(от меньшего к большему, от А до Я).

В приложенном в начале статьи примере вы найдете все разобранные варианты.

Если же вам понадобится выводить все наименования, то можно воспользоваться функцией СОДЕРЖИТ_ОДНО_ИЗ из моей надстройки MulTEx.

Так же см.:
Сравнение текста по части предложения
Что такое формула массива
Как найти значение в другой таблице или сила ВПР
ВПР с поиском по нескольким листам


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Понравилась статья? Поделить с друзьями:
  • Excel макрос поиск по строкам
  • Excel макрос поиск по всем листам
  • Excel макрос поиск копирование
  • Excel макрос поиск значения в ячейках
  • Excel макрос поиск замена если нет поиск