如何在ADODB SELECT(Excel VBA)期间捕获转义键

时间:2018-10-29 10:24:48

标签: excel vba error-handling adodb

我在Excel中有一些VBA代码,它使用rst.Open(其中rstADODB.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一起运行。

1 个答案:

答案 0 :(得分:1)

msdn:

  

无论何时,EnableCancelKey属性始终重置为xlInterrupt   Microsoft Excel返回到空闲状态,并且没有任何代码在运行。   要捕获或禁用过程中的取消,必须明确   每次执行该过程时,都要更改EnableCancelKey属性   叫。