0

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

它们的链接如下:

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

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

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

此序列在办公时间运行,并在下午 5 点后的第一次运行时设置一个计时器以在早上再次启动该过程。

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

如果这还不足以让某人知道发生了什么,我会很乐意发布代码 - 但我希望有人以前看过这个或者知道这个新手错误,并且可以简单地给我一条我缺少的行。

非常感谢你的帮助!

4

3 回答 3

2

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

您在评论中提出的建议的一些替代方案;

  • Environ("Username")执行前检查,Application.OnTime以便仅当文件由特定用户打开时才会运行。
  • 使用启动器文件以“管理员模式”打开 XLSM - 您可以通过使用启动器文件设置Global-scope 变量来执行此操作,然后让 XLSM 在运行之前检查此变量Application.OnTime
  • 在本地计算机上对一些虚拟文件进行 XLSM 测试 - 您可以在需要定期访问 XLSM 的计算机上轻松地手动创建该文件。例如,XLSM 可以查找C:\Data\xlsm-enabler.txt或任何工作,并且仅在文件存在时运行相关宏。
  • 与上述类似,用于SaveSetting在“管理员”机器上设置注册表项,并在 XLSM 中检查此项。
  • 将您的 XLSM 设置为接受参数,并使用这些参数以“管理员模式”打开文件。这个方法在其他几个地方都有概述@ SO,比如这里
  • 这更像是一种预感 - 您可以利用 XLSM 中的Workbook.ReadOnly属性作为条件。这假设 Excel 在通过数据连接访问 XLSM 时以只读模式打开 XLSM,我不知道实际情况是否如此。
于 2019-04-23T11:58:00.023 回答
1

在 Access 中做所有事情会更容易。然后,如果您需要在 Excel 中表示数据,您可以拥有一个带有 Access 表链接的工作簿。这删除了一个步骤,它使用了正确的工具来完成这项工作。Access 用于链接到数据库表。Excel 用于处理数据视图。

SQL > Access > Excel

于 2019-04-29T16:41:06.097 回答
1

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

于 2019-04-29T15:49:58.870 回答