#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
forSearchDirection
, поэтому вы можете его опустить. - Ваша проблема, безусловно, заключается в пропуске
After
аргумента. Дело в том, что если вы введете первую ячейку (A1
) в качестве параметра дляAfter
аргумента (который по умолчанию (A1
) ) , поиск начнется сA2
ifxlByColumns
илиB1
ifxlByRows
. Поэтому вы должны указать последнюю ячейку в диапазоне, чтобы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
это не подведет.