【问题标题】:Excel VBA is skipping specific lines of codeExcel VBA 正在跳过特定的代码行
【发布时间】:2014-06-24 18:59:55
【问题描述】:

每个人。我在 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 并没有为很多很多循环更新,而且当它被跳过时,它永远不是同一组循环。计算仍在进行中(我认为),因为当它更新时,它会更新到正确的值。但它不会在每个循环期间更新单元格,只是更新其中的一些。

【问题讨论】:

  • Tim 在状态栏上的评论对于显示定期发生的进度是一个好主意。这是我经常使用的状态栏更新 VBA 的简短 sn-p 链接:stackoverflow.com/questions/22847329/…
  • 蒂姆,您的状态栏建议非常有效。谢谢!我还将考虑将我的进度更新拆分到另一个子例程中,但由于我的代码比我介绍的要复杂得多,因此需要考虑一些因素。我想将您的评论标记为对问题的回答,但我不能,因为您将其改为评论。
  • 将我的评论换成答案...

标签: vba excel for-loop


【解决方案1】:

我相信,如果您在设置其值的行之后检查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 显示状态。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多