usar tipos manejo manejar funcion errores error como captura ms-access

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