Страницы: 1
RSS
Об особенностях метода Range.Find c параметром LookIn:=xlValues
 
Добрый день!

Вопросы по применению метода 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
Скрытый текст

Следующая задача значительно труднее. Ее решение дает ключ к ответу по данной теме.
Выполнить макрос. Если есть различия в сообщениях по месяцам, то объяснить эти различия.

Код
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 первая ячейка области поиска НЕ УЧИТЫВАЕТСЯ и её нужно проверить отдельно (перед методом)
Изменено: Jack Famous - 19.02.2021 14:17:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Алексей, вроде Excel считает первую ячейку заголовком.
Upd: Немного не так: поиск начинается со "второй" строки )
 
Цитата
Юрий М: поиск начинается со "второй" строки
не строки, а именно ячейки:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Подсказка по теме. Во второй задаче из #1 заменить 4-ю строку макроса на
Код
txt = "y"   ' текст для поиска в ячейке A1
Выполнить макрос, объяснить результаты.
Владимир
 
Код
txt = "f"

все разъясняет
 
Зачет. :D  
Владимир
 
я лично не понял, почему поиск не находит год в марте, сентябре, ноябре, декабре...
не найден в ячейке со значением 01.03.2021
не найден в ячейке со значением 01.09.2021
не найден в ячейке со значением 01.11.2021
не найден в ячейке со значением 01.12.2021

txt = "y" - тут мы вместо года 2021 будем искать букву "y"

P.S. то, что в первом коде мы ищем число 2021, а во втором текст "2021" - это мне понятно
Изменено: New - 20.02.2021 16:05:09
 
Завтра всё прояснится. :)  
Владимир
 
Итак, анализируем результаты экспериментов.
При указанном Андреем в #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"), который используется для форматирования ячейки по умолчанию.

Использовать или нет в макросах "мудреный" метод, указанный в заголовке темы - решать читателю. :)  
Изменено: sokol92 - 21.02.2021 15:52:26
Владимир
 
sokol92, спасибо за науку  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх