【发布时间】:2019-03-28 03:38:58
【问题描述】:
当我尝试在具有 100 多个宏的复杂 Excel 模型中提高效率时,我想确保在模块运行以将带有公式的模板转换为仅值文件后启用事件。使用下面的代码,我希望插入到其他没有 VBA 的 Excel 文件中的其他事件代码可以工作,但是下面的 Open 事件代码不会启用事件。我进行了搜索,发现 EnableEvents 很棘手。我的目标是使用我在网上找到的一些其他代码来“优化”或加速代码的运行将更广泛地成为可能。它包括 EnableEvent 语言(在代码开头将其关闭并在代码末尾打开)。
这是我为获取模板的“VALUES”版本而调整的代码以启用一般事件,一旦我导航到另一个选项卡并使用名为 Private Sub Worksheet_SelectionChange(ByVal Target作为范围)。
Sub AddSheetCodeToAuto_Open()
' To turn on events
Dim Startline As Long, HowManyLines As Long
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
Startline = 1
HowManyLines = .CountOfLines
.DeleteLines Startline, HowManyLines
.InsertLines 1, "Private Sub Workbook_Open()"
.InsertLines 2, vbNewLine
.InsertLines 3, "Sheets(Sheet7).Select
.InsertLines 4, "Application.EnableEvents = True"
.InsertLines 5, "End Sub"
End With
End Sub
当我使用即时窗口并单步执行代码时,Application.EnableEvents 值在打开相关文件后始终为 FALSE,但鉴于打开工作簿事件的事件处理程序如上所示,为什么事件不会转在? 提前感谢您的专业知识。
【问题讨论】:
-
该代码应该放在
ThisWorkbook代码模块中,而不是工作表模块中。 -
没错,我忘了提到 Workbook_Open 代码已移入该模块。这是修改后的代码: With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule 麻烦的是,如果我在“转换为值”过程结束时关闭事件,则自动打开事件处理程序在启用时无效事件。
-
通常,您可以通过在关闭事件的任何过程中包含错误处理来管理此问题,以确保您的代码不会崩溃并关闭事件。