2011-04-07 66 views
0

我目前使用的是Excel 2003 Interop機制來操縱一些範圍保持一個Excel COM對象活着

有時候我存放一些範圍在我插件,作爲一個類的屬性,但是當我試圖在稍後的時間COM對象有時是隨機的,無效的訪問它們,以及每個屬性當我嘗試訪問它們時,COM對象將拋出「COMException」。

我一直在說,有對象的Excel分配和對象的插件是使用之間沒有密切的聯繫:這樣的「真實」 Range對象可以通過Excel中在任何時候被釋放,甚至如果從.Net/C#的角度來看,我仍然有一個參考。

所以,我想知道是否有任何方法讓我的Range對象保持活着以便以安全的方式使用它們?

備註:我可以用一種變通方法等存儲字符串將代表範圍,例如「A1」,而不是自己的範圍,但這會使代碼不那麼幹淨。

在此先感謝您的幫助。

回答

1

我一直在說,有對象的Excel分配和對象之間沒有密切聯繫的插件使用

也就是說指的是Excel使用「飛鐵」的事實。 Excel內部不使用COM;它會根據需要爲COM客戶端(無論是外接程序,VBA還是外部應用程序)提供請求,爲其內部結構(我認爲它們是「視圖」)創建COM包裝程序。

...「真正」的範圍對象,可以用Excel隨時

我不會說「隨時」中解脫出來。一旦得到一個Range對象或任何其他COM對象,COM對象將保持可用狀態,直到被釋放爲止(在COM意義上 - 每個AddRef()調用IUnknown::Release())。

但是,如果您持有COM對象並且底層結構不再存在,則COM對象將變爲無效。它還能做什麼?

比方說你堅持Range並且用戶刪除範圍所在的工作表。你認爲應該發生什麼?這不像是Excel會拋出一個消息框說「對不起,你不能刪除工作表,因爲一些代碼想要堅持它」。如果用戶刪除數據,則Excel將符合並且Range對象將不得不應對。你需要爲這種可能性做好準備。如果您的加載項提供了公式,讓他們返回#REF等。

我不認爲有反正主動檢測到這一點。我檢查是否有某種IsValid(myRange)方法在某處,但我沒有看到任何。

無論如何,它不太可能是非常有用的;許多命令可能會導致[窗口]消息被處理,並且任何時候在代碼外發生的情況都會在不知情的情況下運行,並使您的範圍無效。你必須在發生錯誤時抓住錯誤,並適當地「踢」。

也許你是對的。它可能是「在任何時間」。但它不是隨機的。有人不得不去掉這個範圍。

順便說一句,我不會試圖智取情況。保存範圍參考文本只會導致AddIn作用於用戶預期的一組不同的數據。 「正確」的做法是「優雅地失敗」。

+0

感謝您的完整答案。我的問題是,有問題的範圍永遠不會被用戶刪除或移動。每個範圍對應一列,只修改列中的單元格值。 – Pragmateek 2011-04-07 17:29:32

+0

這聽起來很奇怪。細胞如何修改?只需手工編輯?你知道你得到了什麼確切的例外/ HRESULT嗎? – 2011-04-08 03:47:20

+0

是的單元格只能由用戶手工修改。我不記得確切的錯誤代碼,但只存儲一些字符串引用而不是「範圍」本身已經解決了這個問題,並不會影響代碼,也不會對性能產生副作用。 – Pragmateek 2011-04-09 15:16:22