Устранение ошибки времени выполнения "91" после VBA Cra sh, которая работала, находила до сбоя - PullRequest
0 голосов
/ 01 мая 2020

Я надеюсь, что кто-то может мне помочь. Почти все было сделано и мой Excel разбился. До крэя sh все работало нормально. Теперь я получаю сообщение об ошибке выполнения в этой строке «ActiveCell.Find (i) .Select». --- Ниже моя процедура, которая ищет файл для определенного значения, находит его и затем переходит к последней строке, содержащей это значение.

Sub FindValue_Raw()

Dim Value As Variant
Dim Sheetname As String
Dim lastCell As String
Dim x As Integer
Dim iVal As Integer
Dim i As Variant

Value = InputBox("Enter Value:", "Input")

Sheetname = "Sheet2"

Dim Cell As Variant

    'Search in Column A | MatchCase True = case sensitive of raw file
    Set Cell = Sheets(Sheetname).Columns("C:C").Find(What:=Value, After:=Sheets(Sheetname).Range("C1"), LookIn:=xlFormulas, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=True, SearchFormat:=False)

If Not Cell Is Nothing Then
    'Find how many rows have this value
     iVal = Application.WorksheetFunction.CountIf(Range("C1:C480000"), Cell)
    'find the last line with this value
     Do While x < iVal
        'Set where the curse is after it finds value
         i = Cell
        **'Select first instance of that value -THIS IS WHERE THE ERROR IS
         **ActiveCell.Find(i).Select****
         'Finds the last Reference address
         lastCell = ActiveCell.Address(False, False)
         'Highlights cell
        ' ActiveCell.Interior.ColorIndex = 4
          x = x + 1
    Loop
    ' Next
     ActiveCell.Offset(1, 0).Select
    'Value is found, Highlight Cell
    'Sheets(Sheetname).Range(Cell.Address).Interior.ColorIndex = 4
Else
    'Value Not found
    MsgBox "Not Found"

End If

End Sub

1 Ответ

1 голос
/ 01 мая 2020

Вы делаете вызов участника против результата Range.Find. Когда Range.Find не находит то, что ищет, он возвращает Nothing - и вы не можете позвонить .Select на Nothing.

Это именно то, что вы защищаете здесь:

Set Cell = Sheets(Sheetname).Columns("C:C").Find(...)
If Not Cell Is Nothing Then
    '...
End If

Здесь необходимо сделать то же самое:

ActiveCell.Find(i).Select

То есть объявить локальную переменную и проверить, что Range.Find успешно :

Dim somethingMeaningful As Range
Set somethingMeaningful = ActiveCell.Find(i) '<~ TODO recondiser whether ActiveCell is really needed
If Not somethingMeaningful Is Nothing Then
    somethingMeaningful.Select '<~ TODO reconsider whether this is really needed
End If

Примечание: Rubberduck (бесплатный проект надстройки VBE с открытым исходным кодом, которым я управляю) может предупреждать о таких неохраняемых вызовах Range.Find (они должны быть ранним), неявные ссылки ActiveSheet и ActiveWorkbook и другие проблемы с кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...