mensaje - VBA Excel simple manejo de errores
vba excel on error go to (5)
He encontrado que la mayoría de las veces, la solución recomendada es agregar (al reanudar el error a continuación) antes de configurar la forma, ya que aparece un error que dice que no existe.
¡NO!
La forma recomendada de manejar los errores de tiempo de ejecución es no empujarlos debajo de la alfombra y continuar la ejecución como si no hubiera pasado nada, lo cual es exactamente lo que On Error Resume Next
.
La forma más sencilla de evitar los errores de tiempo de ejecución es verificar las condiciones de error y evitar la ejecución de código que dé como resultado una tasa de error del 100%, como intentar ejecutar un método en una referencia de objeto que no es Nothing
:
For i = 1 To (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
If Not shp Is Nothing Then shp.Delete
Next
En los casos en los que no puede verificar las condiciones de error y debe manejar los errores, la forma recomendada es manejarlos :
Private Sub DoSomething()
On Error GoTo CleanFail
''...code...
CleanExit:
''cleanup code here
Exit Sub
CleanFail:
If Err.Number = 9 Then ''subscript out of range
Err.Clear
Resume Next
Else
MsgBox Err.Description
Resume CleanExit
End If
End Sub
He buscado en línea tanto como pude (excepto por el sitio web de soporte de Microsoft, que está bloqueado en el trabajo por alguna razón). Estoy tratando de simplemente saltar un error. Mi código escrito aquí está simplificado pero debería funcionar de la misma manera.
Qué se supone que haga mi código: uno de mis subs crea formas en un bucle y las nombra (btn_1, btn_2, etc.) Pero antes de crearlos, llama a un sub que intenta eliminarlos para no crear duplicados. Este sub bucle pasa por (btn_1, btn_2, etc.) y elimina las formas usando:
for i = 1 to (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
Por supuesto, sucede que la forma no se puede eliminar porque simplemente no existe. He encontrado que la mayoría de las veces, la solución recomendada es agregar (al reanudar el error a continuación) antes de configurar la forma, ya que aparece un error que dice que no existe. Lo he intentado dentro del bucle, antes del bucle, etc., así:
for i = 1 to (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
Por lo que tengo entendido, se supone que debe ir en bucle si la forma no existe, pero sigo obteniendo el mismo error, ya sea que agregué o no la siguiente opción: Reanudar error. ¿Qué estoy haciendo mal?
EDITAR: No hay error cuando las formas existen.
En lugar de intentar borrar formas a ciegas y omitir errores, repase la lista de formas conocidas y elimínelas. Entonces, no tiene que preocuparse por un On Error Resume Next
que a menudo termina siendo abusado.
Sub Test(TheSheet As Worksheet)
Dim Shp as Shape
For Each Shp in TheSheet.Shapes
If left(Shp.Name, 4) = "btn_" Then
Shp.Delete
End if
Next
End Sub
Si desea eliminar todas las formas, elimine la instrucción If
. Si desea eliminar un número de formas con nombres diferentes, modifique la instrucción If
adecuadamente.
No hay nada MAL en usar OERN ( On Error Resume Next ) siempre que entienda lo que está haciendo y cómo afectará su código.
En tu caso es perfectamente normal utilizar OERN.
Dim shp As Shape
For i = 1 To (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.Delete
On Error GoTo 0
Next
Al mismo tiempo, asegúrese de no hacer algo como
On Error Resume Next
<Your Entire Procedure>
On Error GoTo 0
Esto suprimirá TODOS los errores. Use el manejo adecuado de errores como lo muestra Matt
Editar :
Aquí hay otro hermoso ejemplo sobre cómo usar OERN. Esta función verifica si existe una hoja de trabajo en particular o no.
Function DoesWSExist(wsName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Sheets(wsName)
On Error GoTo 0
If Not ws Is Nothing Then DoesWSExist = True
End Function
Si lo desea, también puede recorrer todas las hojas para verificar si la hoja existe o no.
Parece que tiene la opción de captura errónea de errores mal establecida. Dentro del Editor de VBA, seleccione Tools -> Options
. En la ventana que se abre, seleccione la General tab
y seleccione el botón de opción Break on Unhandled Errors
. Esto debería permitir a Excel procesar correctamente el comando On Error Resume Next
.
Sospecho que tienes seleccionado Break on All Errors
.
Tratar:
On Error Resume Next
for i = 1 to (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
if err<>0 then err.clear else shp.delete
next
on Error Goto 0