Как найти ячейку с датой vba

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

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

 

Dihlofos881

Пользователь

Сообщений: 101
Регистрация: 23.01.2020

#1

18.02.2021 05:54:14

Доброго времени суток, Друзья!

Подскажите, пожалуйста, никак не могу найти ответ на данный вопрос в интернете..
Предположим есть две таблички, нужной найти значение из одной таблички и подставить его в другую табличку, используя функцию Find по дате.
Проблема в том, что макрос начинает искать дату в формате 01/01/2021, а данные в табличке записаны в формате 01.01.2021.

Код
Sub New_copy()

Application.ScreenUpdating = False
Application.Calculation = xlManual

Workbooks.Open Filename:="АДРЕС КНИГИ С ТАБЛИЧКОЙ", ReadOnly:=True


Dim IRow As Long

IRow = Cells(Rows.Count, 1).End(xlUp).Row

lLastRow = Cells(3, 1).Row

Y = Cells(IRow, 1).Row - lLastRow = Cells(3, 1).Row

For i = 0 To 365

Set fcell2 = Workbooks("КНИГА С ТАБЛИЧКОЙ").Sheets("ЛИСТ С ТАБЛИЧКОЙ").Rows("СТРОКА С ДАТАМИ").Find(Workbooks("КНИГА КУДА НУЖНЫ ДАННЫЕ").Sheets("ЛИСТ КУДА НУЖНЫ ДАННЫЕ").Cells(lLastRow + i, 1).Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns)

If Not fcell2 Is Nothing Then

'Sheets("Extract Losses SIC, %").Select
'Sheets("Extract Losses SIC, %").Cells(fcell.Row, fcell2.Column).Select

Workbooks(""КНИГА КУДА НУЖНЫ ДАННЫЕ").Sheets("ЛИСТ КУДА НУЖНЫ ДАННЫЕ").Cells(lLastRow + i, 4).Value = Workbooks("PlanDepTool_2021.xlsx").Sheets("Production").Cells(29, fcell2.Column).Value

End If
Next i

Workbooks("КНИГА С ТАБЛИЧКОЙ").Close

Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
MsgBox ("Все данные были загружены")
End Sub
 

evgeniygeo

Пользователь

Сообщений: 2292
Регистрация: 19.06.2018

#2

18.02.2021 06:01:07

Dihlofos881,
здравствуйте!
Скиньте пожалуйста пример.
Потому что дату ищет отлично:

Код
Sub aa()
Set fcell = Columns("A:A").Find(Range("B1").Value, LookIn:=xlValues)
If Not fcell Is Nothing Then
    MsgBox "Нашел в строке: " + CStr(fcell.Row)
End If
End Sub
 

evgeniygeo,

https://disk.yandex.ru/d/EFtU66b_Ywwp8g

Не получилось сжать до 700 кб, файлы как смог уменьшил

 

Dihlofos881,
у Вас пример кода с примером файлов совсем не совпадают.

Сделайте пример попроще  :)

Вообще, я предполагаю, что проблема в формате даты на листе «Vol Pack», измените ее на стандартную и должно быть ок.

Изменено: evgeniygeo18.02.2021 08:13:44

 

Согласен с предыдущем комментарием эксель прекрасно ищет даты я писал макрос для заполнения табеля учета рабочего времени там не было никаких проблем с датами. Просто нужно понимать что даты в эксель храняться не так как мы видим на экране 15.02.2021, на самом деле в этой ячейке записано число 44242. и эксель ищет это число возможно с форматом дат. И проверьте действительно ли в ячейках где ведете поиск записаны даты. А VBA воспринимает даты в таком формате 01/01/2021. Так что он дейсвительно ищет дату. Только в VBA  запись 01/02/2021 означает дату 02.01.2021. Число и месяц меняются местами.

 

evgeniygeo, состряпал примерчик.
На листе «Production» ничего изменять нельзя, это будет из чужой книги))
Проблему решил частично функцией Cstr, теперь ищет в нужном формате, но файл все равно не работает.

 

sokol92

Пользователь

Сообщений: 4454
Регистрация: 10.09.2017

#7

18.02.2021 13:42:27

Метод Range.Find с параметром LookIn:=xlValues имеет ряд непростых для понимания особенностей. Для начала можно ознакомиться с замечательными

разъяснениями

Владимира (

ZVI

).

Для того, чтобы пример из #6 заработал, необходимо:

1. Изменить формат ячеек первой строки листа Production c Д.М;@ на Д.М;@
2. Изменить строку макроса с вызовом Find на

Код
Set fcell2 = Sheets("Production").Rows("1:1").Find(Format(CStr(Sheets("Vol Pack").Cells(lLastRow + i, 1).Value), "D.M"), LookIn:=xlValues, LookAt:=xlWhole)

Изменено: sokol9218.02.2021 14:13:16
(Уточнил параметры Find)

Владимир

 

sokol92, Макрос теперь вроде находит, но не переносит значение….

 

sokol92

Пользователь

Сообщений: 4454
Регистрация: 10.09.2017

Переносит. Если Вы в примере из #6 заполните ячейку B29 на листе Production, то макрос перенесет ее значение в ячейку B2 листа Vol Pack.

Изменено: sokol9218.02.2021 16:16:36

 

Dihlofos881

Пользователь

Сообщений: 101
Регистрация: 23.01.2020

#10

19.02.2021 10:09:48

sokol92, это работает в примере, но…. почему-то не собирается работать в нужном мне файле.
Он все равно не находит, хотя в ручном режиме данные есть. (После нажатия сочетания ctrl+f он оставляет последнее значение по которому был поиск и если сделать по этому значению поиск, то он все находит). Если код проматывать по шагам будет понятно, что он не находит значение.

Код
Sub Load_data()

Application.ScreenUpdating = False
Application.Calculation = xlManual

Dim IRow As Long

IRow = 366

lLastRow = 3

Y = IRow - lLastRow

For i = 0 To Y

Windows("PlanDepTool_2021.xlsx").Activate

Set fcell2 = Workbooks("PlanDepTool_2021.xlsx").Sheets("Production").Rows("2:2").Find(Format(CStr(Workbooks("LE_GLY_Packaging_2021.xls").Sheets("Vol Pack").Cells(lLastRow + i, 1).Value), "D.M"), LookIn:=xlValues, SearchOrder:=xlByColumns)

If Not fcell2 Is Nothing Then

Windows("LE_GLY_Packaging_2021.xls").Activate

Workbooks("LE_GLY_Packaging_2021.xls").Sheets("Vol Pack").Cells(lLastRow + i, 4) = Workbooks("PlanDepTool_2021.xlsx").Sheets("Production").Cells(29, fcell2.Column).Value

End If

Next i

Application.Calculation = xlAutomatic
Application.ScreenUpdating = True

End Sub

Изменено: Dihlofos88119.02.2021 10:10:18

 

Вроде работает проверяйте

 

Евгений Смирнов, в файле примера работает это да, а вот в фалах из сообщения  

#3

не хочет.

 

Проблема действительно в формате отображения данных в которых идет поиск.
Если мой файл работать не будет варианта 3
1 если формат 1 строки там где ведется поиск одинаковый то можно еще изменить макрос и он будет работать
2. если формат 1 строки разный то можно сначала сделать формат одинаковым во всей строке поиска и тогда вести поиск
3. Пользоваться не методом Find а в цикле просматривать ячейки и сравнивать их с искомым значением тогда Excel сам преобразует форматы.

 

sokol92

Пользователь

Сообщений: 4454
Регистрация: 10.09.2017

#14

23.02.2021 14:29:32

Цитата
Dihlofos881 написал:
Проблема в том, что макрос начинает искать дату в формате 01/01/2021, а данные в табличке записаны в формате 01.01.2021.

Послесловие. Ключ к разгадке — в этой

теме

.

Владимир

I am trying to find if a certain date is in a range of dates.
This is the range of dates:

01/01/2013
11/02/2013
29/03/2013
20/05/2013
01/07/2013
05/08/2013
02/09/2013
14/10/2013
11/11/2013
25/12/2013
26/12/2013

Here is the VBA code:

  ' Format Holiday Rows '
        With ConfigData.Range("B8:B18")
            Set holidays = .Find(s1.Cells(row_count, 1))

            If Not holidays Is Nothing Then
                MsgBox s1.Cells(row_count, 1)
            End If
        End With

In the above code, the first MsgBox that pops up reads «11/01/2013». This makes absolutely no sense, as that value is not in the range.

Note: ConfigData.Range(«B8:B18») refers to the range of dates shown above.

ALSO: This code is within a for loop that increments the value of s1.Cells(row_count, 1). Starting at 01/01/2013 until 31/12/2013

asked Jan 21, 2013 at 22:29

user985779's user avatar

user985779user985779

511 gold badge2 silver badges7 bronze badges

1

If you just want to confirm a calendar day in your series is within the holiday list, then you could even use vlookup:

Dim strFound As String

On Error Resume Next
strFound = Application.Vlookup(s1.Cells(row_count, 1), .Range("B8:B18"), 1, 0)
If IsError(strFound) Then
   MsgBox "Not Found"
Else
'-- Found
End If
On Error GoTo 0

answered Jan 22, 2013 at 0:51

bonCodigo's user avatar

bonCodigobonCodigo

14.2k1 gold badge48 silver badges90 bronze badges

3

The following code works for me:

Sub thing()

    Dim cell As Range, _
        holidays As Range

    For Each cell In Range("D1:D365")
        With Range("A1:A11")
            Set holidays = .Find(cell.Value, LookIn:=xlValues, lookat:=xlWhole)

            If Not holidays Is Nothing Then
                Debug.Print cell.Value
            End If
        End With
    Next cell

End Sub

If this doesn’t work, I’d suggest it’s likely you have a cell formatting issue. Select one of your date cells. Go to the immediate window (Alt+F11, then Ctrl+G from Excel), type ? Selection.Value2 and press enter. Does that return a numeric value (~41000)?

Alternatively, you could reenter the dates in a completely new sheet (enter the first couple manually and drag down, do not copy and paste as formatting will be copied also) and try again. This should at least remove odd formatting as a potential issue.

answered Jan 21, 2013 at 23:06

mkingston's user avatar

mkingstonmkingston

2,66816 silver badges26 bronze badges

1

It is important to note that excel uses american date formatting. ie mm/dd/yyyy and it can therefore be a little tricky to get the .Find() function to work properly. Make sure your variables are formated properly in order for excel to hopefully give you what you’re looking for:

Dim strdate As String
Dim aCell As Range

strdate = ActiveSheet.Cells(1,1)
strdate = Format(strdate, "Short Date")
On Error Resume Next
    Set aCell = Cells.Find(What:=CDate(strdate), After:=Range("A1"), LookIn:=xlFormulas , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

If rCell Is Nothing Then
    MsgBox("Date cannot be found. Try Again")
End If
End Sub

Of course there are a lot of annoying things that can happen with the date formatting, but this is assuming the dates you’re looking for ar in the «Short Date» format.

answered Aug 13, 2013 at 21:21

user2680041's user avatar

‘To find a cell elsewhere in a worksheet with the same specific date as a reference cell:
‘First copy all dates to cells immediately to their left.
‘Format the copied cells as «General»
‘Run this code — then use the dateRow and DateCol variables (eg in vlookup)
‘Works in Excel 2013 (The «General» column must not be hidden — Hide by formatting in background colour)

Dim dateVal
Dim DateRow
Dim DateCol

dateVal = Range("j8").Value 'must be in general format

Cells.Find(What:=dateVal, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate

DateRow = ActiveCell.Row
DateCol = ActiveCell.Column

MsgBox (DateRow & "   " & DateCol)

End Sub

KittMedia's user avatar

KittMedia

7,33813 gold badges34 silver badges38 bronze badges

answered May 15, 2016 at 12:06

rich_king's user avatar

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

data on my Excel sheetI would like to finde a date in column A. This is the date formát: «yyyy/mm/dd hh:mm:ss». It always find nothing, but the date what I am searching for is in the column A.
This is a snippet of my code:

Dim LastDay As Date
Dim strdate As String
Dim rCell As Range

strdate = Format(LastDay, "yyyy/mm/dd hh:mm:ss")

Set rCell = Cells.Find(What:=CDate(strdate), After:=Range("A1"), LookIn:=xlValues _
        , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

If rCell Is Nothing Then
MsgBox ("nothing")
Else

EDIT: New code per comments.

Sub Copy()
    Dim LastDayRow As Long
    Dim FirstDayRow As Long
    Dim LastDay As Date
    Dim FirstDay As Date
    Dim rcell As Range

    LastDayRow = Range("E" & Rows.Count).End(xlUp).Row
    Range("E" & LastDayRow).Copy Range("G1")
    FirstDayRow = Range("A" & Rows.Count).End(xlUp).Row
    Range("A" & FirstDayRow).Copy Range("G2")
    LastDay = Cells(LastDayRow, "E").Value
    FirstDay = Cells(FirstDayRow, "A").Value

    Set rcell = Cells.Find(What:=LastDay, After:=Range("A1"), LookIn:=xlFormulas _
                , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

    If rcell Is Nothing Then
        MsgBox ("nothing")
    End If

End Sub

Понравилась статья? Поделить с друзьями:
  • Как исправить почерк для подростков
  • Как найти диски для авто по фото
  • Окно открывается только в одном положении как исправить
  • Не работает вертушка как исправить
  • Как найти читы без вирусов