Excel VBA正在跳过特定的代码行

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

所以,我试图把它放在“pipe理员”工作表上某个单元格中的百分比。 这似乎也行,但有时候。 在执行期间,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没有更新许多循环,并且在跳过时不会更新相同的循环。 计算仍然在进行(我认为),因为当它更新时,它正在更新到正确的值。 但是在每个循环中都没有更新单元,只是其中的一部分。

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

另外 – 将你的状态更新分解成一个单独的Sub将简化你的代码,并允许你更容易地改变你如何显示更新。

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

我相信,如果您在线设置其值后检查了ThisWorkbook.Worksheets("Admin").Range("H18").Value ,其值将与预期完全一致。

Application.ScreenUpdating=True运行的VBA 通常显示在屏幕上,无论代码在做什么, 都不要求Excel 必须更新屏幕。

相反,使用Application.ScreenUpdating=False ,则需要Excel 不能更新屏幕。

如果出于某种原因,Excel无法命令更新屏幕所必需的系统资源, 执行其必须执行的其他任务,同时Application.ScreenUpdating=True ,屏幕更新将暂时closures,导致您描述的问题。 DoEvents可以很好地解决这个问题,但是如果你在工作簿中的其他地方触发事件,可能会导致性能降低和其他问题 – DoEvents特别说“现在处理未决事件”。

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