Last Update: 2024 - 05 - 21 |
Eine printf oder String.Format Funktion für VBAby Philipp Stiefel, veröffentlicht: 16. März; 2019, zuletzt aktualisiert: 16. März; 2019 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. 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))
Diese Funktion bzw. Methode ist sehr nützlich, weil:
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.
Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen. © 1999 - 2024 by Philipp Stiefel - Datenschutzerklärung |