我一直在說,有對象的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作用於用戶預期的一組不同的數據。 「正確」的做法是「優雅地失敗」。
感謝您的完整答案。我的問題是,有問題的範圍永遠不會被用戶刪除或移動。每個範圍對應一列,只修改列中的單元格值。 – Pragmateek 2011-04-07 17:29:32
這聽起來很奇怪。細胞如何修改?只需手工編輯?你知道你得到了什麼確切的例外/ HRESULT嗎? – 2011-04-08 03:47:20
是的單元格只能由用戶手工修改。我不記得確切的錯誤代碼,但只存儲一些字符串引用而不是「範圍」本身已經解決了這個問題,並不會影響代碼,也不會對性能產生副作用。 – Pragmateek 2011-04-09 15:16:22