Vba excel findnext как работает

Метод Range.FindNext предназначен в VBA Excel для продолжения поиска ячеек в диапазоне по заданному условию, начатого методом Find. Пример использования.

Описание

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

Что делать, если в диапазоне есть еще ячейки, соответствующие условию поиска, и их тоже необходимо найти?

Для этих целей предназначен метод Range.FindNext. Он продолжает в диапазоне поиск следующей ячейки, соответствующей условию, заданному в предыдущей строке с методом Find. Для того, чтобы найти все такие ячейки, метод FindNext повторяется с помощью одного из циклов VBA Excel.

Синтаксис

Expression.FindNext (After)

  • Expression – выражение (переменная), возвращающее объект Range, в котором осуществляется поиск.
  • After – необязательный аргумент, представляющий из себя единственную ячейку диапазона, после которой начнется поиск. Если аргумент не указан, поиск начнется после левой верхней ячейки диапазона. В обоих случаях, ячейка по умолчанию (левая верхняя) или ячейка, заданная параметром After, в поиске не участвует.

Пример использования

Условие

В таблице с названиями басен необходимо выбрать басни, в названия которых входит слово Лев:

Таблица с названиями басен

Решение

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Sub Primer()

Dim myCell As Range, adr As String, str As String

    With Range(«A1:C9»)

        Set myCell = .Find(«Л?в», MatchCase:=1)

            If Not myCell Is Nothing Then

                str = myCell.Value

                adr = myCell.Address

            Else

                MsgBox «Ничего не найдено»

                Exit Sub

            End If

        Do

            Set myCell = .FindNext(myCell)

                If Not myCell.Address = adr Then

                    str = str & vbNewLine & myCell.Value

                End If

        Loop Until myCell.Address = adr

    End With

MsgBox str

End Sub

Результат

Результат поиска названий басен со словом Лев

Расшифровка

1. Объявляем переменные:
Dim myCell As Range, adr As String, str As String

  • myCell – объектная переменная, которой присваивается ссылка на ячейку, найденную методами Find и FindNext;
  • adr – адрес первой найденной ячейки, который нужен для остановки цикла после однократного прохождения по ячейкам указанного диапазона;
  • str – в эту переменную записывается содержимое найденных ячеек.

2. Ищем первую ячейку со словом Лев в диапазоне Range("A1:C9") и присваиваем ссылку на нее переменной myCell:
Set myCell = .Find("Л?в", MatchCase:=1)

В искомой строке («Л?в») используем подстановочный знак (?), который заменяет любую букву, чтобы найти слова с корнями «Лев» и «Льв».

Так как животные в названиях басен пишутся с заглавной буквы, в искомой строке тоже используем заглавную букву и поиск с учетом регистра (MatchCase:=1), чтобы не были найдены ячейки со словами «плов«, «клавиатура» и т.д. Хотя ячейки со словами «Левша», «Лавка» и подобные, начинающиеся с большой буквы, будут найдены.

3. Если переменная myCell не содержит Nothing, значит первая ячейка с искомой строкой найдена. Присваиваем ее значение переменной str, а ее адрес – переменной adr.

Если переменная myCell содержит Nothing, выводим сообщение «Ничего не найдено» и завершаем процедуру (Exit Sub).

4. С помощью цикла Do...Loop Until... и метода FindNext находим в диапазоне все остальные ячейки, соответствующие критерию поиска, заданному в строке с методом Find. Добавляем содержимое найденных ячеек в переменную str.

Переменная myCell используется повторно в течение всей работы цикла: Set myCell = .FindNext(myCell).

Цикл и добавление значений в переменную str завершаются при возврате в первоначально найденную ячейку, адрес которой мы записали (используем условие myCell.Address = adr).

5. По окончании работы цикла выводим содержимое переменной str в информационном окне MsgBox.

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Range.FindNext method (Excel)

vbaxl10.chm144129

vbaxl10.chm144129

excel

Excel.Range.FindNext

308c6241-2398-13e6-ba68-17ec713376f6

05/10/2019

medium

Range.FindNext method (Excel)

Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions and returns a Range object that represents that cell. This does not affect the selection or the active cell.

Syntax

expression.FindNext (After)

expression A variable that represents a Range object.

Parameters

Name Required/Optional Data type Description
After Optional Variant The cell after which you want to search. This corresponds to the position of the active cell when a search is done from the user interface. Be aware that After must be a single cell in the range.
Remember that the search begins after this cell; the specified cell is not searched until the method wraps back around to this cell. If this argument is not specified, the search starts after the cell in the upper-left corner of the range.

Return value

Range

Remarks

When the search reaches the end of the specified search range, it wraps around to the beginning of the range. To stop a search when this wraparound occurs, save the address of the first found cell, and then test each successive found-cell address against this saved address.

Example

This example finds all cells in the range A1:A500 on worksheet one that contain the value 2, and changes the entire cell value to 5. That is, the values 1234 and 99299 both contain 2 and both cell values will become 5.

Sub FindValue()
    
    Dim c As Range
    Dim firstAddress As String
    
    With Worksheets(1).Range("A1:A500") 
        Set c = .Find(2, lookin:=xlValues) 
        If Not c Is Nothing Then 
            firstAddress = c.Address 
            Do 
                c.Value = 5 
                Set c = .FindNext(c) 
            Loop While Not c Is Nothing
        End If 
    End With
    
End Sub

This example finds all the cells in the first four columns that contain a constant X, and hides the column that contains the X.

Sub Hide_Columns()

    'Excel objects.
    Dim m_wbBook As Workbook
    Dim m_wsSheet As Worksheet
    Dim m_rnCheck As Range
    Dim m_rnFind As Range
    Dim m_stAddress As String

    'Initialize the Excel objects.
    Set m_wbBook = ThisWorkbook
    Set m_wsSheet = m_wbBook.Worksheets("Sheet1")
    
    'Search the four columns for any constants.
    Set m_rnCheck = m_wsSheet.Range("A1:D1").SpecialCells(xlCellTypeConstants)
    
    'Retrieve all columns that contain an X. If there is at least one, begin the DO/WHILE loop.
    With m_rnCheck
        Set m_rnFind = .Find(What:="X")
        If Not m_rnFind Is Nothing Then
            m_stAddress = m_rnFind.Address
             
            'Hide the column, and then find the next X.
            Do
                m_rnFind.EntireColumn.Hidden = True
                Set m_rnFind = .FindNext(m_rnFind)
            Loop While Not m_rnFind Is Nothing And m_rnFind.Address <> m_stAddress
        End If
    End With

End Sub

This example finds all the cells in the first four columns that contain a constant X, and unhides the column that contains the X.

Sub Unhide_Columns()
    'Excel objects.
    Dim m_wbBook As Workbook
    Dim m_wsSheet As Worksheet
    Dim m_rnCheck As Range
    Dim m_rnFind As Range
    Dim m_stAddress As String
    
    'Initialize the Excel objects.
    Set m_wbBook = ThisWorkbook
    Set m_wsSheet = m_wbBook.Worksheets("Sheet1")
    
    'Search the four columns for any constants.
    Set m_rnCheck = m_wsSheet.Range("A1:D1").SpecialCells(xlCellTypeConstants)
    
    'Retrieve all columns that contain X. If there is at least one, begin the DO/WHILE loop.
    With m_rnCheck
        Set m_rnFind = .Find(What:="X", LookIn:=xlFormulas)
        If Not m_rnFind Is Nothing Then
            m_stAddress = m_rnFind.Address
            
            'Unhide the column, and then find the next X.
            Do
                m_rnFind.EntireColumn.Hidden = False
                Set m_rnFind = .FindNext(m_rnFind)
            Loop While Not m_rnFind Is Nothing And m_rnFind.Address <> m_stAddress
        End If
    End With

End Sub

[!includeSupport and feedback]

Excel VBA Find Next

Like in Excel, when we press CTRL + F, a wizard box pops up, allowing us to search for a value in the given worksheet. Once we find the value, we click on “Find Next” to find the other similar value. As it is a worksheet feature, we can also use it in VBA as the Application property method as application.findnext for the same purposes.

Finding the specific value in the mentioned range is fine, but what if the requirement is to find the value with multiple occurrences? In one of the earlier articles, we discussed the “Find” method in VBA. It is not complex, but finding all the repetitive occurrences is possible only with the “FindNext” method in Excel VBA.

Table of contents
  • Excel VBA Find Next
    • What is Find Next in Excel VBA?
    • Examples of Find Next Method in Excel VBA
      • VBA Find Next (Using Loop)
    • Things to Remember
    • Recommended Articles

This article will show you how to use this “Find Next” in Excel VBA.

VBA-Find-Next

You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Find Next (wallstreetmojo.com)

What is Find Next in Excel VBA?

As the word says, “Find Next” means from the found cell, keep searching for the next value until it returns to the original cell where we started the search.

The advanced version of the “Find” method searches only once the mentioned value is in the range.

Below is the syntax of the FINDNEXT method in Excel VBA.

Find Next Formula in VBA

After: It is the word that we are searching for.

Examples of Find Next Method in Excel VBA

Below are examples of finding the next method in Excel VBA.

Look at the below data.

You can download this VBA Find Next Excel Template here – VBA Find Next Excel Template

VBA Find Next - Example 1

Step #1 – In this data, we need to find the city name “Bangalore.” Let’s start the sub procedure in the visual basic editorThe Visual Basic for Applications Editor is a scripting interface. These scripts are primarily responsible for the creation and execution of macros in Microsoft software.read more.

Code:

Sub RangeNext_Example()

End Sub

VBA Find Next - Example 1-1

Step #2 – First, declare the variable as a “Range” object.

Code:

Sub RangeNext_Example()

 Dim Rng As Range

End Sub

VBA Find Next - Example 1-2

Step #3 – Set the reference for the object variable as “Range(“A2: A11”).

Code:

Sub RangeNext_Example()

 Dim Rng As Range
 Set Rng = Range("A2:A12")

End Sub

VBA Find Next - Example 1-3

Since our data of the city list is in the range of cells from A2 to A11, only we will search for the city “Bangalore.”

Since we set the range reference to the variable “Rng,” we use this variable instead of using RANGE(“A2: A11”) every time.

Step #4 – Use the RNG variable and open the Find method.

Code:

Sub RangeNext_Example()

 Dim Rng As Range
 Set Rng = Range("A2:A12")
 Rng.Find

End Sub

VBA Find Next - Example 1-4

Step #5 – The first argument of the FIND method is “What,” i.e., what we are trying to search in the mentioned range, so the value we are searching is “Bangalore.”

Code:

Sub RangeNext_Example()

 Dim Rng As Range
 Set Rng = Range("A2:A12")
 Rng.Find What:="Bangalore"

End Sub

VBA Find Next - Example 1-5

Step #6 – To show which cell we found this value in, declare one more variable as a string.

Code:

Sub RangeNext_Example()

 Dim Rng As Range
 Dim CellAdderess As String

 Set Rng = Range("A2:A12")
 Rng.Find What:="Bangalore"

End Sub

VBA Find Next - Example 1-6

Step #7 – For this variable, assign the found cell address.

Code:

Sub RangeNext_Example()

  Dim Rng As Range
  Dim CellAdderess As String

  Set Rng = Range("A2:A12").Find(What:="Bangalore")
  Rng.Find What:="Bangalore"

  CellAddress = Rng.Address

End Sub

VBA Find Next - Example 1-7

Note: RNG. Address because RNG will have the reference for the found value cell.

Step #8 – Now show the assigned cell address variable result in the message box in VBA.

Sub RangeNext_Example()

 Dim Rng As Range
 Dim CellAdderess As String

 Set Rng = Range("A2:A12").Find(What:="Bangalore")
 Rng.Find What:="Bangalore"

 CellAddress = Rng.Address
 MsgBox CellAddress

End Sub

VBA Find Next - Example 1-8

Step #9 – Run the code and see what we get here.

VBA Find Next - Example 1-9

So we have found the value “Bangalore” in cell A5. However, we can find only one cell with the Find method, so instead of FIND, we need to use FINDNEXT in Excel VBA.

Step #10 – We need to reference the range object variable using the FINDNEXT method in Excel VBA.

Code:

Sub RangeNext_Example()

 Dim Rng As Range
 Dim CellAdderess As String
 Set Rng = Range("A2:A12").Find(What:="Bangalore")
 Rng.Find What:="Bangalore"

 CellAddress = Rng.Address
 MsgBox CellAddress

 Set Rng = Range("A2:A12").FindNext(Rng)

End Sub

VBA Find Next - Example 1-10

As you can see above, we have used the VBA FINDNEXT method, but inside the function, we have used a range object variable name.

Step #11 – Now again, assign the cell address and show the address in the message box.

Code:

Sub RangeNext_Example()

 Dim Rng As Range
 Dim CellAdderess As String
 Set Rng = Range("A2:A12").Find(What:="Bangalore")
 Rng.Find What:="Bangalore"

 CellAddress = Rng.Address
 MsgBox CellAddress

 Set Rng = Range("A2:A12").FindNext(Rng)
 CellAddress = Rng.Address
 MsgBox CellAddress

End Sub

VBA Find Next - Example 1-11

Step #12 – Run the macro and see what we get in the first message box.

VBA Find Next - Example 1-12

Step #13 – The first message box shows the value “Bangalore” found in cell A5. Click on the “OK” button to see the next found value.

VBA Find Next - Example 1-13

The second value found is in the A7 cell. Press “OK” to continue.

VBA Find Next (Using Loop)

It will exit the VBA subprocedureSUB in VBA is a procedure which contains all the code which automatically gives the statement of end sub and the middle portion is used for coding. Sub statement can be both public and private and the name of the subprocedure is mandatory in VBA.read more, but we are one more to be found in cell A10. When we find the values in more than one cell, it is better to use loops.

In this case, too, we have value “Bangalore” in more than one cell, so we need to include loops here.

Step #14 – First, declare two variables as the range.

Code:

Sub RangeNext_Example1()

 Dim Rng As Range
 Dim FindRng As Range

End Sub

Example 2

Step #15 – Set the reference for the first variable, as shown below.

Code:

Sub RangeNext_Example1()

 Dim Rng As Range
 Dim FindRng As Range

 Set Rng = Range("A2:A11").Find(What:="Bangalore")

End Sub

Example 2-1

Step #16 – Set the reference using the FIND VBA functionVBA Find gives the exact match of the argument. It takes three arguments, one is what to find, where to find and where to look at. If any parameter is missing, it takes existing value as that parameter.read more for the second variable.

Sub RangeNext_Example1()

 Dim Rng As Range
 Dim FindRng As Range

 Set Rng = Range("A2:A11").Find(What:="Bangalore")
 Set FindRng = Rng.FindNext("Bangalore")

End Sub

Example 2-3

Step #17 – Before we start searching for the value, we need to identify from which cell we start the search, which declares the variable as a string.

Code:

Sub RangeNext_Example1()

 Dim Rng As Range
 Dim FindRng As Range

 Set Rng = Range("A2:A11").Find(What:="Bangalore")
 Set FindRng = Rng.FindNext("Bangalore")

 Dim FirstCell As String
 FirstCell = Rng.Address

End Sub

Example 2-4

Step #18 – For this variable, assign the first cell address.

Code:

Sub RangeNext_Example1()

 Dim Rng As Range
 Dim FindRng As Range

 Set Rng = Range("A2:A11")
 Set FindRng = Rng.Find(What:="Bangalore")

 Dim FirstCell As String
 FirstCell = Rng.Address

End Sub

Example 2-5

Step #19 – We need to include the “Do While” loop to loop through all the cells and find the searching value.

Code:

Sub RangeNext_Example1()

 Dim Rng As Range
 Dim FindRng As Range

 Set Rng = Range("A2:A11").Find(What:="Bangalore")
 Set FindRng = Rng.FindNext("Bangalore")

 Dim FirstCell As String
 FirstCell = Rng.Address

 Do
 Loop While FirstCell <> Cell.Address

End Sub

Example 2-6

Inside the loop, mention the message box and VBA FINDNEXT method.

Step #20 – Below is the complete code for you.

Code:

Sub FindNext_Example()

 Dim FindValue As String
 FindValue = "Bangalore"

 Dim Rng As Range
 Set Rng = Range("A2:A11")

 Dim FindRng As Range
 Set FindRng = Rng.Find(What:=FindValue)

 Dim FirstCell As String
 FirstCell = FindRng.Address

 Do
  MsgBox FindRng.Address
  Set FindRng = Rng.FindNext(FindRng)
  Loop While FirstCell <> FindRng.Address

 MsgBox "Search is over"

End Sub

Step #21 – This will keep showing all the matching cell addresses, and in the end, it will show the message “Search is Over” in the new message box.

Example 2-7

Things to Remember

  • The FIND method can find only one value at a time.
  • The FINDNEXT method in Excel VBA can find the next value from the already found value cell.
  • We must use the Do While loop to loop through all the cells in the range.

Recommended Articles

This article has been a guide to VBA FINDNEXT. Here, we discuss how to find the specific value using Excel VBA FindNext function, along with examples. You can learn more about VBA functions from the following articles: –

  • For Next Loop in VBA
  • VBA ListObjects
  • CDEC in VBA
  • VBA Login User Form

Поиск какого-либо значения в ячейках 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

FindNext Method

Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions and returns a Range object that represents that cell. Doesn’t affect the selection or the active cell.

expression.FindNext(After)

expression   Required. An expression that returns a Range object.

After   Optional Variant. The cell after which you want to search. This corresponds to the position of the active cell when a search is done from the user interface. Note that After must be a single cell in the range. Remember that the search begins after this cell; the specified cell isn’t searched until the method wraps back around to this cell. If this argument isn’t specified, the search starts after the cell in the upper-left corner of the range.

Remarks

When the search reaches the end of the specified search range, it wraps around to the beginning of the range. To stop a search when this wraparound occurs, save the address of the first found cell, and then test each successive found-cell address against this saved address.

Example

This example finds all cells in the range A1:A500 that contain the value 2 and changes their values to 5.

With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With

Like this post? Please share to your friends:
  • Vba excel find ошибка
  • Vba excel find если не найдено
  • Vba excel find what method
  • Vba excel find string in string
  • Vba excel find in sheet