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

时间:2013-04-01 03:22:46

标签: 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

但是,我的代码会在while循环中挂起。 那么如何处理这个问题?

2 个答案:

答案 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功能最适合您。