Find vba excel если не нашел

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

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

If Not myCell Is Nothing Then

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

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

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

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

Else

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

End If

End Sub

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

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

Пример 2

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

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

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

If Not myCell Is Nothing Then

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

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

End If

End Sub

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

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

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

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

Пример 3

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

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

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

If Not myCell Is Nothing Then

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

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

End If

End Sub

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

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

I’m looking for user ID #s from a list. However some users no longer exist. I’ve tried the test method, the on error go to method, and if err.number<> 0 then method. I still receive the Run-time error '91': object variable or with block variable not set. The number does not exist on the the list. Below is my code with a couple of fruitless attempts

On Error GoTo errorLn

If Err.Number <> 0 Then
 GoTo errorLn
End If
Cells.Find(What:=uSSO, After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Select

What other options are there? Or am I misplacing the lines of «error»? I have tried it before and after the «cells.Find…»

Community's user avatar

asked Aug 15, 2012 at 16:03

orangehairbandit's user avatar

You will want to do something different than have message boxes, presumably.

Dim myCell As Range

Set myCell = Cells.Find(What:=uSSO, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

If (Not myCell Is Nothing) Then
    MsgBox "something!"

Else
    MsgBox "nothing"
End If

answered Aug 15, 2012 at 16:12

enderland's user avatar

enderlandenderland

13.7k17 gold badges100 silver badges152 bronze badges

I believe you’ll need to restructure it just a little bit. It is not the best practice to handle errors with On Error Resume Next, but you could try this:

On Error Resume Next
Cells.Find(What:=uSSO, After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Select

If Err.Number <> 0 Then
 '''Do your error stuff'''
 GoTo errorLn
Else
    Err.Clear
End If

Does that work for your situation?

Source: http://www.mrexcel.com/forum/excel-questions/143988-check-if-value-exists-visual-basic-applications-array.html

answered Aug 15, 2012 at 16:08

RocketDonkey's user avatar

2

Try this

Sub Sample1()
    Dim oSht As Worksheet
    Dim uSSO As String
    Dim aCell As Range
    
    On Error GoTo Whoa
    
    '~~> Change this to the relevant sheet
    Set oSht = Sheets("Sheet1")
    
    '~~> Set User ID here
    uSSO = "User ID"
    
    Set aCell = oSht.Cells.Find(What:=uSSO, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)
    
    '~~> Check if found or not
    If Not aCell Is Nothing Then
        MsgBox "Value Found in Cell " & aCell.Address
    Else
        MsgBox "Value Not found"
    End If
    
    Exit Sub
Whoa:
    MsgBox Err.Description
End Sub

I also would recommend reading this link where I have covered .Find and .FindNext

Topic: .Find and .FindNext In Excel VBA

Link: https://web.archive.org/web/20160316214709/https://siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/

Kolappan N's user avatar

Kolappan N

3,4812 gold badges35 silver badges41 bronze badges

answered Aug 15, 2012 at 16:09

Siddharth Rout's user avatar

Siddharth RoutSiddharth Rout

146k17 gold badges206 silver badges250 bronze badges

1

0 / 0 / 0

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

Сообщений: 4

1

Excel

18.01.2019, 16:41. Показов 4607. Ответов 6


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

Здраствуйте. Я в программировании на VBA в Excel — новичок. Подскажите пожалуйста, почему функция Find не находит искомое значение в диапазоне, если оно там есть? Если подставить конкретно число, то все работает, а если искать результат выполнения функции, то не работает. Подскажите, пожалуйста, как это исправить? Файл ниже прилагается.



0



pashulka

4131 / 2235 / 940

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

Сообщений: 4,624

18.01.2019, 17:35

2

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

Решение

Так ищет ?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim n&, MaxS$, Rng As Range
n = Val(InputBox("Введите количество экспериментальных точек"))
If n < 1 Or n > 47 Then Exit Sub
 
Set Rng = Range(Cells(2, 2), Cells(n + 1, 2))
MaxS = Replace(Application.Max(Rng), ",", ".")
 
Set Rng = Rng.Find(MaxS, , xlFormulas, xlWhole)
If Not Rng Is Nothing Then
   MsgBox "нашли"
   Rng.Select
Else
   MsgBox "не найдено."
End If



1



0 / 0 / 0

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

Сообщений: 4

18.01.2019, 18:24

 [ТС]

3

pashulka, да так ищет. Спасибо)
А вот эта строчка обязательна
If n < 1 Or n > 47 Then Exit Sub?
Я так понимаю, что проблема была в том, что в одном случае дробная часть отделялась точкой, а в другом запятой?



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

Like this post? Please share to your friends:
  • Find value in one column excel
  • Find value in columns excel
  • Find value excel function
  • Find use in a sentence for each word
  • Find unique in excel