我正在尝试按照示例使用标准方法从Excel(在我的情况下为Windows 10的Excel 365)从外部访问RhinoScript模块的示例。

Dim Rhino As Object
Dim RhinoScript As Object

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


但是我在最后一行遇到了“运行时424-必需对象”错误。

问题似乎是GetScriptObject没有等待CreateObject完全完成,因为在Rhino4启动时,Windows 10的UAC会提示我允许Updater对系统进行更改,然后再允许其启动GUI。如果我调试这些语句并逐行执行,以便Rhino4有足够的时间在GetScriptObject命中之前完全启动,则一切正常。那么,有没有办法让GetScriptObject等到Rhino4完全启动呢?我尝试设置一个循环来检查Rhino的值(什么?),但是它立即失败了。我是VB的新手,所以为可能是新手的问题表示歉意。

谢谢,

马特

最佳答案

我对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

09-03 18:19