Вопросы по применению метода Range.Find c параметром LookIn:=xlValues сравнительно часто задаются на форуме. Владимир (ZVI) давал разъяснения здесь. Попробуем продолжить изучение этого проблемы.
Первую задачу можно в начале решать "без доски". Что будет выдано в результате выполнения следующего макроса. Почему?
Код
Sub TestRangeFind()
Dim rg As Range, txt As String, y As Long
y = 2021
Workbooks.Add
With Range("A1")
.NumberFormat = "D MMMM YYYY"
.Value = DateSerial(y, 1, 1)
Set rg = .Find(y, LookIn:=xlValues, LookAt:=xlPart)
Debug.Print "Текст " & y & IIf(rg Is Nothing, " не", "") & " найден в ячейке со значением " & .Value
End With
End Sub
Скрытый текст
Объяснение. Дата в указаннном формате не умещается в ячейке и отображается с помощью знаков "#". См. сообщение ZVI.
Следующая задача значительно труднее. Ее решение дает ключ к ответу по данной теме. Выполнить макрос. Если есть различия в сообщениях по месяцам, то объяснить эти различия.
Код
Sub TestRangeFind2()
Dim rg As Range, m As Long, y As Long, txt As String
y = 2021
txt = y ' текст для поиска в ячейке A1
Workbooks.Add
With Range("A1")
.NumberFormat = "D MMMM YYYY"
For m = 1 To 12
.Value = DateSerial(y, m, 1)
.EntireColumn.AutoFit
Set rg = .Find(txt, LookIn:=xlValues, LookAt:=xlPart)
Debug.Print "Текст " & txt & IIf(rg Is Nothing, " не", "") & " найден в ячейке со значением " & .Value
Next m
End With
End Sub
Сделаем паузу на пару дней, чтобы дать возможность читателям темы (если таковые будут) провести самостоятельные исследования.
sokol92, приветствую! По поиску конкретных значений не скажу, но когда я ищу первую и последнюю НЕПУСТУЮ ячейку (строку) с помощью What:="*", то имею ввиду, что метод не ищет в скрытых и при поиске ПЕРВОЙ и SearchDirection:=xlNext первая ячейка области поиска НЕ УЧИТЫВАЕТСЯ и её нужно проверить отдельно (перед методом)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
я лично не понял, почему поиск не находит год в марте, сентябре, ноябре, декабре... не найден в ячейке со значением 01.03.2021 не найден в ячейке со значением 01.09.2021 не найден в ячейке со значением 01.11.2021 не найден в ячейке со значением 01.12.2021
txt = "y" - тут мы вместо года 2021 будем искать букву "y"
P.S. то, что в первом коде мы ищем число 2021, а во втором текст "2021" - это мне понятно
Итак, анализируем результаты экспериментов. При указанном Андреем в #5 аргументе поиска "f" текст находится только для февраля, для аргумента "y" текст найден для месяцев 1,2,5,7. Проведя аналогичные опыты (и вспомнив английский язык ), делаем выводы:
1. В процессе выполнения поиска числовые, логические и ошибочные значения ячеек преобразуются в текст (числовые - с учетом формата ячеек). При преобразовании текущие региональные настройки не учитываются, точнее, преобразование производится в соответствии со стандартными "американскими" настройками: локализация en_US, дробная часть числа отделяется точкой, разделитель тысяч запятая, стандартный формат даты M/D/YYYY. Таким образом, если в ячейке с форматом D MMMM YYYY содержится число, соответствующее первому дню текущего года, то оно будет преобразовано в текст "1 January 2021". Логические значения ячеек преобразуются в "FALSE" или "TRUE", ошибочные в "#DIV/0!", "#NAME?", ...
2. Если текст, полученный в результате п.1, не помещается в ячейке, то он заменяется на один или несколько символов "#".
Теперь мы можем объяснить результаты в задаче 2 из #1. Ширина столбца "A" выравнивается под ширину видимого текста в ячейкe A1 (например, "1 Январь 2021"), Если текст, полученный в результате п.1 (например, "1 January 2021"), помещается в ячейке, то он будет найден, иначе нет.
Кстати, в конфигурации автора результат выполнения 2-го макроса из #1 отличается от результата коллеги, указанного в #8: текст не найден для месяцев 3, 8, 9, 11, 12. Это объясняется возможными различиями в настройке стиля "Обычный" ("Normal"), который используется для форматирования ячейки по умолчанию.
Использовать или нет в макросах "мудреный" метод, указанный в заголовке темы - решать читателю.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄