我正在呼叫第三方远程调用来获取数据.调用此函数后,数据将从单元格(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
Run Code Online (Sandbox Code Playgroud)
但是,我的代码会在while循环中挂起.那么如何处理这个问题呢?
你目前在while循环中旋转的方法并不是一个好主意,因为它消耗了所有可用的资源来做......没有.或者更确切地说,它cells(10,1)<>"result"尽可能快地执行比较.并且用户界面在此期间挂起.
简而言之,您发现VBA不适合异步或多线程编程.
值得庆幸的是Excel确实为您提供了一种内置的方法来完成此任务,只需要一点点努力:Application.OnTime方法.它允许您安排对方法的延迟调用,同时保持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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5997 次 |
| 最近记录: |