2012-10-08 56 views
1

在我的VBA代码中,我得到一个运行时异常(比如说除以零),并在错误框中按'End'后,VBA运行时被停止。如何知道VBA运行时环境是否停止或正在运行?

在此站点中,我的全局对象正在清除。我希望这些对象保留它们的值。因为,当我重新开始时,因为这些对象是Nothing,我有问题。

VBA中是否有任何事件会在我的运行时停止时触发?或者有什么方法可以知道VBA是否仍在运行或停止?

+0

如果您的代码未运行,则VBA已停止。 :-) –

+0

:)这是真的。我需要以编程方式了解它...想知道是否有任何事件会在执行停止时被触发..或者是否有任何标志可用来决定vba是否正在运行... – Rajan

回答

1

在VBA中,未处理的异常会清除全局变量。所以将错误处理程序添加到您的VBA过程中。

以下是立即窗口中的会话记录,使用以下2个过程。

MyGlobal = "foo" 
Call DemoDivideByZero 
? Chr(39) & MyGlobal & Chr(39) 
'' 

MyGlobal = "foo" 
Call DemoDivideByZero2 
Error 11 (Division by zero) in procedure DemoDivideByZero2 
? Chr(39) & MyGlobal & Chr(39) 
'foo' 

没有一个错误处理程序的过程...

Public Sub DemoDivideByZero() 
    Debug.Print 2/0 
End Sub 

一个版本有一个错误处理...

Public Sub DemoDivideByZero2() 

    Dim strMsg As String 

On Error GoTo ErrorHandler 

    Debug.Print 2/0 

ExitHere: 
    On Error GoTo 0 
    Exit Sub 

ErrorHandler: 
    strMsg = "Error " & Err.Number & " (" & Err.Description _ 
     & ") in procedure DemoDivideByZero2" 
    Debug.Print strMsg 
    GoTo ExitHere 
End Sub 

但我不确定是否包括错误处理您的程序将足以保存您的全局变量值。我避免使用全局变量。

0

你有哪些全局对象?在启动时你需要初始化它们。

+0

我的对象是从C#组件在启动期间。现在,当由于任何运行时错误导致执行中断时,我需要再次密切关注C#组件以重置对象。这就是为什么我在VBA端查找一些钩子以知道执行实际停止的时间,以便在执行过程中停止执行期间自动调用c#组件。 – Rajan

+1

当然,您可以通过与Nothing进行比较来测试全局对象的初始化吗? (使用“is”或“is not”运算符)。 –

相关问题