【问题标题】:Stop concurrent access to a VBA function停止对 VBA 函数的并发访问
【发布时间】:2016-08-15 18:20:03
【问题描述】:

在 Excel 中,我定义了一个用于搜索文件的 VBA 函数。我想阻止并发访问此功能,否则硬盘驱动器会不必要地颠簸。

这是我定义的函数:

Public Function findDocument(docName As String)
    findDocument = findDocumentInFolder(docName, "C:\Correspondence")
End Function

然后我使用以下公式为 excel 中的数千个单元格调用它:

=findDocument(<cell reference>)

在java中,我们可以使用synchronized关键字来控制并发访问。 VBA中是否有任何等价物?

附:我假设它同时运行,因为在 excel 窗口的右下角它说:Calculating: (4 Processors(s)): 9%

【问题讨论】:

  • 你能在 VBA 中拥有多个线程吗?!
  • 不用担心 VBA 中根本没有并发。
  • 就像@cyboashu 说vba 中没有并发。 source
  • 请参阅此处以“缓存”UDF 结果以避免重新计算结果的过多工作:stackoverflow.com/questions/38079543/…
  • 我认为,理论上,您可以在多个线程中运行 VBA - 前提是您在完全独立的 Excel 实例中并行运行相同的工作表宏(即不复制/重命名工作簿并在相同的 Excel 实例,但运行 Excel - 打开工作簿,打开 new 单独的 Excel(它将具有不同的进程 ID)并打开相同的工作簿并运行它)。

标签: vba concurrency synchronization mutex


【解决方案1】:

VBA 及其宿主应用程序在 STA COM 线程上运行:在 VBA 代码中不会考虑并发问题。即使是在 MTA 托管线程上运行的 .NET 代码也需要通过 COM 互操作将自身编组到 STA 上 - 涉及 COM 的 MT 问题几乎都可以修复。

也就是说,访问文件系统的 UDF,在数千个单元中使用,无论如何都可能让 Excel 崩溃。

我建议尝试另一种方法 - 也许将结果缓存在 Dictionary 中,以避免在给定重复输入的情况下不必要地访问文件系统(如果这是您的数据中的内容),和/或制作按钮触发的宏扫描给定表格列以运行 findDocumentInFolder 并将结果直接写入这些单元格的过程,而不是使它们成为每次重新计算工作簿时都不必要地重新计算的 UDF。

【讨论】:

  • 感谢 Mat,我添加了一些日志记录并确认搜索是一次运行一个。也感谢缓存/按钮按下的建议,我会试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2013-06-05
  • 1970-01-01
  • 2015-07-06
  • 2017-09-05
  • 1970-01-01
相关资源
最近更新 更多