Как применить SearchDirection, чтобы найти первое вхождение?

#excel #vba #find

#excel #vba #Найти

Вопрос:

В MS Excel у меня есть код VBA, который просматривает диапазон, чтобы найти дни в месяце.

Диапазон выглядит как 1,2,3, …,30,1 (в столбцах), поскольку в некоторых месяцах 30 дней, а в некоторых — 31.

При попытке найти «1» в диапазоне код всегда выдает в результате второе «1».

Когда я удаляю второй «1» из диапазона, это дает правильный результат.

«SearchDirection», похоже, ничего не делает в этой ситуации.

 day = 1
Set findday = findmonth.Find(day, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByColumns)
Debug.Print findday.Address
 

Ответ №1:

Найти метод «Сбой»

  • Если вы используете xlValues с LookIn аргументом, то, если строка или столбец, в котором вы ожидаете найти значение, скрыты, Find «не удастся» его найти.
  • По умолчанию Find метод использует xlNext for SearchDirection , поэтому вы можете его опустить.
  • Ваша проблема, безусловно, заключается в пропуске After аргумента. Дело в том, что если вы введете первую ячейку ( A1 ) в качестве параметра для After аргумента (который по умолчанию ( A1 ) ) , поиск начнется с A2 if xlByColumns или B1 if xlByRows . Поэтому вы должны указать последнюю ячейку в диапазоне, чтобы Find метод начал поиск с первой ячейки в диапазоне ( A1 ) .

Например:

 Day = 1
Set findday = findmonth.Find( _
    What:=Day, _
    After:=findmonth.Cells(findmonth.Rows.Count, findmonth.Columns.Count), _
    LookIn:=xlFormulas, _
    LookAt:=xlWhole, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext)
Debug.Print findday.Address
 

Или, если вы предпочитаете одну строку:

 Dim findday As Range
Day = 1
Set findday = findmonth.Find(What:=Day, After:=findmonth.Cells(findmonth.Rows.Count, findmonth.Columns.Count), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
Debug.Print findday.Address
 

Используя With инструкцию, вы могли бы сделать ее более читаемой:

 Day = 1
With findmonth
    Set findday = .Find(What:=Day, After:=.Cells(.Rows.Count, .Columns.Count), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns)
End With
Debug.Print findday.Address
 

Комментарии:

1. К вашему сведению, более короткий способ ссылки на последнюю ячейку в диапазоне — это .Cells(.Count)

2. @крис Нильсен: Мне это не нравится, но если вы настаиваете, вы можете использовать .Cells(.Cells.CountLarge) , чтобы убедиться, что .Count это не подведет.