我正在呼叫第三方远程调用来获取数据。 调用此函数后,数据将从单元格(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循环中挂起。 那么如何处理这个问题?
答案 0 :(得分:7)
你目前在while循环中旋转的方法并不是一个好主意,因为它消耗了所有可用的资源来做......没有。或者更确切地说,它尽可能快地一遍又一遍地执行比较cells(10,1)<>"result"
。并且用户界面在此期间挂起。
简而言之,您发现VBA不适合异步或多线程编程。
值得庆幸的是,Excel确实为您提供了一种内置的方法来完成此任务,只需付出一点努力:Application.OnTime method。它允许您安排对方法的延迟调用,同时保持UI(和任何其他VBA代码)的响应和可用。您可以使用它来实现一种计时器。
以下是您案例的基本方法。它每1秒检查一次测试单元的值。如果值没有改变,它会安排自己再次检查。如果值为“result”,则调用另一个sub,您可以在其中放置代码来处理结果。
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
答案 1 :(得分:1)
当vba代码正在运行时,我不希望任何其他单元格改变,除非你在循环中做某事。
我要么使用if函数,要在检查最后一个单元格时调用此宏。如果你需要,我可以详细说明。
或者,如果您设想在循环运行时数据发生变化,请在循环中使用DoEvents
vba函数/方法。我相信,此功能将启用应用程序,以便在此宏运行时仍然运行和更新单元格。
经过一些测试:我现在怀疑DoEvents
功能最适合您。