Estoy usando el siguiente código varias veces en un subtítulo para diferentes valores, no solo "CPNEC". Funciona bien cuando hay un rango con ese valor en la hoja de cálculo, pero cuando lo supera, el valor no existe. Esta es una rutina que quiero usar todos los meses donde a veces no habrá ningún valor determinado en mis datos, por lo que los necesito para poder pasar al siguiente valor sin caer. ¿Alguien puede ayudarme 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
Respuesta1
Cuando no existe ningún valor coincidente, nStart
mantiene el valor predeterminado de 0
. Esto da como resultado un error en esta línea.
If Range("a" & nRow).Value <> "CPNEC" Then
porque A0
no es una referencia de rango válida. Para solucionar este problema (y ahorrarse algunos bucles innecesarios), agregue una verificación condicional nStart = 0
después del primer bucle. Si es cero, salga del sub; de lo contrario, continúe. Esto debería evitar errores que detengan su código cuando no se encuentre ninguna coincidencia.
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
Respuesta2
Excelll lo explica. Pero como maneja bien los bucles for, también puede buscar la cadena en cada celda y, si la macro la encuentra, copiar la fila completa en la hoja de trabajo correcta. No recibirá un error si el valor no existe.
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
Debería haber algo de información en la celda "A1" y en la celda "A2", como los títulos de las columnas. .End(xlDown)
y .Offset(1,0)
encontrará la primera fila vacía para pegar la información.