Vba 在打开和关闭application.Screen更新的同时更新打开的Excel工作表上的单元格

Vba 在打开和关闭application.Screen更新的同时更新打开的Excel工作表上的单元格,vba,excel,excel-2013,Vba,Excel,Excel 2013,这是一个大宏的小问题,我正在读取日志文件,并通过将它们写入大量工作表来准备数据。我不想看到所有的书写都在进行,所以我关闭了屏幕更新,但是我想看到一些进展,所以我不时打开屏幕更新,激活顶部工作表,在一些单元格中写入一些进展数据,然后再次关闭屏幕更新。这在Excel 2010中运行得很好,但上周我升级到了Excel 2013,在宏完成之前,再也看不到更新了。我添加了0.3秒的暂停,但现在只更新时间,而不更新已处理站点的数量。有什么想法吗 Application.ScreenUpdating = Tr

这是一个大宏的小问题,我正在读取日志文件,并通过将它们写入大量工作表来准备数据。我不想看到所有的书写都在进行,所以我关闭了屏幕更新,但是我想看到一些进展,所以我不时打开屏幕更新,激活顶部工作表,在一些单元格中写入一些进展数据,然后再次关闭屏幕更新。这在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

谢谢,Hans

最好的解决方案似乎是启用状态栏。在不知道宏是什么的情况下,我建议您将工作簿中的一个变量设置为整数,并在状态栏中跟踪当前进度。这可能是“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
[...]   
如果使用文本选项,下面是一个示例:

[...]
 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
[...]   

我没有2013,但也许可以尝试使用
状态栏来跟踪进度。请参阅第页,或了解一些想法。(我不确定
状态栏
是否受到
屏幕更新
的影响,但我认为不会)。这是一个意外的结果。不管怎样,我想说的是:非常感谢你们两位。两种解决方案都有效。我认为StatusBar将是MS首选的解决方案,而DoEvents是我的。
DoEvents
产生执行,以便操作系统可以处理其他事件。在它的描述中有一个警告,但这是暂停主进程的标准方式,以便可以处理背景内容。为了显示进度,我更喜欢使用无模式用户表单。无模式用户表单不需要用户执行任何操作,但宏可以对其进行写入。你可以有一个进度条,但我通常更喜欢信息显示。如果我处理1000行,我将有包含“Row”、“of”和“1000”的固定标签,还有一个我将当前行号写入其中,因此表单将显示“Record N of 1000”,其中N从1到1000。使用多阶段宏,我列出所有阶段并报告它们的进度。嗨,谢谢你的努力。事实上,状态栏选项可能是最好的。不过,我对DoEvents有一点看法。我的宏运行了一个多小时。在宏操作期间,我能够打开另一个Excel实例来处理其他内容。看起来DoEvents会阻止该选项,直到宏结束。我认为这个问题已经解决了。谢谢大家!汉斯