【问题标题】:Is there a way of enabling VBA events within an event if they are already disabled如果 VBA 事件已被禁用,是否有办法在事件中启用它们
【发布时间】:2016-10-15 23:03:02
【问题描述】:

我怀疑答案是否定的,因为这是一个循环论证

但是……

我将报表从软件包直接导出到现有 Excel 工作簿中。软件包在 Excel 中创建一个新工作表并填充该工作表。默认情况下,新工作表称为 Sheet1。这是一个大型报表,在 Excel 工作簿中有一个 Workbook_SheetChange 事件。导出报告的每个单元格在 Excel 中单独更新,因此每个单元格都会运行 SheetChange 事件。这将导入时间增加了 10 倍。

我可以在 SheetChange 事件中添加以下内容

如果 Sh.name = "Sheet1" 然后退出 sub

这很好地加快了导入过程,但当然不会再触发任何事件,因为我已禁用它们。因此工作簿宏将无法使用。

我希望能够在 Sheet1 工作表停用时添加 application.enableEvents = true 但当然这不会触发,因为事件已被禁用。

我可以添加一个必须按下的按钮,该按钮将通过子模块触发重新启用,但期望用户必须这样做并不是特别直观。还有其他事件可能需要在用户按下之前触发,以免错过。

因此,我的愚蠢问题是 - 还有其他方法可以重新启用事件吗?

我想,我可以在每个工作表中都有一个 Worksheet_Change 事件,而不是一个全局 Workbook_SheetChange 事件,但我想在我这样做之前我会问一下。

谢谢

【问题讨论】:

  • 如何将报表导出到现有的 Excel 工作簿中?是通过 VBA 代码吗?
  • 不,很遗憾没有。直接从其他软件中单击按钮并选择要导出到的工作簿
  • 然后将其导出到一个全新的工作簿,完成后,编写一个简单的 VBA 代码将其导入您的工作簿。在第二步中,您将在开头设置Application.EnableEvents = False,在结尾设置Application.EnableEvents = True
  • 可以的。我认为总的来说,我只是将事件从 Workbook_SheetChange 移到每个工作表的 Worksheet_Change 事件,因为这将是对 500 名用户的再教育,告诉他们导出到新书而不是现有书。感谢您的努力
  • 它可能对 500 个用户是透明的:他们会打开“普通”工作簿,您的宏会在 Workbook_Open() 事件中触发,并从“临时”工作表导入到其 sheet1。没有人会注意到这一点。

标签: excel vba events


【解决方案1】:

一种方法是让进口商控制事件。
只需导入子:

  1. 禁用事件
  2. 导入以创建 Sheet1
  3. Sheet1 完成后重新启用事件。

【讨论】:

  • 是的,不幸的是,其他软件控制了导出。您单击其中的一个按钮,然后选择要导出到的工作簿。
  • @MrPea 那么必须在点击该按钮之前禁用事件。
  • 如果只有我,那么是的,但是大约有 500 个用户使用该过程,因此不幸的是,在导出之前教育他们全部禁用是不可行的。我想我只是要将事件移动到每个特定的工作表中。感谢您的宝贵时间
  • @MrPea 这是一个合理的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多