Excel - 屏幕更新时的屏幕闪烁

时间:2013-03-25 13:19:01

标签: excel vba

我还有另外一个问题来自'停止excel屏幕闪烁'的长篇小说,但我觉得这个问题有点棘手。

我有一个客户在宏执行期间需要在他的电子表格上有一个“进度”栏。 我做了什么,是否有一个饼图链接到2个单元格,我根据进度调整。为了提高效果,我已停用eventsScreenUpdating并更改了calculation to manual

然后,偶尔我会快速切换ScreenUpdating on and off来实际更新进度表。每当我使用它时,它就像一个魅力(现在超过30个项目)。

最近,客户回答我的问题很严重。每当我进行快速切换以刷新进度图时,整个excel屏幕(包括其上的所有项目)都会闪烁,这会让这个家伙发疯。

有没有人知道如何做到这一点,以保持图表更新,同时保持首页不断显示(页面之间的宏跳转)没有屏幕闪烁?像双缓冲那样的东西......

信不信由你,但我刚刚找到了解决方案。这太容易了。在VBA中,可以仅刷新特定对象,而剩余的屏幕保持“锁定”状态。例如:

ThisWorkbook.Worksheets("Welcome").ChartObjects(1).Chart.Refresh

感谢大家的意见。

1 个答案:

答案 0 :(得分:1)

您可以重写宏,使其不“在页面之间跳转”(因为通常不需要activate工作表来操纵他们的数据。否则,无论是用户表单还是应用程序的StatusBar可用于显示进度条:

Sub StatusBar()
Dim pct As Double
Dim msg as String
Application.ScreenUpdating = False
For i = 10000 To 1 Step -1
    pct = (10000 - i) / 10000
    msg = Format(pct, "0.0%")  & " complete"
    Application.StatusBar = msg

Next
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub

以下是UserForm的修订示例。请注意,您需要添加UserForm模块,并至少添加一个Label以显示信息:

Sub StatusBar()
Dim pct As Variant
DoEvents
UserForm1.Show vbModeless

Application.ScreenUpdating = False
For i = 10000 To 1 Step -1
    pct = (10000 - i) / 10000
    If Int((i / 10000) * 100) = (i / 10000) * 100 Then
        msg = Format(pct, "0%")
        UserForm1.Label1 = msg & " complete"
    End If
Next
UserForm1.Label1 = "Finished!"
Application.ScreenUpdating = True
End Sub

问题可能是,根据宏的执行速度,进度指示器可能会从0跳到100%。您也可以使用图形进度条,但它背后的基本思想是相同的,只是不是更新标签值,而是改变具有不同背景颜色的文本框的大小等。

根据OP评论进行修订

这就是你可以在不“复制/粘贴”的情况下将一个范围从一张纸“复制”到另一张纸的方式:

Set rng1 = Sheets(1).Rows(12)
Set rng2 = Sheets(2).Rows(1)

rng2.Value = rng1.Value

因此,您可以定义范围,并将第二个范围指定为=第一个范围。