Erro quando o valor não está presente

0

Estou usando o código abaixo várias vezes em um sub para valores diferentes, não apenas "CPNEC". Ele funciona bem onde há um intervalo com esse valor na planilha, mas cai sobre ele, o valor não existe. Esta é uma rotina que eu quero usar todo mês, onde às vezes não haverá um certo valor em meus dados, então eu preciso que seja capaz de 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
    
por Emma 21.07.2014 / 11:48

2 respostas

1

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

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

porque A0 não é uma referência de intervalo válida. Para contornar este problema (e salvar alguns loopings desnecessários), adicione uma verificação condicional para nStart = 0 apó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
    
por 21.07.2014 / 18:19
0

Excellll explica isso. Mas, como você lida bem com os loops, também é possível procurar a string em cada célula e, se a macro encontrar, copie 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 alguma informação na célula "A1" e na célula "A2", como os títulos das colunas. .End(xlDown) e .Offset(1,0) encontrarão a primeira linha vazia para colar as informações.

    
por 22.07.2014 / 00:02