visual mensaje manejo manejar errores error captura excel vba excel-vba error-handling

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