2013-02-03 151 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。 –