#excel #vba
Вопрос:
У меня есть некоторые проблемы с определением этой проверки. Это всего лишь часть всего кода с Do Until
циклом.
Если какая-либо строка в моем листе соответствует искомому значению, определите FindRow
как «1».
Если соответствующая строка найдена, то FindRow =
этот номер строки.
With ThisWorkbook.Sheets("TKSLIST").Range("A:A") FindRow = 1 strTKSname = ws.Cells(i 1, 11).Text If .Find(What:=strTKSname, LookAt:=xlPart, LookIn:=xlValues, MatchCase:=False).Row Is Nothing Then FindRow = 1 Else FindRow = .Find(What:=strTKSname, LookAt:=xlPart, LookIn:=xlValues, MatchCase:=False).Row End If End With
Мне чего-то не хватает. Каждый раз, когда мое искомое значение не найдено, я получаю ошибки.
Комментарии:
1. Вам придется удалить первое встречающееся
.Row
:Nothing
используется для объектов, а не для целых чисел.
Ответ №1:
- Правильно объявите свои переменные
- Получите диапазон, в котором что-то было найдено,
FoundAt
и сравните это сNothing
- Удалите другую часть, потому
FindRow = 1
что она уже была установлена в качестве начального значения.
With ThisWorkbook.Sheets("TKSLIST").Range("A:A") Dim FindRow As Long FindRow = 1 ' this needs to be inside the loop (and you can omit the else part below) Dim strTKSname As String strTKSname = ws.Cells(i 1, 11).Text Dim FoundAt As Range Set FoundAt = .Find(What:=strTKSname, LookAt:=xlPart, LookIn:=xlValues, MatchCase:=False) If Not FoundAt Is Nothing Then FindRow = FoundAt.Row End If 'no else needed because initialized as `FindRow = 1` End With
Ответ №2:
Использование метода поиска в цикле
Sub Whatever() ' somewhere before the loop Dim fCell As Range Dim FindRow As Long With ThisWorkbook.Sheets("TKSLIST").Range("A:A") strTKSname = ws.Cells(i 1, 11).Value ' Just a reminder: ' Without the 'After' the search starts with `A2`. ' If that is ok with you, you don't need it. Set fCell = .Find(What:=strTKSname, _ After:=.Cells(.Cells.Count), _ LookIn:=xlValues, LookAt:=xlPart) If fCell Is Nothing Then FindRow = 1 Else FindRow = fCell.Row End If End With End Sub
Комментарии:
1. На самом деле вам это не нужно
Set fCell = Nothing
, потомуFind
что всегда устанавливаетNothing
значение, если ничего не было найдено. Вам это нужно толькоSet Nothing
в том случае, если вы используете метод, который создает исключение (потому что тогда оно не установленоNothing
).2. Спасибо. Но это
Else
утверждение скрывает ту часть, когда что-то было найдено (Not fCell Is Nothing
). Поэтому для следующего запуска вы, безусловно, хотите, чтобы переменная была установлена вNothing
. Вы должны применить его кIf
утверждению в своем ответе. Подумайте об этом. Этот недосмотр мог произойти из-за того, что некоторые разработчики используют исключительно «положительный» результат в качестве первого утверждения. Я не.3. Нет, если первый цикл что-то нашел, то
Set fCell = .Find
будет установленоfCell
значение «ничего», если он ничего не найдет во втором цикле. ПоэтомуSet fCell = Nothing
в этом нет необходимости. Проверьте это.4. Я этим занимаюсь. Если то, что, по-моему, ты мне говоришь, правда, это очень важно.
5. И… ты прав. Это вполне логично. Как, черт возьми, я мог пропустить такое? Еще раз спасибо.