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

标签 vba excel for-loop

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

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

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

最佳答案

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

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

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

关于vba - Excel VBA 正在跳过特定的代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23523919/

相关文章:

excel - MS Excel VBA : Is it faster to use Public Variables or Pass Variables between Subs?

vba - 将光标位置保存在文档中并稍后返回

excel - 我可以在列表框中插入具有特定颜色的项目吗?

excel - Countif 不适用于时间和/或日期

c++ - 如何在 C 代码中复制字节数组?

VBA 宏 : Compile error expecting end of statement

excel - VBA 项目资源管理器仍然显示由宏关闭的 Excel 工作簿

java - 使用 Apache Poi 如何创建多值电子表格单元格,以便在 MS Excel 中正确显示,而不仅仅是在 OpenOffice 中

java - Java 中的向后循环更快吗?

Java for循环的几个条件