运行以下宏。
Sub Macro1()
MsgBox "Hello"
End Sub
当弹出MsgBox时,按键盘上的Ctrl+C键。
打开 NotePad 文件并按键盘上的 Ctrl+V 键。
如您所见,您可以从 MsgBox 复制并粘贴到 NotePad 文件中。
现在让我们做第二个场景。
运行以下宏。
Sub Macro2()
Dim myNumber As Integer
myNumber = 20
Dim yourNumber As Integer
yourNumber = 0
'In mathematics, a number can not be divided by zero. So the following code must throw an error.
Dim resultNumber As Integer
resultNumber = myNumber / yourNumber
End Sub
当弹出MsgBox时,按键盘上的Ctrl+C键。
打开 NotePad 文件并按键盘上的 Ctrl+V 键。
如您所见,您无法从 MsgBox 复制并粘贴到 NotePad 文件中。
我的问题:如何将运行时引擎发送的错误消息复制到Windows剪贴板,正如我在第二个场景中给出的示例。
嗯,你可以从
MsgBox
复制消息,但在第二种情况下,这不是MsgBox的问题。这是编译器发送的消息,提及错误号和错误描述。
要捕获相应的数据,您应该以下面的方式调整代码(将它们放置在普通的 MsgBox 中):
Sub Macro234()
Dim myNumber As Integer
myNumber = 20
Dim yourNumber As Integer
yourNumber = 0
'In mathematics, a number can not be divided by zero. So the following code must throw an error.
Dim resultNumber As Integer
On Error Resume Next
resultNumber = myNumber / yourNumber
If Err.number <> 0 Then
MsgBox "Error number: " & Err.number & vbCrLf & " Error Description: " & Err.Description
End If
On Error GoTo 0
End Sub
上面的代码改编只是回答了你的问题,但在现实生活中,有真正的需求,我不明白为什么需要这样的问题?理论上,您应该使用能够解决可能出现的问题的错误处理机制。您可以使用
Err.Number
使代码根据它向合适的方向运行。例如,If Err.Number = 5 then MsgBox "The denominator must be different of zero,,,": Exit sub
。
消息“除以零”不是由编译器发送的,而是由VBA运行时引擎发送的。可以使用 Ctrl+C 复制编译器消息(例如“找不到变量”、“如果没有 End If 则阻止”),但不能复制运行时错误(不要问我为什么)。
了解差异:编译器错误意味着您的代码的语法无效并且无法执行。这是在代码执行之前已知的。运行时错误是指在代码执行期间发生且无法提前得知的错误:丢失文件、无效计算(如除以 0)、数字溢出、未初始化的对象变量等等。 捕获运行时错误的常用方法是使用Error Handler
。这是使用On Error...
语句完成的。当发生运行时错误时,您可以使用
err
对象来获取错误编号和文本。在您的情况下,您的代码不会处理该错误。 VBA运行时会在一个特殊的消息框中显示错误信息并询问你该怎么做(相关选项是“结束”和“调试”)。
当您选择“结束”时,VBA 进程将完全停止,并且编程上下文将丢失。所有变量都被重置,其中包括 err
? err.Number, err.Description
(然后从那里复制信息)。
在您回答该问题之前,消息框将保持打开状态(作为模式窗口)并且在您回答问题之前,无法在 Excel 或 VBA 中执行任何操作。唯一的方法是使用任何可以读取所有窗口的所有控件内容的第三方工具,但我怀疑您是否想要这样做。