首页 > 解决方案 > 是否可以分阶段运行 VBA 宏以减少运行时间?

问题描述

我正在尝试构建一个工作表,使我和我的同事可以在工作表中填写变量,就像在与客户的摄入对话中所做的那样。到目前为止我已经成功了,但是宏变得非常非常慢......我已经禁用了 ScreenUpdating、DisplayPageBreaks、Calculation 和 Events。

实际上,我很确定它需要很长时间,因为广泛的Private Sub Worksheet_Change. 当单元格仍然为空时,我使用一些初始格式,以便我的同事知道在单元格中放入什么。但是这个过程会单独重复大约 170 行。它看起来像这样:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Cells(19,3).Value="" Then Cells(19,3).Value="Fill in x.."
     Cells(19,3).Font.Fontstyle = "Italic"
     Cells(19,3).Font.ColorIndex = 16

  If Cells(20,3).Value="" Then Cells(20,3).Value="Fill in y.."
     Cells(20,3).Font.Fontstyle = "Italic"
     Cells(20,3).Font.ColorIndex = 16

  If Cells(25,2).Value="" Then Cells(25,2).Value="Fill in z.."
     Cells(25,2).Font.Fontstyle = "Italic"
     Cells(25,2).Font.ColorIndex = 16

  If Cells(70,3) = True Then Cells(70,3).Value = "Comment.."
  If Cells(70,3) = False Then Cells(70,3).Value = ""
     Cells(70,3).Font.Fontstyle = "Italic"
     Cells(70,3).Font.ColorIndex = 16

这适用于许多其他细胞。我想探索是否有可能只运行Private Sub Worksheet_Change当时的一部分。例如,它只检查当前工作的人所在章节中的单元格是否发生变化。有人可以帮我解决这个问题,或者把我引向正确的方向吗?

提前致谢!

标签: excelvbaformatting

解决方案


如果If - Then语句在所有情况下都在一行中完成,那么它旁边的代码将运行,而不管它们上面的 if 结果如何。因此,在您的情况下,所有语句都将运行(包括 If 条件和其他条件),从而使 if 语句变得多余。所以即使Cells(19,3).Value<>""它仍然会检查条件并且会做出Cells(19,3).Font italic and colorindex 16. 最好使用带有下一行操作和结束 ifs 的 if 块

当用户或外部链接更改工作表上的单元格时,会发生Worksheet.Change事件。当重新计算期间单元格发生变化时,不会发生此事件。使用Calculate事件捕获工作表重新计算。因此,如果用户手动更新工作表,一次只会更改一个单元格。

因此,每次更改单个单元格时,宏都会检查所有 170 行并执行所有语句,而不管上述 if 语句的结果如何,并且会有延迟。


推荐阅读