Если не найдено совпадающей строки для искомого значения

#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:

  1. Правильно объявите свои переменные
  2. Получите диапазон, в котором что-то было найдено, FoundAt и сравните это с Nothing
  3. Удалите другую часть, потому 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. И… ты прав. Это вполне логично. Как, черт возьми, я мог пропустить такое? Еще раз спасибо.