ms access - tipos - Acceso a VBA: ¿Es posible restablecer el manejo de errores?
tipos de errores en vba (4)
Casi siempre es mejor evitar errores, en lugar de manejarlos. Por ejemplo:
Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True
''On Error GoTo Openwb ''
''wbExists = False ''
If Dir("C:/REPORT3.xls") = "" Then
objexcel.Workbooks.Add
Set wbexcel = objexcel.ActiveWorkbook
Set objSht = wbexcel.Worksheets("Sheet1")
Else
Set wbexcel = objexcel.Workbooks.Open("C:/REPORT3.xls")
Set objSht = wbexcel.Worksheets("Sheet1")
End If
objSht.Activate
''wbExists = True ''
Estoy usando en la primera parte de mi programa
por error, vaya a comenzar
Supongamos que en mi segunda parte vuelvo a usar
en error reanudar siguiente
Esta segunda trampa de error no se activará ya que la primera todavía estará activa. ¿Hay alguna manera de desactivar el primer controlador de errores después de que se haya utilizado?
Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True
On Error GoTo Openwb
wbExists = False
Set wbexcel = objexcel.Workbooks.Open("C:/REPORT3.xls")
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate
wbExists = True
Openwb:
On Error GoTo 0
If Not wbExists Then
objexcel.Workbooks.Add
Set wbexcel = objexcel.ActiveWorkbook
Set objSht = wbexcel.Worksheets("Sheet1")
End If
On Error GoTo 0
Set db = DBEngine.opendatabase("C:/book.mdb")
Set rs = db.OpenRecordset("records")
Set rs2 = CreateObject("ADODB.Recordset")
rs2.ActiveConnection = CurrentProject.Connection
For Each tdf In CurrentDb.TableDefs
If Left(tdf.Name, 4) <> "MSys" Then
rs.MoveFirst
strsql = "SELECT * From [" & tdf.Name & "] WHERE s=15 "
Do While Not rs.EOF
On Error Resume Next
rs2.Open strsql
Tras la ejecución de la última declaración, quiero ignorar el error y pasar a la siguiente tabla, pero el manejo de errores no parece funcionar.
Debe borrar el error. Trata de poner este código en:
If Err.Number > 0 Then
Err.Clear
End If
También puede usar Err.Number para manejar casos de error específicos.
On error goto 0
dar la mano a Visual Basic para el tratamiento de error (en el cuadro de mensaje general)
On error goto label
volverá a dirigir su código a la etiqueta:
On error resume next
ignorará el error y continuará
Resume next
redirigir el código a la siguiente línea después de que se produce el error
significa que combinaciones de instrucciones tales como
On Error goto 0
...
On Error goto 0
sin sentido
Y si desea redirigir una instrucción "en caso de error", tendrá que hacerlo de esta manera:
Do While Not rs.EOF
On Error Resume Next
rs2.Open strsql
On error Goto 0
rs2.moveNext
Loop
Si desea redirigir un error a una etiqueta (para tratamiento o lo que sea) y luego volver al código donde ocurrió el error, debe escribir algo como:
On error goto label
...
...
On error goto 0
exit sub (or function)
label:
....
resume next
end function
Pero realmente te aconsejo que seas más riguroso en la gestión de errores. Primero deberías ser capaz de hacer algo como eso:
Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True
On Error GoTo error_Treatment
wbExists = False
Set wbexcel = objexcel.Workbooks.Open("C:/REPORT3.xls")
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate
wbExists = True
On error GoTo 0
Set db = DBEngine.opendatabase("C:/book.mdb")
Set rs = db.OpenRecordset("records")
Set rs2 = CreateObject("ADODB.Recordset")
rs2.ActiveConnection = CurrentProject.Connection
For Each tdf In CurrentDb.TableDefs
....
''there are a number of potential errors here in your code''
''you should make sure that rs2 is closed before reopening it with a new instruction''
''etc.''
Next tdf
Exit sub
error_treatment:
SELECT Case err.number
Case **** ''(the err.number raised when the file is not found)''
objexcel.Workbooks.Add
Set wbexcel = objexcel.ActiveWorkbook
Set objSht = wbexcel.Worksheets("Sheet1")
Resume next ''go back to the code''
Case **** ''(the recordset cannot be opened)''
....
....
Resume next ''go back to the code''
Case **** ''(whatever other error to treat)''
....
....
Resume next ''go back to the code''
Case Else
debug.print err.number, err.description ''(check if .description is a property of the error object)''
''your error will be displayed in the immediate windows of VBA.''
''You can understand it and correct your code until it runs''
End select
End sub
El siguiente paso será anticipar los errores en su código para que no se genere el error. Por ejemplo, puede escribir una función genérica como esta:
Public function fileExists (myFileName) as Boolean
A continuación, puede aprovechar esta función en su código probando la existencia de su archivo xls:
if fileExists("C:/REPORT3.xls") Then
Set wbexcel = objexcel.Workbooks.Open("C:/REPORT3.xls")
Else
objexcel.Workbooks.Add
Set wbexcel = objexcel.ActiveWorkbook
Endif
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate
Ya no necesitas la variable wbExist ...
De la misma manera, debe anticipar el caso donde su conjunto de registros no tiene registros. Anotar rs.MoveFirst antes de probar podría generar un error. Entonces debes escribir
If rs.EOF and rs.BOF then
Else
rs.moveFirst
Do while not rs.EOF
rs.moveNext
Loop
Endif
tratar
On Error Goto 0
Para obtener ayuda adicional, consulte aquí: http://msdn.microsoft.com/en-us/library/bb258159.aspx