Softwareverteilung für Excel-AddIns

07.05.2018   ·   Software , Excel

Wenn ein selbst entwickeltes Excel-AddIn nicht nur von einer Handvoll Kollegen genutzt, sondern größer verteilt werden soll, sollte man sich über diese Verteilung Gedanken machen. Zentral auf einem Netzlaufwerk abgelegt, lässt sich eine xlam-Datei nur noch umständlich aktualisieren, denn irgendjemand greift in der Regel darauf zu. Die hier beschriebene Vorgehensweise hat sich für mich bewährt. Es spielen hierfür vier Dateien auf einem Netzlaufwerk Hand in Hand. Auf dieses haben im Idealfall nur ein kleiner Kreis Schreib- aber alle Anwender Leserechte.

Batchskript

Los geht es mit einer bat-Datei. Sie begrüßt den Anwender mit ein paar Infos und kopiert die eigentliche AddIn-Datei in das User-Appdata-Verzeichnis. Vor und nach dem Kopieren wird ein Install-Makro ausgeführt. Einmal mit dem Befehl "Deaktiviere" und einmal mit dem Befehl "Aktiviere". Das wird gesteuert, indem ein Parameter temporär in eine lokale Datei geschrieben wird. Hierdurch lässt sich die Batch-Datei später auch als Updater benutzen.

echo off
COLOR 9F
:START
cls
echo. 
echo *****************************************************
echo *              Excel-Addin Installer                *
echo *---------------------------------------------------*
echo *                                                   *
echo * Blablabla                                         *
echo * j = ja, installieren                              *
echo * n = nein, abbrechen                               *
echo *                                                   *
echo * Treffen Sie Ihre Auswahl und bestätigen Sie mit   *
echo * Enter.                                            *
echo *                                                   *
echo *****************************************************
echo. 
echo Auswahl:
set /p var=
If %var%'==' goto START
IF %var%'==j' goto INST
IF %var%'==n' goto ENDE
Goto START

:INST
echo D > c:\addininstaller.txt
CALL "o:\blabla\Install-Makro.xlsm"
IF NOT EXIST "%APPDATA%\Microsoft\AddIns" mkdir "%APPDATA%\Microsoft\AddIns"
XCOPY "o:\blabla\Mein AddIn.xlam" "%APPDATA%\Microsoft\AddIns" /K /Y /C /I /H /R
IF ERRORLEVEL 1 GOTO Fehler
echo I > c:\addininstaller.txt
CALL "o:\blabla\Install-Makro.xlsm"
Goto Meldung

:Meldung
cls
echo. 
echo *****************************************************
echo *              Excel-Addin Installer                *
echo *---------------------------------------------------*
echo *                                                   *
echo * Installation war ERFOLGREICH.                     *
echo *                                                   *
echo *****************************************************
echo.
Pause
GOTO ENDE

:Fehler
cls
echo. 
echo *****************************************************
echo *              Excel-Addin Installer                *
echo *---------------------------------------------------*
echo *                                                   *
echo * Installation war NICHT ERFOLGREICH.               *
echo *                                                   *
echo * Moeglicherweise wurden nicht alle Excel-Instanzen *
echo * beendet. Stellen Sie dies sicher und versuchen    *
echo * Sie es erneut.                                    *
echo *                                                   *
echo *****************************************************
echo.
Pause
GOTO START

:ENDE
cls

Install-Makro

Das von der Batch-Datei zweimal aufgerufene Makro liest die Parameter-Datei aus und kümmert sich entweder um die Deaktivierung oder die Aktivierung des AddIns. In der Workbook_Open-Prozedur wird hierfür die Prozedur readFile() aufgerufen:

Public Const strAddIn As String = "Mein AddIn.xlam"
Public Const strAddInInstaller As String = "Install-Makro.xlsm"

Sub readFile()
    Dim strMode As String
    Dim fso, f1

    If Dir("c:\addininstaller.txt") <> "" Then
        Open "Y:\addininstaller.txt" For Input As #1
            Line Input #1, strMode
        Close #1

        Select Case LCase(Trim(strMode))
        Case "i"
            Call addInActivate
        Case "d"
            Call addInDeactivate
        End Select

        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f1 = fso.GetFile("c:\addininstaller.txt")
        f1.Delete

        Application.DisplayAlerts = False
        Application.Quit
    Else
        MsgBox "Zur Installation des AddIns muss zuvor eine Batch-Datei ausgeführt werden.", vbCritical
    End If
End Sub

Sub addInActivate()
    Dim objAddIn As AddIn

    For Each objAddIn In Application.AddIns
        If objAddIn.Name = strAddIn Then
                objAddIn.Installed = True
        End If
    Next objAddIn
End Sub

Sub addInDeactivate()
    Dim objAddIn As AddIn

    For Each objAddIn In Application.AddIns
        If objAddIn.Name = strAddIn Then
            If objAddIn.Installed = True Then
                objAddIn.Installed = False
            End If
        End If
    Next objAddIn
End Sub

Der Update-Prozess

Die Versions-Info ist eine schlichte Textdatei, in die ich die aktuellste Versionsnummer schreibe. Hier schaut das eigentliche AddIn bei jedem Start - also nach Aktivierung bei jedem Start von Excel - nach, ob die verwendete Version die aktuellste ist. Ist dem nicht so, wird wieder die Batch-Datei geöffnet und die lokale Kopie des AddIns durch die neuere überschrieben.

Public Const intVersionNumber As Integer = 16
Public Const strPathVersionCheck As String = "o:\blabla\version.txt"
Public Const strPathInstallerBat As String = "o:\blabla\installer.bat"

Private Sub Workbook_Open()
    Dim strVersionTxt As String
    Dim intRC As Integer
    Dim fso, f1

    If Dir(strPathVersionCheck) <> "" Then
        Open strPathVersionCheck For Input As #1
            Line Input #1, strVersionTxt
        Close #1

        If CInt(strVersionTxt) > intVersionNumber Then
            If MsgBox("Das AddIn " & strAddInName & " liegt in einer neuen Version vor." & vbCrLf & _
              "Möchten Sie von Version " & concatVersion(intVersionNumber) & " auf Version " & concatVersion(CInt(strVersionTxt)) & " aktualisieren?", vbQuestion + vbYesNo, strAddInName) = vbYes Then
                intRC = Shell(strPathInstallerBat, vbNormalFocus)
            End If
        End If
    End If
End Sub

Function concatVersion(intVersionNumber As Integer) As String
    concatVersion = Left(CStr(intVersionNumber), 1) & "." & Right(CStr(intVersionNumber), 1)
End Function

Kommentare

Daniel Birkhahn 09.05.2018

Hallo, ich habe zu dir gefunden weil du einen Kommentar bei mir hinterassen hast. Bin nicht mehr so aktiv wie früher und sehe das du das auch nur so als Projekt für freie Minuten hast mit dem Blog. Was ich dir nur sagen wollte ich glaube das Impressum und der Datenschutz darf nicht eine Seite sein. Das wird strikt getrennt behandelt! Gruss aus Freiberg ….

Hendrik 09.05.2018

Hallo Daniel, danke für Deinen Kommentar und den Hinweis. Diese Ein- oder Zweiseiten-Thematik wird offenbar rege diskutiert und man findet Fans der einen und der anderen Variante. Wie alles rund um die DSGVO ist auch das wohl ungewiss. Ich habe mich jetzt aber auch dafür entschieden, da zwei Seiten von zu machen. Schaden kann es nicht. Grüße.

Dein Kommentar



Auch interessant:
Foto-Lieb-Links #1