首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DoEvents不做这些事件...为什么?

DoEvents不做这些事件...为什么?
EN

Stack Overflow用户
提问于 2010-10-05 20:36:19
回答 2查看 21.9K关注 0票数 6

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

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

编辑:我在Windows XP上使用Excel2003。

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-08 21:32:05

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

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

如果这不起作用,我发现在某些情况下,使用睡眠API是获得处理器时间的更可靠的方法。如果DoEvents没有像我希望的那样工作,这通常是我尝试的第一件事。您需要在模块的顶部添加以下行(在函数之外):

代码语言:javascript
复制
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

然后添加下面这一行来代替或补充DoEvents

代码语言:javascript
复制
    Sleep 1   'This will pause execution of your program for 1 ms

如果1ms不起作用,您可以尝试使用睡眠来增加暂停程序的时间长度。

票数 10
EN

Stack Overflow用户

发布于 2012-02-14 14:52:27

我发现,在更新状态栏之前调用DoEvents,而不是在更新状态栏之后,会产生更多可预测的/所需的结果。

上面的代码片段如下:

代码语言:javascript
复制
    fractionDone = CDbl(i) / CDbl(iMax)
    DoEvents
    Application.StatusBar = Format(fractionDone, "0%") & " done..."
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3863641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档