我在Excel中有一些VBA代码,它使用rst.Open
(其中rst
是ADODB.RecordSet
)来建立ADODB连接并向Access数据库运行SELECT查询。一切都很好。我在代码中的每个例程中都有一些标准的错误处理,并且它们也都可以正常工作,可以通过调用MsgBox
来优雅地处理错误,等等。
我的问题是,如果用户在SELECT期间(即在执行rst.Open
时按下ESCAPE,则Excel / VBA似乎会 完全忽略 )错误处理并使用Code execution has been interrupted
按钮显示标准的Continue/End/Debug/Help
按钮,就好像根本没有错误处理一样。好像要确认这一点,如果我在此错误对话框中单击“调试”,它会将我直接发送到rst.Open
行的 之后(突出显示为照常黄色);如果然后转到VBE立即窗口并键入print Err.number
,它将返回零(即无错误),而不是我期望的标准错误18。
请注意,程序开始执行时要做的第一件事是Application.EnableCancelKey = xlErrorHandler
,但是,加上此例程中的On Error Goto ErrHandler
,似乎被完全忽略了。
我尝试过的其他事情:
Application.OnKey "{ESC}",""
禁用ESC键,并在Application.OnKey "{ESC}"
之后立即使用rst.Open
恢复ESC键-当用户按下ESCAPE然后进行调试时,第二行将突出显示!Application.Interactive = False
之前使用rst.Open
,然后立即恢复。Userform_KeyDown
并寻找vbKeyEscape
。这些都不起作用。好像rst.Open
在Excel VBA环境“外部”操作,并且在“ ADODB”环境中按下ESCAPE,ADODB向Excel报告已发生中断。
有人可以帮忙吗?我并不一定要防止用户中断SELECT(因为这可能是不明智的选择!),但是我希望能够在没有标准丑陋消息的情况下优雅地处理该中断,从而使他们没有机会进入VBA。
我认为向您展示代码无济于事,但是无论如何这里都是这样:
Private Sub RunSelectQuery(ByRef rst As ADODB.Recordset, _
ByVal strSql As String, ByRef cnn As ADODB.Connection)
Dim booEof As Boolean
On Error GoTo ErrHandler
rst.Open strSql, cnn, adOpenForwardOnly, adLockReadOnly
booEof = rst.EOF
ErrHandler: ' -- Error handling and Routine termination.
If Err.Number <> 0 Then If DspErr() Then Stop: Resume Else End
End Sub
正如我说的,如果用户在rst.Open语句中没有按ESCAPE,这将非常有效。如果他们确实按ESCAPE键,则会出现难看的错误消息,并且当您单击“调试”时,它会突出显示行booEof =
。顺便说一下,那行可能是任何东西-我在那儿插入了其他行,并且“调试”按钮始终将我带到rst.Open
行下面的下一个可执行行。
与Office Professional Plus 2016,Windows 10一起运行。
答案 0 :(得分:1)
msdn:
无论何时,EnableCancelKey属性始终重置为xlInterrupt Microsoft Excel返回到空闲状态,并且没有任何代码在运行。 要捕获或禁用过程中的取消,必须明确 每次执行该过程时,都要更改EnableCancelKey属性 叫。