2009-01-06 101 views
6

我是VBA的新手,並且一直在爲Office提供一個小型宏應用程序。在基本相同的PC設置中,我們已經有大約80位用戶,並且只有少數用戶可以訪問它。VBA參考庫

我一直在玩一些使用Web服務引用訪問網頁的自動化,並且我還將Microsoft腳本運行時引用加載到項目中。我試圖在一臺測試PC上運行它,並且抱怨說缺少參考文獻。

我並不特別想繞過80臺PC並手動加載參考。

我的問題基本上是,我應該如何管理這個宏應用程序分配給80個奇怪的用戶,以確保每次爲每個用戶加載引用。

謝謝!

+0

如果你的參照依賴鏈接到其他軟件所能比存在不同的版本(例如Excel 2003或Excel 2007),安裝程序解決方案將不會提供預期的結果。 – 2009-01-07 06:38:57

回答

2

而不是讓文檔公開功能,使其成爲Office(套件或單個應用程序,您的選擇)的加載項。這樣,你不必處理參考。

然後,只需分發一個安裝包,並在其中註冊組件並在適當的Office應用程序中註冊加載項。

VB6可能是一個好主意,因爲它與VBA相似。

4

如果您有應用程序依賴的引用,而您知道不會在目標PC上運行,那麼我強烈建議您調查一些安裝程序技術。

使用安裝程序,您應該能夠安裝您的宏,並安裝並註冊所有適當的引用/庫。

Windows上通常有兩種風格,基於Windows Installer的技術和基於腳本的技術。

雖然有幾個選項供您使用(有幾個關於堆棧溢出的討論),但我們使用InstallShield進行所有部署。

使用Windows安裝程序技術,您可以構建MSI安裝文件,然後您可以使用組策略自動部署該文件。

+0

安裝程序技術將不允許管理「外部軟件」引用,例如對Office,Excel或Outlook對象庫的引用。另一個問題是當不同的機器使用不同版本的Excel時......我在答案中添加了關於這些特定問題的一些詞語。 – 2009-01-07 10:10:38

2

除了this answer,這是解決這類問題的防彈解決方案,但實現相當複雜,您還可以編寫一些代碼在VBA應用程序啓動時執行,檢查'引用''應用程序'對象的集合。然後,您可以檢查(1)計算機上是否有請求的文件(dll,ocx,tlb),以及(2)是否可以創建引用(application.references.addFromFile ...)。

注意:對象的聲明可能是「參考依賴」,如:

Dim cat as ADOX.catalog 

將引發編譯錯誤如果在相應的模塊是「編譯」的參考不活躍。然後,我建議您在啓動模塊(相當於「autoexec」)中隔離您的「引用檢查過程」,該模塊僅處理VBA和基本應用程序對象。用你的幫助文件檢查它(例如:在Access中,可以使用沒有外部引用的默認引用是VBA,Access和DAO)。

編輯:

的情況下,外部引用依賴於其他軟件包,(1)不能與MSI文件進行分發(2)可以有多個版本,我認爲「references.addFromFile」是唯一可以應用的解決方案。例如:

  • 您有一個VBA/Access運行客戶端應用程序 需提交到Word (msword.olb文件)。
  • 對於許可問題,你不能自由這個文件與您的MSI包
  • 分發OLB文件既可以是「XP版本或更新一個

我們的解決方案是在客戶端上2個表訪問文件。其中一個列出了在啓動時必須檢查或添加的所有引用(Word將是其中之一),另一個列出文件的所有可能位置(取決於用戶是否具有'office11'版本或更新版本一個),兩個表之間有一對多的關係。

所以,最好的策略可能是MSI包和管理之間的混合通過代碼:

  • 微星是偉大的分配獨立的DLL的或在您的應用程序,是完全「嵌入式」等文件,例如ActiveX控件(如掃描儀控制,報告或文件瀏覽器等)
  • 代碼是你的應用程序將有可以在用戶的​​機器不同的版本存在其他應用程序(Word,Excel和前景等)溝通的最佳解決方案。
5

大多數情況下,後期綁定將解決VBA中引用的問題,除非您有一些不尋常的參考。大多數問題是由於庫後版本的差異而導致的,可以通過後期綁定來克服。使用VBA時,通常建議您使用早期綁定進行開發,但使用後期綁定進行發佈。後期綁定的主要缺點是變化的內置常量的值(速度不再像過去那樣成爲問題。)

所以:

Dim fs As Object 'Instead of FileSystemObject ' 
Dim xl As Object 'Instead of Excel.Application ' 

Set fs=CreateObject("Scripting.FileSystemObject") 
Set xl=CreateObject("Excel.Application") 

'Value instead of built-in constant ' 
ForReading=2 
Set f = fs.OpenTextFile("c:\testfile.txt", ForReading)