【问题标题】:concurrency and multi-threading in excel vba [duplicate]excel vba中的并发和多线程[重复]
【发布时间】:2013-01-18 15:05:24
【问题描述】:

所以我在网上搜索,我得到的大多数答案都说 Excel 中没有并发。但是有些帖子说 EXCEL 2007 提供了多线程以加快计算速度。我真的很困惑,这可能吗?

在我的工作簿中,有一些单元格是使用用户定义的函数计算的。这些单元每秒通过 RTD 服务器更新一次。那么这是否意味着这些函数看起来是并行重新计算的,但实际上 Excel 只是按顺序调度它们呢?计算机是否具有多个内核是否会有所不同?

如果事实上这些函数是按顺序运行的,那么下面两个是等价的吗?在性能和速度方面。

1)

cell1 = userFunc(1, switch1)
cell2 = userFunc(2, switch2)
cell3 = userFunc(2, switch3)

和 2)

cell = func()

where func() is

public function
        if(switch1)  call userfunc1
        if(switch2)  call userfunc2
        ....

end function

让我们假设对功能进行了所有必要的调整。我的意思是,第一个会更快吗?

非常感谢!!!

更新:如果 VBA 中没有真正的并发性,这是否意味着函数被顺序调用并且共享全局变量可以在没有锁定问题的情况下访问?我有一个几乎每个函数都使用的 API 对象,所以我可以共享它而不是每次使用它时都对其进行初始化吗?这个对象只是一个用来调用一些静态函数的API,对象本身没有任何修改或任何东西。

【问题讨论】:

  • Excel 必须将函数视为线程安全的,才能利用并行化,而 VBA UDF 不属于该类别。但是,如果您的 UDF 不是在 VBA 中定义的,那么它们可能是候选对象。请参阅此处了解完整的运行情况:msdn.microsoft.com/en-us/library/office/…
  • 与 C# 或 Java 一样,在 VBA 中您没有线程库或以这种方式限定函数。 VBA 不支持多线程。如果您真的需要执行多线程,就像 Tim 指出的那样,请使用 interop 调用 COM-able 应用程序来实现您所需要的。但我会发现它有问题 - 而是在另一个应用程序层中编写整个程序,以便能够使用多线程。 stackoverflow.com/questions/14143328/…

标签: multithreading excel vba concurrency


【解决方案1】:

是的,Excel 2007 及更高版本支持使用多核的多线程计算,但正如 Tim 所说 - 使用 VBA 编写多线程 UDF 是不可能的。

为了获得良好的 UDF 性能,您确实需要使用 XLL 接口并利用多线程。

您可以使用 Excel DNA(免费)或 Addin Express(收费)在 .NET C# 或 VB.Net 中创建多线程 XLL UDF。
VSTO 不支持 UDF,.Net 自动化 UDF 很慢
对于 C++ XLL UDF,我推荐 Planatech XLL+。

【讨论】:

  • 请考虑将结束问题视为重复问题,而不是多次发布几乎相同的答案。我刚刚开始并欺骗了他们中的一些人。
  • 它不是重复的:您指向的另一个答案不涵盖 OP 问题所涉及的 UDF。
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 2014-02-19
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多