【问题标题】:How can I execute a long running process in VBA without making pc crawl?如何在 VBA 中执行长时间运行的进程而不进行 pc 爬网?
【发布时间】:2010-08-09 13:25:20
【问题描述】:

我有一个 VBA 应用程序,它创建一个 COM 对象的实例,然后不断地轮询对象的 DataReady 属性以查看是否有新数据。当有新数据可用时,它会将数据粘贴到电子表格中。问题是这个宏(vba 子例程)不断运行,这会减慢 excel 的速度,并使计算机在进程运行时有些无法使用。有没有一种方法可以让我在单独的线程上启动这个进程,或者做一个 .NET 后台工作者之类的事情?

我的两次尝试是使用这样的 while 循环..

While(True)
    If(myObject.DataReady)
        Do some stuff here
    End If
WEnd

然后是这个

Sub GrabNewPoint()
If (myModule.NewDataReady_Receiver = True) Then
            Do some stuff here...
End If

If (StopTest = False) Then
    NextTime = Now() + TimeValue("00:00:20")
    Application.OnTime NextTime, "GrabNewPoint"
End If

第二次尝试肯定会更好,但它仍然会大大减慢速度。有没有更好的解决方案?

我的 COM 对象是我用 C# 编写的类库。当数据准备好时,我可以添加在类库中触发的事件,但是如何在 VBA 程序中监听这些事件?

【问题讨论】:

    标签: excel vba long-running-processes


    【解决方案1】:

    您是否尝试过使用 DoEvents?

    While(True)
        If(myObject.DataReady)
            'your code here
        End If
        DoEvents
    WEnd
    

    【讨论】:

      【解决方案2】:

      我认为最好的解决方案是让 COM 对象在数据准备好时引发 VBA 事件。

      如果这不是一个选项(无法控制 COM 对象等),那么您将不得不旋转 CPU。您所能做的就是增加检查 DataReady 属性之间的时间间隔,您已经在第二个选项中发现了该属性。我会弄清楚你可以在不失去功能的情况下增加间隔有多胖,然后把它留在那里。

      【讨论】:

      • 你能给我一些关于如何从 COM 对象引发 VBA 事件以及如何让我的 vba 代码响应事件的提示吗?
      • 我不得不承认,我不知道。不过,对于这个网站来说,这听起来像是一个很好的问题......
      【解决方案3】:

      试试这个,看看有没有改善。

      Just pause, let the CPU fly...  key is to trap it here so it releases as long as you like
          Public Sub App_Hard_Wait_DoEvents(dblSeconds As Double)
            If dblSeconds = 0 Then Exit Sub
            Dim varStart As Variant
            varStart = Timer
            Do While Timer < (varStart + dblSeconds)
              DoEvents
            Loop
          End Sub
      
      
          DO
           Call App_Hard_Wair_DoEvents(10)
          loop until (myObject.DataReady)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多