如何让excel“等待”一个单元格的值改变?

我正在拨打第三方远程电话来获取数据。 调用这个函数后,数据将从单元格(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不适合asynchronous或multithreading编程。

谢天谢地,Excel给了你一个内置的方法来完成这个工作,只需要一点点时间: Application.OnTime方法 。 它可以让你安排延迟调用方法,同时保持UI(和其他VBA代码)的响应和可用性。 你可以用它来实现一种计时器。

这是您的案例的基本方法。 它每1秒钟检查一次testing单元的值。 如果这个值没有改变,它会安排自己再次检查。 如果值是“结果”,它将调用另一个子,在那里你会把代码处理结果。

 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函数,并要检查最后一个单元格时调用此macros。 我可以详细说明你是否需要。

或者,如果您在循环运行时设想数据更改,则可以利用循环中的DoEvents vba函数/方法。 这个函数将使我能够使这个应用程序在这个macros运行时仍然运行和更新单元格。

经过一些testing :我现在怀疑DoEventsfunction将最适合您。