4

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

4

2 回答 2

7

您当前在 while 循环中旋转的方法不是一个好主意,因为它消耗了所有可用资源来做......什么都不做。cells(10,1)<>"result"或者更确切地说,它会尽可能快地一遍又一遍地执行比较。同时用户界面挂起。

简而言之,您会发现 VBA 不适合异步或多线程编程。

值得庆幸的是,Excel 确实为您提供了一种内置的方法来完成此任务,只需付出一点努力:Application.OnTime 方法。它允许您安排对方法的延迟调用,同时保持 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
于 2013-04-01T14:06:36.350 回答
1

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

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

或者,DoEvents如果您设想循环运行时数据发生变化,请在循环中使用 vba 函数/方法。我相信,此功能将使应用程序在此宏运行时仍能运行并更新单元格。

经过一些测试:我现在怀疑该DoEvents功能最适合您。

于 2013-04-01T10:45:29.460 回答