2013-02-03 150 views
1

所以我在网上搜索和大部分的答案我说Excel中没有并发。但是有些文章说EXCEL 2007提供了多线程来加速计算。我真的很困惑,有没有可能?excel vba中的并发和多线程

在我的工作簿中,有一些单元格是使用用户定义的函数进行计算的。这些单元每秒通过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,对象本身没有任何修改或任何东西。

+0

为了使用并行化,Excel必须考虑函数是线程安全的,VBA UDF不适合该类别。但是,如果你的UDF被定义在VBA以外的东西,那么他们可能是候选人。在这里看到一个完整的破解:http://msdn.microsoft.com/en-us/library/office/bb687899.aspx#xl2007xllsdk_threadsafe –

+0

像C#或Java,在VBA中,你没有线程库或以这种方式限定功能。 VBA不支持多线程。如果你确实需要做多线程,就像Tim指出的那样,使用'interop'调用* COM-able *应用程序来实现你所需要的。但是,我会发现它有问题 - 而是在其他应用程序层中编写整个程序,以便能够使用多线程。 http://stackoverflow.com/questions/14143328/any-ideas-how-to-determine-what-age-group-an-individual-belongs-in-excel/14143756#14143756 – bonCodigo

回答

0

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

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

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

+0

请考虑关闭问题作为重复,而不是多次发布几乎相同的答案。我刚刚走在前面,他们中的许多人都受到了欺骗。 –

+0

它不是重复的:你指出的另一个答案不包括OP的问题所涉及的UDF。 –