VB - 等待对象创建

时间:2017-02-01 16:07:06

标签: vba excel-vba excel

我试图按照这个示例,使用标准方法从Excel外部访问RhinoScript模块(在我的案例中是Windows 10上的Excel 365)。

Dim Rhino As Object
Dim RhinoScript As Object

Set Rhino = CreateObject("Rhino4.Application")
Set RhinoScript = Rhino.GetScriptObject()

但是我遇到了一个"运行时424 - 对象要求"最后一行的错误。

问题似乎是GetScriptObject没有等待CreateObject完全完成,因为当Rhino4启动时,Windows 10的UAC将提示我允许更新程序在允许更新之前对系统进行更改GUI。如果我调试这些语句并逐行进行,以便在GetScriptObject命中之前Rhino4有时间完全启动,那么一切正常。那么,有没有办法让GetScriptObject等到Rhino4完全启动?我已经尝试设置一个循环来检查Rhino的价值(没什么?),但它会立即失效。我对VB有点新鲜,所以对可能是一个新手问题道歉。

谢谢,

马特

1 个答案:

答案 0 :(得分:5)

我对Rhino API一无所知,可能是一种更好的方法。

如果您知道运行时错误是由您所描述的内容引起的,并且Rhino.GetScriptObject 最终将成功,您可以循环直到它工作:

Dim iterations As Integer 'max value: 32,767
Do
    iterations = iterations + 1 'will *eventually* overflow if loop keeps failing
    On Error Resume Next 'switch off error handling
    Set RhinoScript = Rhino.GetScriptObject
    On Error GoTo 0 'restore error handling (IMPORTANT!)
    If Err.Number <> 0 And Err.Number <> 424 Then Err.Raise Err.Number ' rethrow
    Err.Clear
    DoEvents ' so that the host app remains responsive while the loop runs
While RhinoScript Is Nothing

如果数字不是预期的424,请注意重新引发错误;如果情况无望,那就是(试图)防止无限循环。

Nathan made a good comment关于添加针对无限循环的额外保护 - 这里通过递增计数器直到其值溢出其类型(引发运行时错误6)。如果32,768次迭代的时间太长,您还可以使用常量和If检查。

可能不是最好的解决方案,但应该工作。理想情况下,您将探索Rhino4.Application API,看看它是否公开了可用于确定实例是否“准备好”使用的任何成员。可能是IsReadyState