Я использую приведенный ниже код несколько раз в одном сабвуфере для разных значений, а не только "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

2 ответа2

1

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

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

потому что 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
0

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

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

В ячейке "А1" и в ячейке "А2" должна быть некоторая информация, например заголовки столбцов. .End(xlDown) и .Offset(1,0) найдет первую пустую строку для вставки информации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .