我正在使用我的程序的第一部分
在错误上开始
假设在我的第二部分我再次使用
在错误恢复下
第二个错误陷阱将不会被激活,因为第一个错误陷阱仍将处于活动状态.有没有办法在使用后取消激活第一个错误处理程序?
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" …Run Code Online (Sandbox Code Playgroud) 我的印象是On Error GoTo 0重置错误处理.
那么为什么似乎On error resume next没有在以下注册?
Sub GetAction()
Dim WB As Workbook
Set WB = ThisWorkbook
On Error GoTo endbit:
'raise an error
Err.Raise 69
Exit Sub
endbit:
On Error GoTo 0 '<<<reset error handling?
On Error Resume Next
WB.Sheets("x").Columns("D:T").AutoFit
MsgBox "ignored error successfully and resumed next"
End Sub
Run Code Online (Sandbox Code Playgroud) 当导入选项卡中没有文件路径时,此代码会产生错误。因此,我包含On Error Resume Next为了运行下一个循环。但是,在On Error Resume Next代码继续运行复制操作之后,这弄乱了我要复制到的选项卡。
我发现解决方案是 On Error 代码应该进入下一个循环而不是继续操作。有没有人对如何更改错误处理有任何意见?
Sub ImportBS()
Dim filePath As String
Dim SourceWb As Workbook
Dim TargetWb As Workbook
Dim Cell As Range
Dim i As Integer
Dim k As Integer
Dim Lastrow As Long
'SourceWb - Workbook were data is copied from
'TargetWb - Workbook were data is copied to and links are stored
Application.ScreenUpdating = False
Set TargetWb = Application.Workbooks("APC Refi Tracker.xlsb")
Lastrow = TargetWb.Sheets("Import").Range("F100").End(xlUp).Row - 6
For …Run Code Online (Sandbox Code Playgroud) 我花了最近两天试图更好地理解VBA错误处理,但仍然存在实际问题.下面的文字描述了我所做的一些实现,并且在描述中嵌入了一些问题.我真的在追求人们帮助我提高理解力并给我一些指导.我已经掌握了常用的基础知识,并且我正在尝试更多地关注细微的功能.
我期待你的任何答案!
重要的是要意识到在VBA中发生错误时会发生两种截然不同的事情.
错误对象是instanciated并设置了它的属性(即err.number,err.desciption,err.source等)
要执行的下一行发生变化.
接下来执行哪一行由最后执行的"On Error Goto"语句确定 - 如果有的话.
这些是独立但高度相关的主题,您将编写实际上不同但交织在一起的代码来管理它们.
当发生任何错误或您使用Err.Raise时,始终设置Err对象.即使使用了"On Error Resume next"或任何其他On错误语句.
所以这样的代码总是可以使用:
Dim i as integer
On error resume next
i = 100/0 ' raises error
if err.number <> 0 then
' respond to the error
end if
Run Code Online (Sandbox Code Playgroud)
非常重要的是要意识到当错误对象的err.number值为非零时,会引发异常,如果您尝试执行任何"On Error Goto"语句,那么这样做会引发错误并执行被传递给任何调用当前过程的代码.(或任何代码未调用的程序通常的VBA错误对话).因此,在下面的示例场景中,"On Error Goto ALabel1"不会将下一行更改为Label1:上面的行.
例如
Sub ErrorTest()
Dim dblValue As Double
On Error GoTo ErrHandler1
dblValue = 1 / 0
ErrHandler1:
debug.print "Exception Caught"
debug.print Err.Number
On Error GoTo ALabel1
dblValue = 1 / 0 '' …Run Code Online (Sandbox Code Playgroud)