Erro quando o valor não está presente

Erro quando o valor não está presente

Estou usando o código abaixo várias vezes em um sub para valores diferentes, não apenas "CPNEC". Funciona bem onde existe um intervalo com aquele valor na planilha mas cai sobre ele o valor não existe. Esta é uma rotina que quero usar todos os meses, onde às vezes não haverá nenhum valor específico em meus dados, então preciso que ela possa passar para o próximo valor sem cair. Alguém pode me ajudar por favor.

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

Responder1

Quando não existe nenhum valor correspondente, nStartmantém o valor padrão de 0. Isso resulta em um erro nesta linha.

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

porque A0não é uma referência de intervalo válida. Para contornar esse problema (e evitar loops desnecessários), adicione uma verificação condicional nStart = 0após o primeiro loop. Se for zero, saia do sub; caso contrário, continue. Isso deve evitar erros ao interromper seu código quando nenhuma correspondência for encontrada.

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

Responder2

Excelente explica. Mas como você lida bem com loops for, você também pode procurar a string em cada célula e, se a macro a encontrar, copiar a linha inteira para a planilha correta. Você não receberá um erro se o valor não existir.

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

Deve haver algumas informações na célula “A1” e na célula “A2”, como os títulos das colunas. .End(xlDown)e .Offset(1,0)encontrará a primeira linha vazia para colar as informações.

informação relacionada