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

Excel VBA正在跳过特定的代码行,vba,excel,for-loop,Vba,Excel,For Loop,各位。我在Excel工作簿中有一个大型VBA模块,它从一堆其他远程工作簿中获取数据,并将其复制到当前工作簿中。然后,对数据进行格式化和分析。所有这些都可以正常工作,但可能需要一段时间,因为我在两个工作表中处理了30000多行数据(而且每天都在增长) 所以,我试图让它把进度作为百分比放在“管理”工作表的某个单元格中。这似乎也行,但只是有时。在执行过程中,Excel似乎随机跳过更新进度的.Value行代码。有时候,它会更新大约四分之三的时间,而有时候,它在执行结束之前根本不会更新。有人知道为什么吗?

各位。我在Excel工作簿中有一个大型VBA模块,它从一堆其他远程工作簿中获取数据,并将其复制到当前工作簿中。然后,对数据进行格式化和分析。所有这些都可以正常工作,但可能需要一段时间,因为我在两个工作表中处理了30000多行数据(而且每天都在增长)

所以,我试图让它把进度作为百分比放在“管理”工作表的某个单元格中。这似乎也行,但只是有时。在执行过程中,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>

ThisWorkbook.Worksheets(“Admin”).Range(“H18”).Value=“Waiting…”
对于rng.行中的每个rw
<进行数据收集和分析的代码>
进度=<返回双精度值的代码>
ThisWorkbook.Worksheets(“Admin”).Range(“H18”).Value=进度和完成百分比
下一个rw
ThisWorkbook.Worksheets(“Admin”).Range(“H18”).Value=“完成!”

有时,“等待…”从不显示。其他时候是这样。“完成!”几乎总是在执行结束时显示,但是Admin!H18在很多循环中都没有更新,当它被跳过时,它也不会是同一组循环。计算仍在进行中(我认为),因为当它更新时,它会更新到正确的值。但它并不是在每次循环中都更新单元格,只是其中的一些。更新单元格后添加
DoEvents
可以解决此问题。但是,如果禁用屏幕更新(这将阻止状态更新在工作表上),代码可能会运行得更快。请尝试更新状态栏

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

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

我相信,如果您在设置其值的行之后检查
此工作簿.Worksheets(“Admin”).Range(“H18”).Value
,其值将完全符合预期

虽然与
应用程序一起运行的VBA.ScreenUpdate=True
通常会在屏幕上显示代码正在执行的操作,但不要求Excel必须更新屏幕

相反,对于
Application.ScreenUpdate=False
,Excel必须不更新屏幕

如果由于任何原因,Excel无法命令更新屏幕所需的系统资源以及在
Application.ScreenUpdate=True
时必须执行的其他任务,屏幕更新将暂时关闭,从而导致您描述的问题
DoEvents
可能很好地解决了这一问题,但如果您在工作簿中的其他地方发生了正在触发的事件,则可能会导致性能降低和其他问题—
DoEvents
特别指出“立即处理挂起的事件”


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

Tim在状态栏上的评论对于显示定期发生的进度是一个很好的主意。这里有一个链接,指向我经常使用的状态栏更新VBA的简短片段:Tim,你的状态栏建议非常有效。谢谢我还将研究将我的进度更新拆分为另一个子例程,但由于我的代码比我给出的要复杂得多,所以需要考虑一下。我想将您的评论标记为问题的答案,但我不能,因为您将其改为评论。将我的评论替换为答案。。。