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

Weitere Testzeilen prüften beispielsweise die Werte abc, , 1.0, 1.0.1, 1.0.0.0, 1.0.0.0.0, 1.2.3.4 oder 1,2.3.4.5. Auf diese Weise können Sie während der Entwicklung einer solchen Funktion leicht prüfen, ob sie für alle Testfälle das gewünschte Ergebnis liefert.

Die Funktion VersionsnummerGueltig erwartet eine Zeichenkette mit der Versionsnummer als Eingangsparameter und liefert einen Boolean-Wert zurück.

Die Prüfung erfolgt in zwei Schritten. Der erste prüft, ob die Versionsnummer überhaupt aus vier Elementen besteht. Dazu ist das Vorhandensein von drei Punkten (.) nötig.

Damit ist aber noch nicht sichergestellt, dass die Versionsangabe auch vier durch die Punkte getrennte Zahlen enthält.

Dies prüft die Funktion im zweiten Schritt. Dort werden alle vier der in ein Array eingefügten Elemente der Versionsnummer zunächst auf die Zeichenlänge geprüft (dies schließt fehlende Zahlen wie in 1..1.0 aus). Danach untersucht eine weitere Schleife, ob die einzelnen Elemente der Versionsnummer ausschließlich aus Zahlen bestehen.

Schlägt eine der Prüfungen fehl, wird die Funktion schlicht und einfach abgebrochen. Da Boolean-Variablen standardmäßig den Wert 0, also False, enthalten, liefert die Funktion dann den korrekten Wert zurück.

Nur wenn alle Prüfungen gelingen und die Funktion somit nicht vorzeitig abgebrochen wird, weist die Funktion ihrem Rückgabeparameter am Ende den Wert True zu.

Die Funktion finden Sie ebenfalls im Modul mdlVersionsnummern der Beispieldatenbank.

Prüfen, ob Datenbank eine .mde/.accde-Datei ist

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar