自动安装Excel VBA加载项

我写了excel VBA加载项文件(.xlam)。 我也有一个导出的function区定制(.exportedUI)。 我如何创build一个安装程序,以便我的用户可以运行安装程序来安装Excel VBA加载项和function区定制?

如果您需要一个商业工具,Advanced Installer对Office Add-in安装程序有一些内置的支持: http : //www.advancedinstaller.com/user-guide/addins-tab.html

另一种方法是使用自定义代码来configuration加载项。 也许这将有助于: http : //www.cpearson.com/excel/installinganxla.aspx

我创build了一个自动安装过程,将其添加到XLAM文件的“This Workbook”部分,以便在文件打开时自动运行。 为了区分安装文件和已安装的文件,安装版本名为“.install.xlam”,安装的版本名为“.xlam”。 (否则Excel有一个“对不起,Excel不能同时打开两个具有相同名称的工作簿”。

过程: – 使用.install.xlam命名您的XLAM文件 – 在Visual Basic编辑器(VBE)中打开它并进行编辑 – 将以下过程添加到VBE中的“本工作簿”部分 – 保存文件

为了共享/安装您的XLAM,您现在只需要让用户双击XLAM文件,根据需要启用macros并接受安装插件。

如果您稍后要更新您的XLAM,则只需双击它,根据需要启用macros并拒绝安装它。 然后编辑它并保存更改。

这里是添加到“ThisWorkbook”的代码:

' (c) Willy Roche (willy.roche(at)centraliens.net) ' Install procedure of XLAM (library of functions) ' This procedure will install a file name .install.xlam in the proper excel directory ' The install package will be name ' During install you may be prompt to enable macros (accept it) ' You can accept to install or refuse (which let you modify the XLAM file macros or install procedure Option Explicit Const bVerboseMessages = False ' Set it to True to be able to Debug install mechanism Dim bAlreadyRun As Boolean ' Will be use to verify if the procedure has already been run Private Sub Workbook_Open() ' This sub will automatically start when xlam file is opened (both install version and installed version) Dim oAddIn As Object, oXLApp As Object, oWorkbook As Workbook Dim i As Integer Dim iAddIn As Integer Dim bAlreadyInstalled As Boolean Dim sAddInName As String, sAddInFileName As String, sCurrentPath As String, sStandardPath As String sCurrentPath = Me.Path & “\” sStandardPath = Application.UserLibraryPath ' Should be Environ(“AppData”) & “\Microsoft\AddIns” DebugBox (“Called from:'” & sCurrentPath & “'”) If InStr(1, Me.Name, “.install.xlam”, vbTextCompare) Then ' This is an install version, so let's pick the proper AddIn name sAddInName = Left(Me.Name, InStr(1, Me.Name, “.install.xlam”, vbTextCompare) – 1) sAddInFileName = sAddInName & “.xlam” ' Avoid the re-entry of script after activating the addin If Not (bAlreadyRun) Then DebugBox (“Called from:'” & sCurrentPath & “' bAlreadyRun = false”) bAlreadyRun = True ' Ensure we won't install it multiple times (because Excel reopen files after an XLAM installation) If MsgBox(“Do you want to install/overwrite '” & sAddInName & “' AddIn ?”, vbYesNo) = vbYes Then ' Create a workbook otherwise, we get into troubles as Application.AddIns may not exist Set oXLApp = Application Set oWorkbook = oXLApp.Workbooks.Add ' Test if AddIn already installed For i = 1 To Me.Application.AddIns.Count If Me.Application.AddIns.Item(i).FullName = sStandardPath & sAddInFileName Then bAlreadyInstalled = True iAddIn = i End If Next i If bAlreadyInstalled Then ' Already installed DebugBox (“Called from:'” & sCurrentPath & “' Already installed”) If Me.Application.AddIns.Item(iAddIn).Installed Then ' Deactivate the add-in to be able to overwrite the file Me.Application.AddIns.Item(iAddIn).Installed = False Me.SaveCopyAs sStandardPath & sAddInFileName Me.Application.AddIns.Item(iAddIn).Installed = True MsgBox (“'” & sAddInName & “' AddIn Overwritten”) Else Me.SaveCopyAs sStandardPath & sAddInFileName Me.Application.AddIns.Item(iAddIn).Installed = True MsgBox (“'” & sAddInName & “' AddIn Overwritten & Reactivated”) End If Else ' Not yet installed DebugBox (“Called from:'” & sCurrentPath & “' Not installed”) Me.SaveCopyAs sStandardPath & sAddInFileName Set oAddIn = oXLApp.AddIns.Add(sStandardPath & sAddInFileName, True) oAddIn.Installed = True MsgBox (“'” & sAddInName & “' AddIn Installed and Activated”) End If oWorkbook.Close (False) ' Close the workbook opened by the install script oXLApp.Quit ' Close the app opened by the install script Set oWorkbook = Nothing ' Free memory Set oXLApp = Nothing ' Free memory Me.Close (False) End If Else DebugBox (“Called from:'” & sCurrentPath & “' Already Run”) ' Already run, so nothing to do End If Else DebugBox (“Called from:'” & sCurrentPath & “' in place”) ' Already in right place, so nothing to do End If End Sub Sub DebugBox(sText As String) If bVerboseMessages Then MsgBox (sText) End Sub