Language: Deutsch English















Last Update: 2019 - 09 - 03





Eine printf oder String.Format Funktion für VBA

by Philipp Stiefel, veröffentlicht: 16. März; 2019, zuletzt aktualisiert: 16. März; 2019


String.Format / printf in VBA - article header

Picture by Rebecca Moninghoff. Used here under CC0 licensing

Kürzlich habe ich ein Video zum ParamArray-Schlüsselwort in VBA aufgenommen. In dem Video habe ich die Coalesce-Funktion als ein Beispiel verwendet, um zu zeigen in welchen Zusammenhang das ParamArray nützlich sein kann. Dennoch wurde ich von einem Zuschauer gefragt, ob ich denn noch ein weiteres, nützliches Beispiel für die Verwendung von ParamArray zeigen könne.

Mir ist sofort ein weiteres Beispiel in den Sinn gekommen. Anders als die Coalesce-Funktion, die ich vor dem o.g. Beispiel nie zuvor in Access und VBA verwendet habe, ist dieses Beispiel eine Funktion, die ich (fast) jeden Tag bei der Arbeit mit VBA einsetze. – Und das seit inzwischen 16 Jahren! - Ich war selbst verblüfft, als ich mir für diesen Artikel die Funktion angeschaut habe.

Screenshot des Datums meiner urspr&¨lichen printf function

Hast du schon mal mit einer C-basierenden Programmiersprache gearbeitet? Wenn ja, dann kennst du sicherlich die printf-Funktion. Wenn du bereits mit dem Microsoft .Net Framework gearbeitet hast, wirst du die String.Format-Methode kennen.

Beide Funktionen nehmen eine Zeichenkette (String) entgegen, die Platzhalter enthält und eine beliebige Anzahl an Werten, die an den Positionen der Platzhalte in die Zeichenkette eingefügt werden.

Beispiel in VB.net:

Dim trainName As String = "RE20" Dim destination As String = "Limburg" Dim departurePlatform As Integer = 21 Dim departureTime As Date = #4:45:00 PM# Debug.Print(String.Format("Your train {0} to {1} will leave from platform {2} at {3:t}", _ trainName, destination, departurePlatform, departureTime))

Output von String.Format in VB.net

Diese Funktion bzw. Methode ist sehr nützlich, weil:

  1. Du brauchst den Code für die mühsame und fehlerträchtige String-Verkettung nicht immer per Hand schreiben, wenn du einen solchen String aus mehreren Variablen zusammensetzen willst.
  2. Der Eingangsstring ist auf diese Weise im Code besser lesbar. Damit erkennst du Fehler schneller und kannst den Text einfacher nachträglich anpassen.
  3. Wenn du noch Formatierungen für die Werte in dem String anwenden willst, bekommen die beiden vorigen Punkte noch wesentlich mehr Gewicht.
  4. Du kannst den String in einer Tabelle oder einer Konfigurationsdatei speichern und erst zur Laufzeit mit den tatsächlichen Werten kombinieren. Das ist auch für eine Übersetzung der Anwendung in eine andere Sprache sehr hilfreich erforderlich.

Lass uns zum Vergleich mal den Code anschauen, den man mit klassischer Stringverkettung schreiben müsste, um dasselbe Ergebnis zu erzielen.

Debug.Print printf("Your train {0} to {1} will leave from platform {2} at {3:hh:nn}", _ trainName, destination, departurePlatform, departureTime) Debug.Print "Your train " & trainName & " to " & destination & " will leave from platform " _ & departurePlatform & " at " & Format(departureTime, "hh:nn")

Wenn du mich fragen würdest, welche der beiden Varianten ich in meinem Code bevorzugen würde, müsste ich keine Sekunden nachdenken.

Aus diesem Grund habe ich meine eigene Implementierung von String.Format / printf in VBA geschrieben. Die Implementierung selbst ist eigentlich nichts Besonderes. Allerdings ist dieser Code wieder zwingend davon abhängig, dass man das ParamArray-Schlüsselwort für verwendet, um die variable Anzahl von Argumenten zu ermöglichen.

Public Function printf(ByVal strText As String, ParamArray Args()) As String ' © codekabinett.com - You may use, modify, copy, distribute this code as long as this line remains Dim i As Integer Dim strRetVal As String Dim startPos As Integer Dim endPos As Integer Dim formatString As String Dim argValueLen As Integer strRetVal = strText For i = LBound(Args) To UBound(Args) argValueLen = Len(CStr(i)) startPos = InStr(strRetVal, "{" & CStr(i) & ":") If startPos > 0 Then endPos = InStr(startPos + 1, strRetVal, "}") formatString = Mid(strRetVal, startPos + 2 + argValueLen, endPos - (startPos + 2 + argValueLen)) strRetVal = Mid(strRetVal, 1, startPos - 1) & Format(Nz(Args(i), ""), formatString) & Mid(strRetVal, endPos + 1) Else strRetVal = Replace(strRetVal, "{" & CStr(i) & "}", Nz(Args(i), "")) End If Next i printf = strRetVal End

Nachdem du diese Funktion in deiner Anwendung geschrieben oder kopiert hast (gerne; aber bitte lass die ©-Zeile drin), kannst du das .Net-Beispiel von oben für String.Format in deinem Code verwenden. Allerdings muss du Formatangaben verwenden, die Access/VBA versteht.

Die Funktion ist noch printf benannt, weil ich sie unter diesem Namen so lange in zahlreichen Projekten verwendet habe. – Am besten überlegt dir einen besseren Namen dafür.

Ich verwende diese Funktion in einer Vielzahl von Szenarien. Z.B., um Protokolldateien zu schreiben, Text in Messageboxen zu formatieren und um Beschriftungen im User Interface aufzubauen.

Da dieses Thema ursprüngliche als eine Antwort auf eine Frage in meinen YouTube-Channel gedacht war, gibt es dies auch als Video.

 

Share this article: Share on Facebook Tweet Share on LinkedIn Share on XING

Abonniere meinen Newsletter

*

Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen.
Die Emailliste wird bei Mailchimp (EU-U.S. Privacy Shield zertifiziert) in den USA gespeichert. Diese Auftragsverarbeitung ist vertraglich konform zur DSGVO geregelt. Weitere Details in der Datenschutzerklärung.



© 1999 - 2019 by Philipp Stiefel - Datenschutzerklärung