Как развернуть надстройку VBA Excel (foo.xlam) с помощью установщика msi? - PullRequest
3 голосов
/ 10 июня 2011

Я разработчик C #, который связывает коллегиную надстройку Excel VBA (файл .xlam) с моим установщиком msi (созданным с использованием проекта VS Deployment, если это имеет значение).Файл .xlam находится в папке приложения (C: \ Program Files (x86) \ MyCompany \ TheProduct).Пользователи вынуждены перейти к параметрам Excel> Надстройки> Управление надстройками Excel Перейти ...> Обзор, а затем перейти к каталогу установки, указанному выше.Каталог по умолчанию для экрана просмотра -% APPDATA% \ Microsoft \ AddIns.

Можно ли автоматически включить эту надстройку VBA без всех нажатий?

Заранее спасибо

Фрэнк

Ответы [ 4 ]

3 голосов
/ 09 января 2017

Я создал процедуру автоматической установки, которая будет добавлена ​​в раздел «Эта рабочая книга» файла XLAM, чтобы он автоматически запускался при открытии файла. Чтобы различать установочный файл и установленный файл, версия установки называется «.install.xlam», а установленная версия называется просто «.xlam». (В противном случае в Excel есть «Извините, Excel не может открыть две книги с одинаковым именем одновременно».

Процедура: - Переименуйте файл XLAM с помощью .install.xlam - Откройте его и отредактируйте в Visual Basic Editor (VBE). - Добавьте следующие процедуры в раздел «Эта рабочая тетрадь» в VBE. - Сохраните ваш файл

Чтобы поделиться / установить свой XLAM, вам просто нужно попросить пользователя дважды щелкнуть файл XLAM, включить макросы при необходимости и принять установку надстройки.

Если вы хотите обновить XLAM позже, просто дважды щелкните по нему, включите макросы по мере необходимости и откажитесь от его установки. Затем отредактируйте его и сохраните изменения.

Вот код, который нужно добавить в «ThisWorkbook»:

Option Explicit
'    (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

' Set it to True to be able to Debug install mechanism
Const bVerboseMessages = False

' Will be use to verify if the procedure has already been run
Dim bAlreadyRun As Boolean

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
2 голосов
/ 11 июня 2011

Обычно это включает обновление раздела реестра HKCU (это то, что происходит, когда вы вручную проверяете надстройку в настройках Excel).Однако иногда я использую папку XLStart в установочном каталоге Excel.При условии, что ваше дополнение является правильным типом, оно будет загружено Excel при запуске для всех пользователей в системе, и у них нет возможности отключить его.Иногда это приемлемо.Развертывание намного проще.

1 голос
/ 16 ноября 2012

Вы можете вставить этот код в свой * .xlam на листе «ThisWorkBook», установить этот код и активировать текущие надстройки, просто открыв

Private Sub Workbook_Open()
    Dim oXL As Object, oAddin As Object
    URL = Me.Path & "\"
    normalUrl = Application.UserLibraryPath ' Environ("AppData") & "\Microsoft\AddIns"
    AddinTitle = Mid(Me.Name, 1, Len(Me.Name) - 5)

    If URL <> normalUrl Then
        If MsgBox("Can you Install AddIns ?", vbYesNo) = vbYes Then
            Set oXL = Application ' CreateObject("Excel.Application")
            oXL.Workbooks.Add
            Me.SaveCopyAs normalUrl & Me.Name
            Set oAddin = oXL.AddIns.Add(normalUrl & Me.Name, True)
            oAddin.Installed = True

            oXL.Quit
            Set oXL = Nothing
        End If
    End If
End Sub
1 голос
/ 10 июня 2011

Установщик Windows не имеет прямой поддержки для этого. Поэтому вы либо используете некоторые пользовательские действия, либо покупаете инструмент, который предлагает прямую поддержку для установки надстроек Office.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...