4

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

我有一个客户在宏执行期间需要在他的电子表格上显示一个“进度”栏。我所做的是,我有一个饼图链接到 2 个单元格,我会根据进度进行调整。为了性能,我禁用了eventsScreenUpdating并更改了calculation to manual.

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

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

有没有人知道可以做些什么来保持图表更新,同时保持首页不断显示(页面之间的宏跳转)而没有屏幕闪烁?像双缓冲之类的东西......

解决方案

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

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

谢谢大家的意见。

4

1 回答 1

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 模块和至少一个 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

因此,您可以只定义您的范围,并将第二个范围分配给 = 第一个范围。

于 2013-03-25T13:43:38.343 回答