2013-03-12 49 views
2

我有一個Excel電子表格,我有一個.Net庫,它可以完成一些相當複雜的計算。 .Net程序集通過COM暴露給Excel中的VBA代碼。Excel中的長時間運行

當我呼叫到.Net庫時,Excel UI線程在計算過程中被阻塞。

這可以防止用戶與Excel進行交互,並且在某些情況下向用戶指示Excel在標題欄中是(Not Responding)。

我不太瞭解Excel 2010中的VBA,但有什麼方法可以在不同的線程中產生對我的.Net庫的調用,並向用戶展示「進行中」對話框?

回答

2

這是可能做到這一點,但可能需要一些努力來連線一切。有許多方法,你可以接近這一點,其中一個看起來是這樣的:

  • VBA調用C#COM對象的UI線程
  • C#的COM對象開始BackgroundWorker運行計算。請注意,您不能從BackgroundWorkerDoWork事件處理程序訪問Excel對象模型。如果要在計算過程中更新Excel,則BackgroundWorker應使用ReportProgress方法報告UI線程上的進度。
  • ProgressChanged事件處理程序(它在UI線程上運行)中,C#代碼可以直接更新Excel對象模型,也可以調用VBA代碼來執行更新。
  • 在BackgroundWorker運行時,VBA代碼可以顯示「進度」對話框,以避免任何重入問題。
1

有可能是NO,你不能在C#中使用另一個線程。 Excel是單線程應用程序,該線程是UI線程,因此使用Excel的對象模型阻止UI。

另一種方法是使用OpenXmlSdk並使用它在單獨的線程上對Excel數據的副本執行操作,然後將數據加載回來。根據數據大小和計算時間,它可能非常值得。我在Word中使用了大約100頁的文檔,並將處理時間從10分鐘縮短到< 30秒,這30秒中的大部分時間用於將數據導出和導入到Word中。 Excel在這方面往往要快一點。

1

這很難做到使用VBA,因爲Excel VBA幾乎是單線程同步的。 但是,Excel 2010確實支持異步UDF:查看Excel DNA或Addin Express以獲取從.NET執行此操作的一些幫助。
http://exceldna.codeplex.com/wikipage?title=Performing%20Asynchronous%20Work&referringTitle=Documentation
http://www.add-in-express.com/add-in-net/index.php

2http://www.add-in-express.com/add-in-net/index.php
您也可以從一個基於C-XLL
http://msdn.microsoft.com/en-us/library/office/ff796219%28v=office.14%29.aspx

0

你應該使用Excel-dna來做到這一點。你將很容易用它調用異步操作。