[Office VBA] Excel Addin Deploy Solution (增益集發佈方案)
我在這個主題上吃了一點苦頭,現在不記下來以後肯定會忘記
本篇目錄
當 Excel VBA 寫好之後,另存新檔 *.xla 變成增益集,便可以外掛到 Excel,增益集預設會安裝到
C:\Users\ User Name \AppData\Roaming\Microsoft\AddIns
%appdata%\Microsoft\AddIns
Note:
- 增益集的工作表都會被隱藏
- 透過 ˊWorkbooks(“My Addin.xla”),取得增益集的工作簿
存成 *.xla 的檔案,可以看到 ThisWorkbook.IsAddin=true,只要將它改成 false,就會變回原來的 Excel 檔案
雙擊 *.xla 並不會將增益集安裝在 Excel Addin List,必需要調用 Application.AddIns.Add(“sample.xla”, True) 才行,值得注意的是 Application.AddIns 並沒有提供 Remove 方法
注意事項:
- 若只雙擊增益集,並不會開啟活頁簿,新增增益集時必須要有活頁簿存在
- ThisWorkbook 代表增益集
- ActiveWorkbook 代表活頁簿
- 在任何位置都可安裝
- 安裝成功會觸發 Workbook_AddinInstall 事件(在 Workbook_Open 之前),停用會觸發 Workbook_AddinUninstall事件 (在 Workbook_BeforeSave之前)
下段程式碼為自我安裝
Private m_AddinInstalled As Boolean Private Sub Workbook_AddinInstall() m_AddinInstalled = True MsgBox "增益集:" & ThisWorkbook.Name & "安裝成功" End Sub Private Sub Workbook_Open() If Not ThisWorkbook.IsAddin Then Exit Sub If m_AddinInstalled Then Exit Sub If ActiveWorkbook Is Nothing Then Application.Workbooks.Add Dim myAddin As Excel.AddIn Set myAddin = Application.AddIns.Add(Me.FullName, True) myAddin.Installed = True End Sub
成功後便可在 Addin List 看到已經新增的增益集
當我們不想使用這個增益集的時候,可以將它停用,項目勾勾拿掉,並關掉 Excel,Excel 關閉時,會寫入註冊機碼
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Add-in Manager
調用 myAddin.Installed = false 也可以得到同樣效果
- 調用 VBA 自我解安裝,很可惜這個機制不存在,或許可以處理機碼將上步驟的機碼刪掉,只要 Excel 一關閉,機碼又長出來,所以無法在 *.xla 寫 VBA 處理
- 刪除 *.xla,當 Excel 找不到 *.xla 時就會跳出錯誤
在Add-Ins 還存留著訊息,因為機碼已經有記錄,只要將滑鼠點擊不存在的項目,就會跳出下圖錯誤,按下 Yes 就會移掉機碼了
上面的步驟很麻煩,所以將增益集複製到以下目錄
%appdata%\Microsoft\AddIns
Excel Add-Ins 會根據目錄底下的有 *.xla 建立項目,這意味著我不需要處理機碼就能把 Add-Ins 裡的項目移掉,這一切將變的很簡單
我將特定的*.xla 貼到 %appdata%\Microsoft\AddIns (VBA Code:Application.UserLibraryPath) 目錄裡,然後再將它加入到 AddIns 裡,並啟用它
If Dir(m_TargetAddinFilePath) <> vbNullString Then Exit Sub Dim fso As New FileSystemObject Call fso.CopyFile(m_SourceAddinFilePath, m_TargetAddinFilePath, True) Set m_Addin = Application.AddIns.Add(m_TargetAddinFilePath, True) m_Addin.Installed = True Call SetControlForAddin(m_Addin) End Sub
則是在 %appdata%\Microsoft\AddIns 目錄刪掉特定的 *.xla
If Dir(m_TargetAddinFilePath) = vbNullString Then Exit Sub m_Addin.Installed = False Dim fso As New FileSystemObject If Dir(m_TargetAddinFilePath) <> "" Then fso.DeleteFile m_TargetAddinFilePath Set m_Addin = Nothing Call SetControlForAddin(m_Addin) MsgBox "Excel 要全部關閉才能生效,即將關閉本程式", vbCritical, "關閉通知" Unload Me End Sub
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/10/27/147105.aspx
範例下載:
https://dotblogsamples.codeplex.com/SourceControl/latest#Sample.SimpleAddinManager/
https://dotblogsfile.blob.core.windows.net/user/yc421206/1410/2014102716456566.zip
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET