Метод 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:
|
| LookAt | Поиск частичного или полного совпадения. Список констант xlLookAt:
|
| SearchOrder | Определяет способ поиска. Список констант xlSearchOrder:
|
| SearchDirection | Определяет направление поиска. Список констант xlSearchDirection:
|
| MatchCase | Определяет учет регистра:
|
| MatchByte | Условия поиска при использовании двухбайтовых кодировок:
|
| SearchFormat | Формат поиска – используется вместе со свойством Application.FindFormat. |
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
- ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).
Простые примеры
При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:
- Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
- Если поисковая фраза в заданном диапазоне найдена не будет, метод 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 |
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.
Option ExplicitSub Test()Dim i$(1 To 6, 1 To 4), z$(1 To 53, 1 To 4), j%(1 To 6), m%(1 To 53), x%, y&Dim sht1 As Worksheet, sht2 As Worksheet
On Error Resume Next
Set sht1 = Sheets("Табель")
Set sht2 = Sheets("Наряд")
With sht1
y = .Rows(4).Find(sht2.Range("k3").Value).Column
j(1) = .Columns(y).Find(What:=Range("O7"), lookat:=xlWhole, after:=.Cells(4, y)).Row
j(2) = .Columns(y).Find(What:=Range("O8"), lookat:=xlWhole, after:=.Cells(4, y)).Row
For x = 1 To UBound(i)
i(x, 1) = .Cells(j(x), 2)
Next xEnd With
sht2.Range("e7").Resize(2) = i
With sht1
y = .Rows(4).Find(sht2.Range("k3").Value).Column
m(1) = .Columns(y).Find(What:=Range("O12"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(2) = .Columns(y).Find(What:=Range("O13"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(3) = .Columns(y).Find(What:=Range("O14"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(4) = .Columns(y).Find(What:=Range("O15"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(5) = .Columns(y).Find(What:=Range("O16"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(6) = .Columns(y).Find(What:=Range("O17"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(7) = .Columns(y).Find(What:=Range("O18"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m( = .Columns(y).Find(What:=Range("O19"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(9) = .Columns(y).Find(What:=Range("O20"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(10) = .Columns(y).Find(What:=Range("O21"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(11) = .Columns(y).Find(What:=Range("O22"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(12) = .Columns(y).Find(What:=Range("O23"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(13) = .Columns(y).Find(What:=Range("O24"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(14) = .Columns(y).Find(What:=Range("O25"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(15) = .Columns(y).Find(What:=Range("O26"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(16) = .Columns(y).Find(What:=Range("O27"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(17) = .Columns(y).Find(What:=Range("O28"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(18) = .Columns(y).Find(What:=Range("O29"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(19) = .Columns(y).Find(What:=Range("O30"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(20) = .Columns(y).Find(What:=Range("O31"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(21) = .Columns(y).Find(What:=Range("O32"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(22) = .Columns(y).Find(What:=Range("O33"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(23) = .Columns(y).Find(What:=Range("O34"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(24) = .Columns(y).Find(What:=Range("O35"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(25) = .Columns(y).Find(What:=Range("O36"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(26) = .Columns(y).Find(What:=Range("O37"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(27) = .Columns(y).Find(What:=Range("O38"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(28) = .Columns(y).Find(What:=Range("O39"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(29) = .Columns(y).Find(What:=Range("O40"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(30) = .Columns(y).Find(What:=Range("O41"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(31) = .Columns(y).Find(What:=Range("O42"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(32) = .Columns(y).Find(What:=Range("O43"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(33) = .Columns(y).Find(What:=Range("O44"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(34) = .Columns(y).Find(What:=Range("O45"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(35) = .Columns(y).Find(What:=Range("O46"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(36) = .Columns(y).Find(What:=Range("O47"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(37) = .Columns(y).Find(What:=Range("O48"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(38) = .Columns(y).Find(What:=Range("O49"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(39) = .Columns(y).Find(What:=Range("O50"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(40) = .Columns(y).Find(What:=Range("O51"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(41) = .Columns(y).Find(What:=Range("O52"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(42) = .Columns(y).Find(What:=Range("O53"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(43) = .Columns(y).Find(What:=Range("O54"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(44) = .Columns(y).Find(What:=Range("O55"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(45) = .Columns(y).Find(What:=Range("O56"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(46) = .Columns(y).Find(What:=Range("O57"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(47) = .Columns(y).Find(What:=Range("O58"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(48) = .Columns(y).Find(What:=Range("O59"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(49) = .Columns(y).Find(What:=Range("O60"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(50) = .Columns(y).Find(What:=Range("O61"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(51) = .Columns(y).Find(What:=Range("O62"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(52) = .Columns(y).Find(What:=Range("O63"), lookat:=xlWhole, after:=.Cells(4, y)).Row
m(53) = .Columns(y).Find(What:=Range("O64"), lookat:=xlWhole, after:=.Cells(4, y)).Row
For x = 1 To UBound(z)
z(x, 1) = .Cells(m(x), 2)
Next xEnd
With
sht2.Range("F12").Resize(53) = z
End Sub
I’m trying to find an id in a list and get it’s address, but also deal with a situation if nothing is found.
Here’s what I have:
Function find_in_two_ranges_two_sheets(ws1 As String, col1 As Integer) As Range
Dim rows1 As Integer
rows1 = Get_Rows_Generic(ws1, 1)
Dim range1 As Range ' range of first search
With Worksheets(ws1)
Set range1 = .Range(.Cells(1, col1), .Cells(rows1, col1))
End With
Dim found1 As Range
Set found1 = range1.Find("test id", LookIn:=xlValues)
If found1 = Nothing Then
MsgBox "nothing"
Else
MsgBox found1.AddressLocal
End If
Set find_in_two_ranges_two_sheets = range1
End Function
Sub test_stuff()
Dim x As Range
Set x = find_in_two_ranges_two_sheets("usersFullOutput.csv", 1)
MsgBox x.Address
End Sub
When I run test_stuff() I get an error in the function in the line If found1 = Nothing Then with the word Nothing highlighted. «Compile error; Invalid Use of Object». Not sure what to do.
asked Mar 15, 2015 at 21:55
DBWeinsteinDBWeinstein
8,30330 gold badges70 silver badges116 bronze badges
1
To check the range object you need to use is instead of =:
If found1 Is Nothing Then
MsgBox "nothing"
Else
MsgBox found1.AddressLocal
End If
Explanation:
Taken from Allen Browne
Nothing is the uninitialized state of an object variable. An object cannot be a simple variable such as a number or a string, so it can never be 0 or «». It must be a more comprehensive structure (a text box, form, recordset, querydef, …)
Since it is not a simple value, you cannot test if it is equal to something. VBA has an Is keyword that you use.
answered Mar 15, 2015 at 22:20
Поиск какого-либо значения в ячейках 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
|
0 / 0 / 0 Регистрация: 18.01.2019 Сообщений: 4 |
|
|
1 |
|
|
Excel 18.01.2019, 16:41. Показов 4620. Ответов 6
Здраствуйте. Я в программировании на VBA в Excel — новичок. Подскажите пожалуйста, почему функция Find не находит искомое значение в диапазоне, если оно там есть? Если подставить конкретно число, то все работает, а если искать результат выполнения функции, то не работает. Подскажите, пожалуйста, как это исправить? Файл ниже прилагается.
0 |
|
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
|
18.01.2019, 17:35 |
2 |
|||
|
РешениеТак ищет ?
1 |
|
0 / 0 / 0 Регистрация: 18.01.2019 Сообщений: 4 |
|
|
18.01.2019, 18:24 [ТС] |
3 |
|
pashulka, да так ищет. Спасибо)
0 |
|
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
|
18.01.2019, 18:29 |
4 |
|
Необязательна, но если уберёте и введёте отрицательное число, то получите ошибку
0 |
|
0 / 0 / 0 Регистрация: 18.01.2019 Сообщений: 4 |
|
|
18.01.2019, 18:33 [ТС] |
5 |
|
ааа, понятно. Просто подразумевается, что количество точек заранее неизвестно. Еще раз спасибо)
0 |
|
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
|
18.01.2019, 19:13 |
6 |
|
ValentinaI, Если вместо 47 напишите Rows.Count — 1 то избежите ещё и ошибки, которая возникнет, если пользователь введёт число точек, превышающее количество строк в рабочем листе. P.S. Разумеется, вместо максимального количества строк — можно и указать реально заполненное количество ячеек(точек)
0 |
|
0 / 0 / 0 Регистрация: 18.01.2019 Сообщений: 4 |
|
|
18.01.2019, 19:39 [ТС] |
7 |
|
Хорошо, учту это. Спасибо еще раз)
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
18.01.2019, 19:39 |
|
7 |


Сообщение было отмечено ValentinaI как решение