Excel -屏幕闪烁屏幕更新



我从"停止excel屏幕闪烁"的长系列中得到了另一个问题,但我认为这个问题有点棘手。

我有一个客户谁需要一个"进度"条在他的电子表格宏执行期间。我所做的是,我有一个链接到两个单元格的饼状图,我根据进度进行调整。为了提高性能,我禁用了eventsScreenUpdating并更改了calculation to manual

然后,偶尔我快速切换ScreenUpdating on and off来实际更新进度图表。我每次使用它都非常有效(现在已经有30多个项目了)。

最近,客户带着一个"大"问题来找我。每当我快速切换以刷新进度图表时,整个excel屏幕(包括上面的所有项目)都会闪烁,这让这个家伙发疯了。

有没有人有什么想法可以这样做,以保持图表更新,同时保持首页不断显示(页面之间的宏跳转)没有屏幕闪烁?像双重缓冲之类的…

<<p> 解决方案/strong> 信不信由你,但我刚刚找到了一个解决办法。这太简单了。在VBA中,可以刷新一个特定的对象,而剩余的屏幕仍然"锁定"。例如:
ThisWorkbook.Worksheets("Welcome").ChartObjects(1).Chart.Refresh

谢谢大家的意见

您可以重写宏,使其不会在页面之间"跳转"(因为通常不需要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

那么,你可以定义你的范围,并将第二个范围赋值给=第一个范围

最新更新