Метод 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 |
|||
Сообщение было отмечено ValentinaI как решение РешениеТак ищет ?
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 |