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

How to trap Escape key during ADODB SELECT (Excel VBA)

我在 Excel 中有一些 VBA 代码,它使用 rst.Open(其中 rst 是一个 ADODB.RecordSet)。一切正常。我在代码中的几乎每个例程中都有一些标准的错误处理,并且一切正常,通过调用 MsgBox 等优雅地处理错误。

我的问题是,如果用户在 SELECT 期间按 ESCAPE(即在 rst.Open 正在执行时),那么 Excel/VBA 似乎 完全忽略错误处理并显示标准Code execution has been interruptedContinue/End/Debug/Help按钮,就好像根本没有错误处理一样。好像要确认这一点,如果我在这个错误对话框中单击 "Debug",它会直接将我发送到行 after rst.Open 行(像往常一样以黄色突出显示);如果我然后转到 VBE Immediate Window 并键入 print Err.number 它 returns 零——即没有错误——而不是我预期的标准错误 18。

请注意,程序开始执行时首先要做的事情之一是 Application.EnableCancelKey = xlErrorHandler,但是,加上此例程中的 On Error Goto ErrHandler,似乎完全被忽略了。

我尝试过的其他事情:

None 其中有效。几乎就像 rst.Open 操作 "outside" 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.

msdn:

The EnableCancelKey property is always reset to xlInterrupt whenever Microsoft Excel returns to the idle state and there's no code running. To trap or disable cancellation in your procedure, you must explicitly change the EnableCancelKey property every time the procedure is called.