我正在调用第三方远程调用以获取数据。调用此函数后,数据将从单元格(1,1)填充到单元格(10,1)。我的代码是这样的
application.caculation = xlmanual
cells(1,1) = "some remotefunction"
application.calculate
while cells(10,1)<>"result"
wend
'if it goes here means we get the data
deal_with_data
但是,我的代码会在while循环中挂起。那么如何处理这个问题呢? 当前在while循环中旋转的方法不是一个好主意,因为它消耗了所有可用的资源来做…什么都不做。或者更确切地说,它尽可能快地一次又一次地执行比较cells(10,1)<>"result"
。同时,用户界面也挂起了。
简而言之,您会发现VBA不适合异步或多线程编程。
值得庆幸的是,Excel给了你一个内置的方法来完成这一点,只需要一点努力:应用程序。定时方法。它允许您安排对方法的延迟调用,同时保持UI(和任何其他VBA代码)响应性和可用性。你可以用它来实现一种定时器。
这是针对您的情况的基本方法。它每1秒检查一次测试单元格的值。如果值没有改变,它会安排自己在另一秒内再次检查。如果值为"result",则调用另一个子对象,在子对象中放置处理结果的代码。
Public Sub CallRemoteFunc()
Application.Calculation = xlManual
Cells(1, 1) = "some remotefunction"
Application.Calculate
Call WaitForUpdate
End Sub
Public Sub WaitForUpdate()
If Cells(10, 1) <> "result" Then
Debug.Print "Still waiting"
Application.OnTime Now + TimeValue("00:00:01"), WaitForUpdate
Else
Call DoStuffWithData
End If
End Sub
当vba代码运行时,我不希望任何其他单元格改变,除非你在循环中做一些事情。
当你想检查最后一个单元格时,我会使用if函数并调用这个宏。如果你需要,我可以详细说明。
或者,如果您设想在循环运行时数据发生变化,则在循环中使用DoEvents
vba函数/方法。这个功能将使,我相信,应用程序仍然运行和更新单元格,而这个宏正在运行。
经过一些测试:我现在怀疑DoEvents
函数将最适合您。