2010-06-22 52 views
0

我有一個xla文件引用了目標機器上可能存在或不存在的其他一些Excel加載項。目前,Excel在加載xla時出現「編譯錯誤:找不到項目或庫」失敗。VBA:檢測庫是否在運行時可用

代碼是一樣的東西:

Dim result as Integer 
    result = SomeAddIn.SomeFunction(x) 

添加前綴,這與「對錯誤轉到AddInMissing」,因爲這被看作是一個編譯錯誤,並沒有幫助。

那麼,是否有任何方法在VBA中按名稱延遲綁定/引用加載項,這樣如果某個加載項不存在,我可以優雅地失敗(禁用某些功能)?

+0

可能會感興趣:http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.programming/2005- 03/1672.html – Fionnuala 2010-06-22 11:05:46

回答

1

您可以檢查Addins集合;

if AddIns("The addins title").Installed = True then ... 

,或者你可以檢查文件名

For Each Item In AddIns 
    Debug.? Item.Path, Item.Name 
Next 
+1

+1但是寫'如果x = True'只是可怕的,可怕的錯誤。 – 2010-06-22 11:04:17

+0

謝謝,這揭示了一些事情,但不幸的是我不知道我在做什麼。 (請原諒我的VBA nube-ness)枚舉AddIns集合會列出Excel中的「工具|加載項...」菜單所示的加載項。這與您在Excel的VB環境中看到的VBA項目列表不同。我感興趣的特定xla在此列爲項目,不在AddIns集合中。有沒有辦法列舉這些呢? (似乎工作簿集合似乎沒有提供 - 我嘗試的第一件事) – 2010-06-22 12:03:45

+0

可能需要混淆宏安全設置和「信任訪問VBA項目設置」,但嘗試;對於每個proj在Application.VBE.VBProjects ..Debug.Print proj.Name ..下一步 – 2010-06-22 13:12:57

0

謝謝大家。遍歷Application.VBE.VBProjects允許我檢測xla是否存在。下一步是將所有對目標xla中定義的函數的調用包裝在一個包裝模塊中。這是必要的,因爲我試圖避免出現編譯錯誤。如果xla可用,我只調用這些包裝函數,幸運的是VBA在需要時才編譯模塊(這基本上意味着創建兩個包裝 - 外包裝檢查xla是否可用,內層是否調用目標xla)。

一個更復雜的解決方案可能會看

0

你並不需要使用VBE.VBProjects或加載項加載項都與VBE.VBEProjects:一個XLA是工作簿集合的一個隱藏的成員,所以如果你知道您可以直接在Workbooks集合中檢查XLA的名稱,以查看它是否已打開。 這種方式你不需要用戶系統具有信任訪問VBE