【问题标题】:Is it possible to run VBA macro in phases so that the runtime is reduced?是否可以分阶段运行 VBA 宏以减少运行时间?
【发布时间】:2020-04-08 09:20:57
【问题描述】:

我正在尝试构建一个工作表,让我和我的同事可以在工作表中填写变量,就像在与客户进行对话时所做的那样。到目前为止我已经成功了,但是宏变得非常非常慢......我已经禁用了 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 的一部分。例如,它只检查一个单元格是否在该人当前工作的章节中发生变化。有人可以帮我解决这个问题,或者让我朝着正确的方向前进吗?

提前致谢!

【问题讨论】:

  • 如何识别“当前工作的人所在的章节”?如果是更改的单元格,则仅针对 Target Range 运行代码
  • 可以对每个block进行wrap并检查cell是否被改变,If Not Intersect(Target, Cells(19,3)) Is Nothing Then.
  • 此外,如果If - Then 语句在您的所有情况下都在一行中完成,那么它旁边的代码将运行,而不管它们上面的 if 结果如何。因此,在您的情况下,所有语句都将运行(包括 If 条件和其他),从而使 if 语句变得多余。因此,即使Cells(19,3).Value<>"" 它仍然会检查条件并生成 Cells(19,3).Font italic 和 colorindex 16。更好地使用 if 块,在下一行执行操作并使用 end ifs。

标签: excel vba formatting


【解决方案1】:

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

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

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

【讨论】:

  • 嗨 Naresh,非常感谢您的帮助,它使我的代码运行得更快了。但是,我仍然遇到2个问题。在值(如“填写 z..”)在我清除它后返回到一个单元格之前,我首先需要更改另一个单元格,这可能并不总是在填写此表单时做的合乎逻辑的事情。有什么我可以改变的吗?此外,我使用了很多复选框作为条件,但它们也只有在我之后更改另一个单元格时才有效。您提到了 worksheet.calculate 事件来解决这个问题,但我不知道如何使用它。你能指出我正确的方向吗?
  • 我明白了。我只是假设我自己对您的代码的解释而犯了错误。您的问题似乎非常不同,因此问题和答案都无关紧要。我认为您的工作表是一个表单,其中您需要一些带有斜体字体和字体颜色的默认值以及通知用户要填写哪些信息的文本。我建议您使用工作表的屏幕截图更新问题。然后可以更好地理解问题。答案中的代码无关紧要,因此请删除它。
猜你喜欢
  • 2014-07-02
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2020-06-13
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多