VBA-Funktionen für Entwickler

In dieser Ausgabe unserer Tipps-und-Tricks-Reihe stellen wir Ihnen einige Funktionen vor, die Sie speziell als Entwickler einsetzen können. Sie erfahren beispielsweise, wie Sie neue Versionsnummern ermitteln, eine Versionsnummer auf Gültigkeit prüfen und verschiedene Versionsstände vergleichen, ob eine Datenbank eine .mde/.accde-Datei ist, wie Sie Texte per Code in die Zwischenablage kopieren oder wie Sie Zeichenketten für den Einsatz in URLs vorbereiten.

Versionen fortschreiben

Angenommen, Sie möchten Ihrer Anwendung auf Knopfdruck eine neue Versionsnummer verpassen – beispielsweise, indem Sie diese in das Feld Version einer Optionentabelle schreiben.

Ausgehend davon, dass Sie eine aus vier Elementen bestehende Versionsnummer verwenden (zum Beispiel 1.0.0.7), müssen Sie zunächst festlegen, welche Stelle der Versionsnummer geändert werden soll.

Bei der letzten Stelle ist dies kein Problem: Die wird einfach hochgezählt (etwa von 1.0.0.7 auf 1.0.0.8). Bei allen anderen Stellen ist sind jedoch auch noch die folgenden Stellen auf 0 einzustellen, zum Beispiel von 1.0.0.8 auf 1.0.1.0, von 1.0.1.9 auf 1.1.0.0 oder auch von 1.2.3.4 auf 2.0.0.0.

Die Funktion aus Listing 1 erledigt dies, indem sie einfach die Position der zu ändernden Stelle abfragt und als Ergebnis die neue Versionsnummer zurückliefert.

Listing 1: Neue Versionsnummer ermitteln

Public Function NeueVersion(strVersion) As String
    Dim strVersionsstufen() As String
    Dim intVersionsebene As Integer
    intVersionsebene = InputBox("Aktuelle Versionsnummer: " & strVersion & vbCrLf _
        & "Welche Stelle erhöhen", "Neue Version", 4)
    strVersionsstufen() = Split(strVersion, ".")
    Select Case intVersionsebene
        Case 1
            strVersionsstufen(0) = strVersionsstufen(0) + 1
            strVersionsstufen(1) = 0
            strVersionsstufen(2) = 0
            strVersionsstufen(3) = 0
        Case 2
            strVersionsstufen(1) = strVersionsstufen(1) + 1
            strVersionsstufen(2) = 0
            strVersionsstufen(3) = 0
        Case 3
            strVersionsstufen(2) = strVersionsstufen(2) + 1
            strVersionsstufen(3) = 0
        Case 4
            strVersionsstufen(3) = strVersionsstufen(3) + 1
    End Select
    strVersion = Join(strVersionsstufen(), ".")
    NeueVersion = strVersion
End Function

Die Funktion erwartet als Parameter die aktuelle Versionsnummer in der Form x.x.x.x. Sie fragt als Erstes mit einer Inputbox die Stelle ab, die erhöht werden soll. Die Inputbox erwartet einen Wert zwischen 1 und 4.

Die einzelnen Ebenen der Versionsnummer werden dann mit der Funktion Split in die Felder des Arrays intVersionsstufen geschrieben. Die folgende Select Case-Bedingung verzweigt entsprechend der zu ändernden Ebene der Versionsnummer.

Die zur jeweiligen Ebene gehörende Zahl wird um eins erhöht, die danach folgenden Ebenen auf 0 eingestellt. Die Join-Anweisung fügt die neuen Versionsstufen wieder zu einer vollständigen Versionsnummer zusammen.

Die Funktion finden Sie im Modul mdlVersionsnummern der Beispieldatenbank.

Versionsstände vergleichen

Wenn Sie mit Versionsständen arbeiten, möchten Sie vielleicht auch einmal zwei Versionsstände vergleichen.

Wenn man sich darauf einigt, zumindest für die hinteren drei Zahlen, also Hauptversionsnummer, Nebenversionsnummer, Revisionsnummer und Buildnummer (also etwa 1.0.3.8), nur einstellige Zahlen zu verwenden, könnte man einfach die Trennzeichen (wie den Punkt) weglassen und die resultierenden Zahlenwerte vergleichen.

In der Regel gibt es aber auch Versionsstände wie 2.1.13.1048, und dort greift diese Vorgehensweise nicht mehr.

Also benötigen wir eine etwas ausgefeiltere Funktion, um zu prüfen, ob ein Versionsstand neuer als ein anderer ist. Diese Prüfung erledigt die Funktion IstVersionAktueller aus Listing 2.

Listing 2: Prüfen, ob eine Versionsnummer aktueller als die andere ist

Public Function IstVersionAktueller(strVersionNeu As String, strVersionAlt As String) As Boolean
    Dim strVersionsstufenNeu() As String
    Dim strVersionsstufenAlt() As String
    Dim intNeu As Integer
    Dim intAlt As Integer
    Dim intVersionsebene As Integer
    If Not VersionsnummerGueltig(strVersionNeu) Then
        MsgBox "Die Versionsnummer ''" & strVersionNeu & "'' ist ungültig."
        Exit Function
    End If
    If Not VersionsnummerGueltig(strVersionAlt) Then
        MsgBox "Die Versionsnummer ''" & strVersionAlt & "'' ist ungültig."
        Exit Function
    End If
    strVersionsstufenNeu = Split(strVersionNeu, ".")
    strVersionsstufenAlt = Split(strVersionAlt, ".")
    For intVersionsebene = 0 To 3
        intNeu = CInt(strVersionsstufenNeu(intVersionsebene))
        intAlt = CInt(strVersionsstufenAlt(intVersionsebene))
        Select Case intNeu
            Case Is > intAlt
                IstVersionAktueller = True
                Exit Function
            Case Is < intAlt
                Exit Function
        End Select
    Next intVersionsebene
End Function

Die Funktion erwartet die Angabe zweier Versionsstände, wobei der erste der aktuellere sein soll. Kann die Funktion dies bestätigen, liefert sie den Wert True zurück, sonst False.

Für die Prüfung werden die beiden Versionsstände zunächst mit der Funktion VersionsnummerGueltig auf ihr Format geprüft (siehe weiter unten).

Die Versionsnummern sollten aus vier durch Punkte getrennten Elementen bestehen (x.x.x.x).

Haben die beiden Versionsnummern das erwartete Format, werden die einzelnen Elemente beider Versionsnummern in die Arrays strVersionsstufenNeu() und strVersionsstufenAlt() aufgeteilt. Die Funktion vergleicht dann vom jeweils ersten Element ausgehend alle Elemente.

Dazu konvertiert sie den neuen und den alten Wert zunächst in die beiden Variablen intNeu und intAlt.

Eine Select Case-Bedingung prüft dann zwei Fälle:

  • Ist intNeu größer als intAlt Dann ist die als neue Version angegebene Versionsnummer tatsächlich die aktuellere.
  • Ist intNeu kleiner als intAlt Dann ist die als ältere Version angegebene Versionsnummer die aktuellere.

In beiden Fällen wird die Funktion beendet, einmal mit dem Rückgabewert True und einmal mit False. Sind beide Versionsnummern gleich, werden die Werte der jeweils nächsten Ebene der Versionsnummern verglichen.

Sollte bis zum letzten Element keine Entscheidung gefallen sein, sind beide Versionsnummern gleich – das bedeutet, dass die Funktion ebenfalls den Wert False zurückgeben muss.

Die Funktion finden Sie ebenfalls im Modul mdlVersionsnummern der Beispieldatenbank.

Versionsnummern prüfen

Wenn Sie Versionsnummern vergleichen möchten, sollten Sie zuvor prüfen, ob diese auch gültig sind.

Dies erledigt die Funktion VersionsnummerGueltig aus Listing 3. Beim Entwickeln dieser Funktion haben wir eine Reihe von Testfällen zuhilfe genommen, die wie folgt in einer VBA-Prozedur landeten:

Listing 3: Versionsnummer auf Gültigkeit prüfen

Public Function VersionsnummerGueltig(strVersion As String)
    Dim strVersionsstufen() As String
    Dim strNumerisch As String
    Dim intVersionsstufe As Integer
    Dim i As Integer
    strVersionsstufen = Split(strVersion, ".")
    If Not (UBound(strVersionsstufen) - LBound(strVersionsstufen) = 3) Then
        Exit Function
    End If
    For intVersionsstufe = LBound(strVersionsstufen) To UBound(strVersionsstufen)
        strNumerisch = Replace(strVersionsstufen(intVersionsstufe), ".", "")
        If Len(strNumerisch) = 0 Then
            Exit Function
        End If
        For i = 1 To Len(strNumerisch)
            If Not IsNumeric(Mid(strNumerisch, i, 1)) Then
                Exit Function
            End If
        Next i
    Next intVersionsstufe
    VersionsnummerGueltig = True
End Function
Public Sub Test_VersionsnummerGueltig()
    Debug.Print "Test 1:",
    VersionsnummerGueltig("1") = False
    ...
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar