【问题标题】:Catch event trigger from external application in Excel VBA在 Excel VBA 中从外部应用程序捕获事件触发器
【发布时间】:2021-12-01 21:03:28
【问题描述】:

我使用 VBA 来自动化最近更改了其 COM API 的外部应用程序。新的 API 异步加载文件(以前是同步的),所以当我尝试加载文件时,我需要等待文件加载触发器才能继续。

我已经尝试过 Microsoft 网站(EX1EX2)上列出的方法,这些方法也是 StackOverflow 上 accepted answer 的一部分。

下面是我在一个名为 UCExternal 的类模块中包含外部应用程序对象的代码:

Public WithEvents obj As External.Application
Private fileLoaded As Boolean

Private Sub obj_OnFileLoaded(ByVal lLayer As Long, ByVal strUNCPath As String)
    Debug.Print lLayer
    Debug.Print strUNCPath
    fileLoaded = True
End Sub

Public Sub LoadSingleFile(fileStr As String)
    fileLoaded = False
    
    obj.LoadFile 0, fileStr
    
    Do
        DoEvents
    Loop Until fileLoaded
    
End Sub

然后这就是我在普通代码模块中使用工作表上的按钮运行的内容:

Sub TryLoadFile()

    Dim extObj as New UCExternal

    set extObj.obj = CreateObject("External.Application")
    filePath = "path/to/file"
    extObj.LoadSingleFile filePath

End Sub

事件代码似乎永远不会触发,而是 Do Loop 只会运行直到 Excel 崩溃。不知道有没有办法确认应用程序确实发送了事件触发器?我已经阅读了该应用程序的新文档,这就是他们说要等待的事件。我也向他们寻求帮助,但我不确定是否有更一般的东西我可能遗漏了。我过去没有处理过 Excel 外部的事件。如果我只是使用调试器单步执行它并手动退出 Do Loop,最终在加载的文件上工作的其余代码也能正常工作,所以它确实会加载文件。

【问题讨论】:

    标签: excel vba event-handling


    【解决方案1】:

    extObj 需要在TryLoadFile 之外声明,否则它将超出范围并在TryLoadFile 完成后立即被清除

    Dim extObj as New UCExternal
    
    Sub TryLoadFile()
        Set extObj = New UCExternal
        set extObj.obj = CreateObject("External.Application")
        filePath = "path/to/file"
        extObj.LoadSingleFile filePath
    End Sub
    

    【讨论】:

    • 即便如此,它应该在事件超出范围之前触发该事件。如果它进入事件触发子,我会停止,但它永远不会。范围不应改变这一点。我试过以防万一,但没有任何改变。
    • 对不起,我没有仔细研究你的类实现。这有点违背异步编程的原则——通常你会在加载完成后使用回调来运行该步骤,但这在 VBA 中比在其他一些语言中更棘手。尝试使用 do 事件放弃循环,然后在 obj_OnFileLoaded 处理程序中放置一个 Debug.Print 或 MsgBox 并查看它是否触发。
    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多