我还有另外一个问题来自'停止excel屏幕闪烁'的长篇小说,但我觉得这个问题有点棘手。
我有一个客户在宏执行期间需要在他的电子表格上有一个“进度”栏。
我做了什么,是否有一个饼图链接到2个单元格,我根据进度调整。为了提高效果,我已停用events
,ScreenUpdating
并更改了calculation to manual
。
然后,偶尔我会快速切换ScreenUpdating on and off
来实际更新进度表。每当我使用它时,它就像一个魅力(现在超过30个项目)。
最近,客户回答我的问题很严重。每当我进行快速切换以刷新进度图时,整个excel屏幕(包括其上的所有项目)都会闪烁,这会让这个家伙发疯。
有没有人知道如何做到这一点,以保持图表更新,同时保持首页不断显示(页面之间的宏跳转)没有屏幕闪烁?像双缓冲那样的东西......
解
信不信由你,但我刚刚找到了解决方案。这太容易了。在VBA中,可以仅刷新特定对象,而剩余的屏幕保持“锁定”状态。例如:
ThisWorkbook.Worksheets("Welcome").ChartObjects(1).Chart.Refresh
感谢大家的意见。
答案 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
因此,您可以定义范围,并将第二个范围指定为=第一个范围。