【问题标题】:Updating cells on an open Excel sheet while switching application.screenupdating off and on在打开和关闭 application.screenupdating 时更新打开的 Excel 工作表上的单元格
【发布时间】:2015-11-12 21:25:03
【问题描述】:

这是一个大宏的小问题,我正在阅读日志文件并通过将它们写入多个工作表来准备数据。我不想看到所有这些写作,所以我关闭了屏幕更新,但是我想看到一些进展,所以我不时切换屏幕更新我激活顶部工作表,在一些中写入一些进度数据单元格并再次关闭屏幕更新。这在 Excel 2010 中运行良好,但上周我升级到 Excel 2013 并且在宏完成之前没有更多可见的更新。我添加了 0.3 秒的暂停,但现在只更新时间,而不是处理的站点数量。有什么想法吗?

Application.ScreenUpdating = True  'To write the elapsed time and the number of found sites on the performance monitor sheet
PerfMon.Activate
PerfMon.Range("B4") = Now - StartPoint
PerfMon.Range("D4") = SiteCnt
Application.Wait (Now + (0.3 / 86400))
Application.ScreenUpdating = False

谢谢,汉斯

【问题讨论】:

  • 我没有 2013,但也许可以尝试改用 StatusBar 来跟踪进度。请参阅Chip Pearson's 页面或this page 了解一些想法。 (虽然我不确定StatusBar 是否受到ScreenUpdating 的影响,但我认为不会)。
  • 这是一个意想不到的结局。不管怎样,我想说的是:非常感谢你们俩。两种解决方案都有效。我想 StatusBar 将是 MS 首选的解决方案,而 DoEvents 是我的。
  • DoEvents 产生执行,以便操作系统可以处理其他事件。它的描述中有一个警告,但它是暂停主进程的标准方式,因此可以执行后台操作。
  • 为了显示进度,我更喜欢使用无模式的用户表单。无模式的用户表单不需要用户采取任何行动,但宏可以写入。你可以有一个进度条,但我通常更喜欢信息显示。如果我正在处理 1,000 行,我将有包含“Row”、“of”和“1,000”的固定标签,以及一个我写入当前行号的标签,因此表单读取“Record N of 1,000”,N 从 1 到1,000。使用多阶段宏,我列出了所有阶段并通过它们报告进度。

标签: vba excel excel-2013


【解决方案1】:

最好的解决方案似乎是启用状态栏。在不确切知道您的宏是什么的情况下,我建议您将工作簿中的变量之一设置为整数,并在状态栏中跟踪当前进度。也许这是“Now - StartPoint”或“SiteCnt”,否则您可以使用新文本定期更新状态栏。

如果你使用整数选项,这里有一个例子:

[...]
 Application.ScreenUpdating = False
 Application.DisplayStatusBar = True
 Dim i As Integer
 For i = 2 To Sheets.Count       ' example from my macro but you could use any repeating process
       Worksheets(i).Activate
       Application.StatusBar = "Updating Filings for " & ( i - 1 ) & " of " & (Sheets.Count - 1) & "   |   " & Format (( i - 1 )) / (Sheets.Count - 1), "0%") & "Complete"
 Next i
 Application.StatusBar = ""
 Application.DisplayStatusBar = False
[...]   

如果您使用文本选项,这里是一个示例:

[...]
 Application.ScreenUpdating = False
 Application.DisplayStatusBar = True
 Application.StatusBar = "Reading log files"
 [...]
 Application.StatusBar = "Preparing data"
 [...]
 Application.StatusBar = "Formatting data"
 [...]
 Application.StatusBar = ""
 Application.DisplayStatusBar = False
[...]   

【讨论】:

  • 您好,感谢您的努力。事实上,状态栏选项可能是最好的。不过,我对 DoEvents 有一条评论。我的宏运行了一个多小时。在宏运行期间,我能够打开另一个 Excel 实例来处理其他内容。我看起来像 DoEvents 会阻止该选项,直到宏结束。我认为这个问题解决了。谢谢大家!汉斯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多