Error cuando el valor no está presente

Error cuando el valor no está presente

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, nStartmantiene el valor predeterminado de 0. Esto da como resultado un error en esta línea.

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

porque A0no es una referencia de rango válida. Para solucionar este problema (y ahorrarse algunos bucles innecesarios), agregue una verificación condicional nStart = 0despué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.

información relacionada