我正在使用DoEvents在状态栏中(或工作表中的某些单元格中)强制更新进度指示器,如下面的示例代码所示。但是屏幕不刷新,或在某个时候停止刷新。任务最终完成,但是进度栏没有用。

为什么DoEvents不“执行事件”?我还能做些什么来强制屏幕更新?

编辑:我在Windows XP上使用Excel 2003。

这是对earlier question的跟进;感谢Robert Mearns的回答和下面的示例代码。

Sub ProgressMeter()

Dim booStatusBarState As Boolean
Dim iMax As Integer
Dim i As Integer

iMax = 100

    Application.ScreenUpdating = False
''//Turn off screen updating

    booStatusBarState = Application.DisplayStatusBar
''//Get the statusbar display setting

    Application.DisplayStatusBar = True
''//Make sure that the statusbar is visible

    For i = 1 To iMax ''// imax is usually 30 or so
        fractionDone = CDbl(i) / CDbl(iMax)
        Application.StatusBar = Format(fractionDone, "0%") & " done..."
        ''// or, alternatively:
        ''// statusRange.value = Format(fractionDone, "0%") & " done..."

        ''// Some code.......

        DoEvents
        ''//Yield Control

    Next i

    Application.DisplayStatusBar = booStatusBarState
''//Reset Status bar display setting

    Application.StatusBar = False
''//Return control of the Status bar to Excel

    Application.ScreenUpdating = True
''//Turn on screen updating

End Sub

最佳答案

我发现DoEvents并不总是完全可靠的。我建议尝试两种不同的方法。

首先,尝试在状态栏更新之后(即,在Some code ....行之前)立即放置DoEvents调用。

如果这不起作用,我发现在某些情况下,使用 sleep API是产生处理器时间的更可靠方法。如果DoEvents无法正常运行,通常这是我尝试的第一件事。您需要在模块顶部(函数之外)添加以下行:

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

然后添加此行,以代替DoEvents或除ojit_code之外:
    Sleep 1   'This will pause execution of your program for 1 ms

如果1毫秒不起作用,则可以尝试增加使用 sleep 暂停程序的时间。

关于vba - DoEvents不执行事件…为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3863641/

10-10 09:22