如何要求 Excel "wait"单元格的值进行更改?

  • 本文关键字:单元格 Excel wait 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循环中挂起。那么如何处理这个问题呢?

当前在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函数将最适合您。

最新更新