如何让excel"等待"细胞的价值改变?

use*_*453 4 excel vba

我正在呼叫第三方远程调用来获取数据.调用此函数后,数据将从单元格(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循环中挂起.那么如何处理这个问题呢?

Jos*_*nig 7

你目前在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)