如何在VBA中执行长时间运行的进程而无需使用PC抓取?

我有一个创建COM对象实例的VBA应用程序,然后不断轮询对象DataReady属性以查看是否有新数据。 当新数据可用时,它将数据粘贴到电子表格中。 问题在于这个宏(vba子例程)不断运行,这会导致爬行速度变慢,并使进程运行时计算机有些不可用。 有没有办法让我可以在单独的线程上开始这个过程,或者做一些类似于.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程序中侦听这些事件?


你有没有尝试过使用DoEvents?

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

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

如果这不是一个选项(不能控制COM对象等),那么你将需要旋转CPU。 您所能做的只是增加检查DataReady属性之间的时间间隔,您在第二个选项中已经发现该属性。 我想知道如何增加间隔而不会丢失功能并将其留在那里。


试试这个,看看事情是否改善。

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)
链接地址: http://www.djcxy.com/p/37991.html

上一篇: How can I execute a long running process in VBA without making pc crawl?

下一篇: Sending formatted Lotus Notes rich text email from Excel VBA