excel - 是否可以分阶段运行 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
当时的一部分。例如,它只检查当前工作的人所在章节中的单元格是否发生变化。有人可以帮我解决这个问题,或者把我引向正确的方向吗?
提前致谢!
解决方案
如果If - Then
语句在所有情况下都在一行中完成,那么它旁边的代码将运行,而不管它们上面的 if 结果如何。因此,在您的情况下,所有语句都将运行(包括 If 条件和其他条件),从而使 if 语句变得多余。所以即使Cells(19,3).Value<>""
它仍然会检查条件并且会做出Cells(19,3).Font italic and colorindex 16
. 最好使用带有下一行操作和结束 ifs 的 if 块
当用户或外部链接更改工作表上的单元格时,会发生Worksheet.Change事件。当重新计算期间单元格发生变化时,不会发生此事件。使用Calculate事件捕获工作表重新计算。因此,如果用户手动更新工作表,一次只会更改一个单元格。
因此,每次更改单个单元格时,宏都会检查所有 170 行并执行所有语句,而不管上述 if 语句的结果如何,并且会有延迟。
推荐阅读
- java - 雅加达 JSTL Tomcat
- angular - 使用 Angular 进行单元测试:如何测试父子之间的更改
- javascript - NodeJs 中的 Discord 机器人
- python - 当我尝试创建日志文件时 Heroku /app/[mydir]/[logfile] 上的 FileNotFoundError
- javascript - How should I traverse through a folder of .gifs to display them in a list using Gatsby.js
- node.js - 每次我安装新的 react-app 时依赖关系树中的错误
- python - ModuleNotFoundError("'kafka' 不是一个有效的名称。你的意思是 aiokafka,kafka 之一吗?")
- javascript - 编译时不要运行 linter 和 prettier
- javascript - 用 JavaScript 编码时,什么是 iswgraph() 替代品
- nuxt.js - Netlify 找不到模块'@nuxtjs/amp'