链接到xlsm工作簿时错误触发了Workbook_Open事件

时间:2019-04-23 09:58:53

标签: excel vba ontime

我正在运行一个[Edit]只读(第三方!)[/ Edit] SQL数据库,一个xlsm,一个xls(保存的xlsm副本,没有宏)和一个mdb(Access数据库)。

它们的链接如下:

  • xlsm每隔5分钟通过Application.OnTime代码从SQL数据库获取数据,该代码是在Workbook_Open上触发的。
  • 然后,xlsm将自身保存为2003 xls。
  • 由于那时代码模块仍然存在(工作簿尚未关闭),因此我可以打开Access mdb并刷新到2003数据表中的Excel链接,然后关闭Access。

  • 然后我重新打开xlsm,触发一个新的Application.Ontime实例。

  • 我终于关闭了2003 xls工作簿。

此序列在办公时间内运行,在下午5点之后的第一次运行中设置了一个计时器,以在早上再次开始该过程。

我的问题是,每当我打开与xlsm的连接或链接的文件时,Workbook_Open事件似乎都会触发,最后我在“客户端”计算机上打开了2003 xls。我知道这不仅仅是我剩下的Application.OnTime(我最初在上面创建文件的PC),因为现在它正在使用中,而其他从未打开过xlsm的客户端在使用Excel时会随机弹出2003文件。

如果这还不足以触发某人知道发生了什么,我会很高兴地发布代码-但我希望有人以前见过这个,或者知道这个菜鸟错误,并且可以简单地给我一行我所缺少的信息。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我认为XLS在您的客户端上弹出的原因是Excel必须打开链接的XLSM才能访问数据,并因此触发Workbook_Open

您在评论中的建议的几种替代方法;

  • 在执行Environ("Username")之前检查Application.OnTime,以使其仅在特定用户打开文件时运行。
  • 使用启动器文件以“管理员模式”打开XLSM-您可以通过使用启动器文件设置Global范围变量来执行此操作,然后让XLSM在运行之前检查此变量Application.OnTime
  • 对本地计算机上的某些虚拟文件进行XLSM测试-您可以轻松地在需要定期访问XLSM的计算机上手动创建一个虚拟文件。例如,XLSM可以查找C:\Data\xlsm-enabler.txt或任何可行的方法,并且仅在文件存在时运行相关的宏。
  • 与上述类似,使用SaveSetting在“ admin”计算机上设置注册表项,并在XLSM内部进行检查。
  • 将XLSM设置为accept parameters,并使用此类参数以“管理员模式”打开文件。 SO的其他几个地方也概述了这种方法,例如here
  • 这更多的是直觉-您可以有条件地利用XLSM中的Workbook.ReadOnly属性。假设Excel通过数据连接访问XLSM时以只读模式打开XLSM,我不知道是否确实如此。

答案 1 :(得分:1)

一个简单的解决方案是让所有其他文件链接到.xls文件,而不是启用了.xlsm宏的文件。这种方法的缺点是您必须(手动)更新所有参考。

答案 2 :(得分:1)

在Access中执行所有操作会更容易。然后,如果您需要在Excel中表示数据,则可以有一个带有访问表链接的工作簿。这消除了一个步骤,并且使用了正确的工具进行作业。访问用于链接到数据库表。 Excel用于处理数据视图。

SQL > Access > Excel