2013-04-01 15 views
3

我正在拨打第三方远程电话来获取数据。 调用此函数后,DATAS将从细胞(1,1)填充细胞(10,1) 我的代码是这样的如何让excel“等待”单元格的值改变?

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循环挂起。 那么如何处理这个问题呢?

回答

1

当vba代码正在运行时,我不希望任何其他单元格发生变化,除非您在循环中执行某些操作。

我会使用一个if函数,并且当你想检查最后一个单元格时调用这个宏。我可以详细说明你是否需要。

或者,如果您设想数据在循环运行时发生更改,则可以在循环中使用vba函数/方法。我相信,这个函数将使应用程序在这个宏运行时仍然运行和更新单元。

经过一番测试:我现在怀疑DoEvents功能将最适合你。

5

你在while循环中旋转的当前方法不是一个好主意,因为它消耗了所有可用资源来做...没有。或者说,它会尽可能快地执行比较cells(10,1)<>"result"。用户界面在此期间挂起。

总之,你发现VBA不适合异步或多线程编程。

谢天谢地,Excel为您提供了一个内置的方法来完成这项工作,并付出了一点努力:Application.OnTime method。它可以让你安排延迟调用方法,同时保持UI(和任何其他VBA代码)的响应和可用性。您可以使用它来实现一种计时器。

以下是您的案例的基本方法。它每1秒检查一次测试单元的值。如果该值没有改变,它会自行安排在另一秒再次检查。如果值是“结果”,它会调用另一个子代码,您可以在代码中处理结果。

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