Поиск значения в столбце макросом 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

А если будет 2 и более одинаковых значений, какую строку он выделит?  

  {quote}{login=}{date=07.12.2011 09:59}{thema=}{post}Sub Test()  
Dim Rng As Range, iVal As Variant ‘объявляем 2 переменные  

     iVal = Sheets(«Лист1»).Range(«A1») ‘запоминаем значение из ячейка А1 листа Лист1  
   Set Rng = Sheets(«Лист2»).Columns(1).Find(iVal, , xlFormulas, xlWhole) ‘осуществляем поиск. Вместо xlWhole, можно использовать xlPart  
   If Rng Is Nothing Then ‘если ничего не нашли, то выводим сообщение  
       MsgBox «Значение » & iVal & » не найдено в столбце А на Лист2″, vbExclamation, «Ошибка»  
       Exit Sub  
   End If  
   ‘если нашли, то  
   Sheets(«Лист2»).Activate ‘активируем Лист2  
   Rng.Select ‘выделяем ячейку с найденным значением  
End Sub{/post}{/quote}

  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,699 times.

Is this article up to date?

Метод 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

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

ghebog

4 / 4 / 1

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

Сообщений: 67

1

Поиск по столбцу

02.04.2013, 13:33. Показов 38099. Ответов 10

Метки нет (Все метки)


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

Всем привет!
Тема уже избитая, но все равно я не нашел ответа на вопрос.

На таблице есть два столбца. В первом данные, во втором вычисления(формулы).
Нужно найти значение в столбце при помощи Find(What…).
Поиск по первому столбцу работает, а по второму выдает ошибку.
Как организовать поиск по второму столбцу?

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

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
Private Sub CommandButton1_Click()
'Поиск по первому столбцу
    Dim iRange As Range
    Dim iFind As String
    Dim iRow As Integer
    iFind = Worksheets("Лист1").Cells(3, 1).Value
    Set iRange = Worksheets("Лист1").Columns("A:A").Find(What:=iFind)
    iRow = iRange.Row
    
'Поиск по второму столбцу
    Dim iRange0 As Range
    Dim iFind0 As String
    Dim iRow0 As Integer
    iFind0 = Worksheets("Лист1").Cells(3, 2).Value
    Set iRange0 = Worksheets("Лист1").Columns("B:B").Find(What:=iFind0)
    iRow0 = iRange0.Row
    
'Проверка
    MsgBox ("iFind= " & iFind & Chr(13) & _
            "iRow= " & iRow & Chr(13) & Chr(13) & _
            "iFind0= " & iFind0 & Chr(13) & _
            "iRow0= " & iRow0)
    
End Sub

Вложения

Тип файла: xls Поиск.xls (40.5 Кб, 151 просмотров)



0



IvanOK

693 / 99 / 10

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

Сообщений: 718

02.04.2013, 14:00

2

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
Private Sub CommandButton1_Click()
'1-й Блок
    Dim iRange As Range
    Dim iFind As String
    Dim iRow As Integer
    iFind = Worksheets("Лист1").Cells(3, 1).Value
    Set iRange = Worksheets("Лист1").Columns("A:A").Find(What:=iFind, LookIn:=xlValues)
    iRow = iRange.Row
    
'2-й Блок
    Dim iRange0 As Range
    Dim iFind0 As String
    Dim iRow0 As Integer
    iFind0 = Worksheets("Лист1").Cells(3, 2).Value
    Set iRange0 = Worksheets("Лист1").Columns("B:B").Find(What:=iFind0, LookIn:=xlValues)
    iRow0 = iRange0.Row
    
'Проверка
    MsgBox ("iFind= " & iFind & Chr(13) & _
            "iRow= " & iRow & Chr(13) & Chr(13) & _
            "iFind0= " & iFind0 & Chr(13) & _
            "iRow0= " & iRow0)
    
End Sub

ты ищещь по умолчанию , а ето значит по формулам, а нужно искать по значению



1



4 / 4 / 1

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

Сообщений: 67

02.04.2013, 14:09

 [ТС]

3

Цитата
Сообщение от IvanOK
Посмотреть сообщение

ты ищещь по умолчанию , а ето значит по формулам, а нужно искать по значению

Спасибо, помогло!

Не по теме:

Пинок в зад — отличный повод для шага вперед.



0



5468 / 1148 / 50

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

Сообщений: 3,514

02.04.2013, 14:20

4

VBA-Excel-команда «Find» связана с окном «Найти и заменить» в программе «Excel».
Поэтому в команде «Find» нужно указывать все парметры (я обычно не указываю параметр «After»), чтобы на работу кода не влияли настройки окна «Найти и заменить».



2



4 / 4 / 1

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

Сообщений: 67

02.04.2013, 14:46

 [ТС]

5

Цитата
Сообщение от Скрипт
Посмотреть сообщение

VBA-Excel-команда «Find» связана с окном «Найти и заменить» в программе «Excel».
Поэтому в команде «Find» нужно указывать все парметры (я обычно не указываю параметр «After»), чтобы на работу кода не влияли настройки окна «Найти и заменить».

В моем случае помогло только добавление LookIn:=xlValues.
По любому спасибо за дополнение.



0



5468 / 1148 / 50

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

Сообщений: 3,514

02.04.2013, 14:50

6

Цитата
Сообщение от ghebog
Посмотреть сообщение

В моем случае помогло только добавление LookIn:=xlValues.

ghebog, потому что в окне «Найти и заменить» было всё то, что вам нужно.



0



ghebog

4 / 4 / 1

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

Сообщений: 67

12.04.2013, 12:02

 [ТС]

7

Всем привет!
Задача такая:
В столбце «А» — имена, в столбце «В» — номера.
В ячейке «В1» вводится искомое значение и по нажатию кнопки ведется поиск на наличие в диапазоне
Range(«B3:B» & Cells(Rows.Count, «B»).End(xlUp).Row).

Если значение найдено — выводится сообщение со значением из первого столбца той же строки.

Это получается.

Если значение не найдено — оно (значение) добавляется в последнюю ячейку столбца «В».

Это не получается.

Подтолкните в нужное направление.
Заранее благодарен.

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

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
Private Sub CommandButton1_Click()
    Dim whereImLooking As Range
    Set whereImLooking = Worksheets("Ëèñò1").Range("B3:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    
    Dim iLookingFor As String
    iLookingFor = Worksheets("Ëèñò1").Cells(1, 2).Value
    
    Dim iRowErr As Integer
    
    If iLookingFor = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False) Then
        iRowErr = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False).Row
        MsgBox "Óæå åñòü !" & Chr(13) & Chr(13) & "Âîò æå îíî :)" & Chr(13) & _
            (Worksheets("Ëèñò1").Cells(iRowErr, 1).Value), vbCritical, "ÂÍÈÌÀÍÈÅ"
            Worksheets("Ëèñò1").Cells(iRowErr, 1).Select
        Exit Sub
    Else
        Worksheets("Ëèñò1").Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Value = iLookingFor
        MsgBox "Íå çàáóäü äîáÿâèòü èìÿ!", vbExclamation, "ÂÍÈÌÀÍÈÅ"
        Worksheets("Ëèñò1").Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 2).Select
    End If
End Sub

Вложения

Тип файла: rar Поиск.rar (17.5 Кб, 109 просмотров)



0



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

12.04.2013, 13:09

8

Пробуйте, разбирайтесь

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

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
Private Sub CommandButton1_Click()
    Dim whereImLooking As Range
    Dim myCell As Range
    Set whereImLooking = Worksheets("Лист1").Range("B3:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    
    Dim iLookingFor As String
    iLookingFor = Worksheets("Лист1").Cells(1, 2).Value
    
    Dim iRowErr As Integer
    
    Set myCell = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False)
    If Not myCell Is Nothing Then 'найдено
        myCell.Select
        MsgBox "Уже есть !" & vbLf & vbLf & "Вот же оно :)" & vbLf & _
            myCell, vbCritical, "ВНИМАНИЕ"
        Exit Sub
    Else
        Worksheets("Лист1").Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Select
        Selection.Value = iLookingFor
        MsgBox "Не забудь добявить имя!", vbExclamation, "ВНИМАНИЕ"
'        Worksheets("Лист1").Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 2).Select
    End If
End Sub



1



ghebog

4 / 4 / 1

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

Сообщений: 67

12.04.2013, 13:51

 [ТС]

9

Цитата
Сообщение от Казанский
Посмотреть сообщение

Пробуйте, разбирайтесь

ОК! Ща бум)))

Добавлено через 8 минут
Вроде ищем ячейку со значением, а не само значение…

Добавлено через 26 минут
Казанский, еще раз СПАСИБО!
Окончательный вариант:

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

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
Private Sub CommandButton1_Click()
    Dim whereImLooking As Range
    Dim iRowErr As Integer
    Set whereImLooking = Worksheets("Ëèñò1").Range("B3:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    Dim iLookingFor As String
    iLookingFor = Worksheets("Ëèñò1").Cells(1, 2).Value
    Dim myCell As Range
    Set myCell = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False)
    If Not myCell Is Nothing Then 'íàéäåíî
        myCell.Select
        iRowErr = myCell.Row
        MsgBox "Óæå åñòü !" & vbLf & vbLf & "Âîò æå îíî :)" & vbLf & _
            (Worksheets("Ëèñò1").Cells(iRowErr, 1).Value), vbCritical, "ÂÍÈÌÀÍÈÅ"
            Worksheets("Ëèñò1").Cells(iRowErr, 1).Select
        Exit Sub
    Else
        Worksheets("Ëèñò1").Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Select
        Selection.Value = iLookingFor
        MsgBox "Íå çàáóäü äîáÿâèòü èìÿ!", vbExclamation, "ÂÍÈÌÀÍÈÅ"
        Worksheets("Ëèñò1").Cells(Selection.Row, 1).Select
    End If
End Sub



0



Апострофф

12.04.2013, 13:58

Не по теме:

17-я строка лишняя:scratch:



0



4 / 4 / 1

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

Сообщений: 67

12.04.2013, 15:44

 [ТС]

11

Цитата
Сообщение от Апострофф
Посмотреть сообщение

17-я строка лишняя

Не по теме:

В данном контексте согласен на все 100.
А как поведет себя код, если на кнопку повешаны (кнопка на юзерФорм) и другие действия и расчеты?

Добавлено через 1 час 33 минуты
Поправка 4-й строки.
Если диапазон на другом листе, тогда везде надо явно указать лист.
Set whereImLooking = Worksheets(«Лист1»).Range(«B3:B» & Worksheets(«Лист1»).Cells(Rows.Count, «B»).End(xlUp).Row)



0



Понравилась статья? Поделить с друзьями:
  • Поиск значений в ячейках с формулами excel
  • Поиск значений в таблице excel по условию макрос
  • Поиск значений в массиве excel с условием если
  • Поиск значений в excel при помощи функций
  • Поиск значений php excel