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, 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 esse problema (e evitar loops desnecessários), adicione uma verificação condicional 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
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.