Ошибка, если значение отсутствует

Ошибка, если значение отсутствует

Я использую код ниже несколько раз в одной подпрограмме для разных значений, а не только "CPNEC". Он отлично работает, когда в таблице есть диапазон с этим значением, но если он выходит за его пределы, то значение не существует. Это процедура, которую я хочу использовать каждый месяц, когда в моих данных иногда не будет определенного значения, поэтому мне нужно, чтобы он мог перейти к следующему значению без выхода за пределы. Может ли кто-нибудь мне помочь, пожалуйста.

Sub SelectCPNEC()
    ' Figure out where the "CPNEC" data starts.
    For nRow = 1 To 65536
    If Range("A" & nRow).Value = "CPNEC" Then
    nStart = nRow
    Exit For
    End If
    Next nRow

    ' Figure out where the "CPNEC" data ends.
    For nRow = nStart To 65536
    If Range("a" & nRow).Value <> "CPNEC" Then
    nEnd = nRow
    Exit For
    End If
    Next nRow
    nEnd = nEnd - 1

    'Select the range required

    Range("A" & nStart & ":G" & nEnd).Select

    'Now copy and paste into the right worksheet

    Selection.Copy
    Application.Goto ActiveWorkbook.Sheets("CPNEC").Cells(1, 1)
    ActiveSheet.Paste

End Sub

решение1

Если совпадающего значения не существует, nStartсохраняет значение по умолчанию 0. Это приводит к ошибке в этой строке.

If Range("a" & nRow).Value <> "CPNEC" Then

because A0не является допустимой ссылкой на диапазон. Чтобы обойти эту проблему (и избавить себя от ненужного цикла), добавьте условную проверку nStart = 0после первого цикла. Если это ноль, выйдите из подпрограммы; в противном случае продолжите. Это должно избежать ошибок, останавливающих ваш код, когда совпадение не найдено.

Sub SelectCPNEC()
    ' Figure out where the "CPNEC" data starts.
    For nRow = 1 To 65536
    If Range("A" & nRow).Value = "CPNEC" Then
    nStart = nRow
    Exit For
    End If
    Next nRow

    If nStart > 0 Then
        ' Figure out where the "CPNEC" data ends.
        For nRow = nStart To 65536
        If Range("A" & nRow).Value <> "CPNEC" Then
        nEnd = nRow
        Exit For
        End If
        Next nRow
        nEnd = nEnd - 1

        'Select the range required

        Range("A" & nStart & ":G" & nEnd).Select

        'Now copy and paste into the right worksheet

        Selection.Copy
        Application.Goto ActiveWorkbook.Sheets("CPNEC").Cells(1, 1)
        ActiveSheet.Paste
    End If
End Sub

решение2

Excellll объясняет это. Но поскольку вы хорошо справляетесь с циклами for, вы также можете искать строку в каждой ячейке и, если макрос ее найдет, копировать всю строку на нужный лист. Вы не получите ошибку, если значение не существует.

For Each cell In Range("A1: A65536")
    If cell.Value = "CPNEC" Then
        cell.EntireRow.Copy Workbooks.Open("otherWorkbook.xls").Sheets("Sheet1").Range("A1").End(xlDown).Offset(1, 0)
    End If
Next cell

В ячейке «A1» и ячейке «A2» должна быть какая-то информация, например заголовки столбцов. .End(xlDown)Затем .Offset(1,0)будет найдена первая пустая строка для вставки информации.

Связанный контент