2014-05-07 35 views
3

每个人。在Excel工作簿中有一个大型VBA模块,它从一堆其他远程工作簿中获取数据并将其复制到当前工作簿中。然后,它格式化和分析数据。所有这些工作都很好,除了可能需要一段时间,因为我正在处理两个工作表中的超过30,000行数据(并且每天都在增长)。Excel VBA正在跳过特定行代码

所以,我试图让它把进度作为一个百分比放在“管理员”工作表上的某个单元格中。这似乎也行得通,但有时只是。在执行期间,Excel似乎随机跳过了更新进度的.Value代码行。有时候,它会更新大约四分之三的时间,有时甚至更新,直到执行结束。有谁知道为什么?以下是相关代码的摘要。

<some code that declares variables and whatnot> 
ThisWorkbook.Worksheets("Admin").Range("H18").Value = "Waiting..." 
For Each rw In rng.Rows 
    <code that does the data-gathering and analysis> 
    progress = <code that returns a Double value> 
    ThisWorkbook.Worksheets("Admin").Range("H18").Value = progress & "% complete." 
Next rw 
ThisWorkbook.Worksheets("Admin").Range("H18").Value = "Done!" 
<some cleanup code> 

有时,“等待...”从不显示。其他时候,它是。 “搞定!”几乎总是在执行结束时显示,但Admin!H18不会更新许多循环,并且在跳过时它不会更新同一组循环。计算仍在进行中(我认为),因为当它更新时,它会更新到正确的值。但是它并没有在每个循环中更新单元,只是其中的一部分。

+1

Tim对状态栏的评论是显示定期发生进度的好主意。这里是一个简短的状态栏片段的链接 - 更新我经常使用的VBA:http://stackoverflow.com/questions/22847329/hiding-worksheet-while-copying-and-pasting/22847823#22847823 –

+0

Tim,你的状态栏建议完美运作。谢谢!我还会考虑将进度更新分解为另一个子程序,但由于我的代码比我提出的要复杂得多,因此需要考虑一些问题。我想将您的评论标记为问题的答案,但我不能,因为您已将其发表评论。 – T6J2E5

+0

将我的评论转换为答案... –

回答

4

在更新单元格后添加DoEvents可能会解决此问题。但是,如果禁用ScreenUpdating(这会阻止在工作表上更新状态更新),则代码运行速度会更快。尝试更新状态栏。

此外 - 将状态更新拆分为单独的Sub将简化您的代码并允许您更轻松地更改显示更新的方式。

Sub DoStatus(m) 
    ThisWorkbook.Worksheets("Admin").Range("H18").Value = m 
    DoEvents 
End Sub 
2

我相信,如果你行的值设置后检查ThisWorkbook.Worksheets("Admin").Range("H18").Value,它的价值将完全按照预期。

虽然与Application.ScreenUpdating=True一般显示屏幕上的任何代码是干什么运行VBA,有没有要求,即Excel中必须更新屏幕。

相反地,Application.ScreenUpdating=False,有一个要求,即Excel的不得更新屏幕。

如果因任何原因Excel不能命令必须更新屏幕做到这一点必须执行,而Application.ScreenUpdating=True,屏幕更新将被暂时关闭其他任务的系统资源,导致您所描述的问题。 DoEvents可能会解决此问题,但可能会导致性能下降以及其他问题,如果您在工作簿中的其他地方触发了其他事件 - DoEvents特别说明了“现在处理未决事件”。

如果您在代码运行时使用Application.ScreenUpdating=False并使用Application.StatusBar来显示状态,那么您将获得更好的性能。