|
|
|
|
|
Die Visual Basic-Funktionen Trim, LTrim und RTrim (bzw. deren
"pure" String-Versionen Trim$, LTrim$ und RTrim$)
können nur alle Leerzeichen vom Anfang oder vom Ende eines Strings
entfernen. Falls Sie andere Zeichen oder Zeichenketten wegtrimmen
möchten, müssen Sie zur Selbsthilfe greifen.
Die in diesem Artikel vorgestellten Funktionen ersparen Ihnen die
Arbeit, derartige Mechanismen immer wieder aufs Neue tippen oder
selbst als Funktionen austüfteln zu müssen. Ganz so trivial ist
das nämlich gar nicht, wenn der Code einigermaßen schnell sein
soll. Zudem bieten unsere Funktionen den Vorteil, dass Sie optional
angeben können, wie viele der zu entfernenden Zeichen bzw. eine
Zeichenketten am Anfang oder Ende trotzdem noch stehen bleiben
sollen. Diese Zusatzfunktionalität ist beispielsweise ganz
nützlich, wenn über eine bestimmte Anzahl hinaus (etwa mehr als
2) überflüssige Zeilenumbrüche vom Ende eines Textes
entfernt werden sollen.
Neben allgemeinen Version für beliebige Zeichen bzw.
Zeichenketten stellen wir Ihnen auch spezialisierte Funktionen zur
Verfügung, die Nullzeichen (Chr$(0)) und
Zeilenumbrüche (vbCrLf) ohne den Overhead der allgemeinen Versionen
entfernen. Zu jeder Variante gibt es eine Funktion, die wie Trim auf
beiden Seiten eines Strings trimmt, und je eine, die wie LTrim oder
RTrim nur eine Seite trimmen. Zu jeder dieser drei Trimmarten gibt
es wiederum eine, die sowohl den zu trimmenden Text als auch das zu
entfernende bzw. die zu entfernenden Zeichen als Variant-Parameter
akzeptiert, wie ebenso eine, die pure String-Parameter erwartet (und
daher etwas schneller ist). Diese Variant-Funktionen enthalten
allerdings nichts weiter, als eine Prüfung, ob einer der Parameter
ein Nullwert ist (wie er beispielsweise in uninitialisierten
Datenbankfeldern enthalten ist) und einen Aufruf der entsprechenden
Funktion mit String-Parameter.
Auf Grund der Nullprüfung verhalten sich die Variant-Funktionen
wie die VB-Originale LTrim, RTrim und Trim. Wegen der optionalen
Parameter sind sie sogar aufrufkompatibel - Sie brauchen ihren
bisherigen Code nicht zu ändern, um diese Funktionen verwenden zu
können. Verwenden Sie dagegen die VB-String-Versionen, reicht es,
in Ihrem Code jeweils das "$"-Zeichen durch
ein "S" zu ersetzen (Nehmen Sie aber das Modul mit unseren
Funktionen von diesen Ersetzungen aus, da die VB-Originale darin
benötigt werden!). Wollen Sie aus irgend einem Grund doch an einer
Stelle die VB-Originale verwenden, genügt es, diesen den
Qualifizierer "VBA." voranzustellen - zum
Beispiel: VBA.LTrim(...).
Die naheliegendste Implementierung der universellen
Trim-Funktionen wäre, mit Hilfe von Left$ und/oder
Right$ so lange die zu trimmende Zeichenfolge abzuschneiden, wie sie
noch am jeweiligen Ende auftritt. Dieses Verfahren kostet jedoch
zunehmend mehr Zeit, je mehr Zeichen bzw. Zeichenfolgen
abzuschneiden sind, da der zu bearbeitende String bei jeder
Operation immer wieder umkopiert wird. Ist der zu trimmende
Text-String selbst sehr lang, können Sie sich leicht ausmalen,
welche Datenmengen dabei im Speicher hin und her geschaufelt werden
müssen.
Das in unseren Funktionen verwendete Verfahren umgeht die
Kopiererei. Es wird statt dessen einfach gezählt, wie oft das zu
entfernende Zeichen bzw. die zu entfernende Zeichenfolge am
jeweiligen Ende auftritt. Anschließend wird der zu trimmende String
um die Länge der Anzahl der Vorkommen multipliziert mit der Länge
des zu entfernenden Strings gekürzt.
Public Function LTrimS(Strg As String, _
Optional TrimStrg As String, Optional ByVal Count As Long) _
As String
Dim nLenTrimStrg As Long
Dim nLenStrg As Long
Dim nStrg As String
Dim nFound As Long
Dim nCount As Long
Dim l As Long
If Count > 0 Then
nCount = Count
End If
If Len(TrimStrg) = 0 Then
If nCount Then
nStrg = Strg
nLenStrg = Len(nStrg)
For l = 1 To nLenStrg
If Mid$(nStrg, l, 1) = " " Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
nFound = nFound - nCount
If nFound > 0 Then
nStrg = Right$(nStrg, nLenStrg - nFound)
End If
LTrimS = nStrg
Else
LTrimS = VBA.LTrim$(Strg)
End If
Else
nStrg = Strg
nLenStrg = Len(nStrg)
nLenTrimStrg = Len(TrimStrg)
For l = 0 To nLenStrg - 1 Step nLenTrimStrg
If Mid$(nStrg, 1 + l, nLenTrimStrg) = TrimStrg Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
nFound = nFound - nCount
If nFound > 0 Then
nStrg = Right$(nStrg, nLenStrg - nFound * nLenTrimStrg)
End If
LTrimS = nStrg
End If
End Function
Public Function LTrim0S(Strg As String, _
Optional ByVal Count As Long) As String
Dim nLenStrg As Long
Dim nStrg As String
Dim nFound As Long
Dim l As Long
nStrg = Strg
nLenStrg = Len(nStrg)
For l = 1 To nLenStrg
If Mid$(nStrg, l, 1) = vbNullChar Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
If Count > 0 Then
nFound = nFound - Count
End If
If nFound > 0 Then
nStrg = Right$(nStrg, nLenStrg - nFound)
End If
LTrim0S = nStrg
End Function
Public Function LTrimCrLfS(Strg As String, _
Optional ByVal Count As Long) As String
Dim nLenStrg As Long
Dim nStrg As String
Dim nFound As Long
Dim l As Long
nStrg = Strg
nLenStrg = Len(nStrg)
For l = 1 To nLenStrg Step 2
If Mid$(nStrg, l, 2) = vbCrLf Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
If Count > 0 Then
nFound = nFound - Count
End If
If nFound Then
nStrg = Right$(nStrg, nLenStrg - nFound * 2)
End If
LTrimCrLfS = nStrg
End Function
Public Function RTrimS(Strg As String, _
Optional TrimStrg As String, Optional ByVal Count As Long) _
As String
Dim nLenTrimStrg As Long
Dim nLenStrg As Long
Dim nStrg As String
Dim nFound As Long
Dim nCount As Long
Dim l As Long
If Count > 0 Then
nCount = Count
End If
If Len(TrimStrg) = 0 Then
If nCount Then
nLenStrg = Len(nStrg)
For l = nLenStrg To 1 Step -1
If Mid$(nStrg, l, 1) = " " Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
nFound = nFound - nCount
If nFound > 0 Then
nStrg = Left$(nStrg, nLenStrg - nFound)
End If
RTrimS = nStrg
Else
RTrimS = VBA.RTrim$(nStrg)
End If
Else
nStrg = Strg
nLenStrg = Len(nStrg)
nLenTrimStrg = Len(TrimStrg)
For l = nLenStrg - nLenTrimStrg + 1 To 1 Step -nLenTrimStrg
If Mid$(nStrg, l, nLenTrimStrg) = TrimStrg Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
nFound = nFound - nCount
If nFound > 0 Then
nStrg = Left$(nStrg, nLenStrg - nFound * nLenTrimStrg)
End If
RTrimS = nStrg
End If
End Function
Public Function RTrim0S(Strg As String, _
Optional ByVal Count As Long) As String
Dim nLenStrg As Long
Dim nStrg As String
Dim nFound As Long
Dim l As Long
nStrg = Strg
nLenStrg = Len(nStrg)
For l = nLenStrg To 1 Step -1
If Mid$(nStrg, l, 1) = vbNullChar Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
If Count > 0 Then
nFound = nFound - Count
End If
If nFound > 0 Then
nStrg = Left$(nStrg, nLenStrg - nFound)
End If
RTrim0S = nStrg
End Function
Public Function RTrimCrLfS(Strg As String, _
Optional ByVal Count As Long) As String
Dim nLenStrg As Long
Dim nStrg As String
Dim nFound As Long
Dim l As Long
nStrg = Strg
nLenStrg = Len(nStrg)
For l = nLenStrg - 1 To 1 Step -2
If Mid$(nStrg, l, 2) = vbCrLf Then
nFound = nFound + 1
Else
Exit For
End If
Next 'l
If Count > 0 Then
nFound = nFound - Count
End If
If nFound Then
nStrg = Left$(nStrg, nLenStrg - nFound * 2)
End If
RTrimCrLfS = nStrg
End Function
Public Function TrimS(Strg As String, _
Optional TrimStrg As String, Optional ByVal LCount As Long, _
Optional ByVal RCount As Long) As String
Dim nStrg As String
nStrg = LTrimS(Strg, TrimStrg, LCount)
TrimS = RTrimS(nStrg, TrimStrg, RCount)
End Function
Public Function Trim0S(Strg As String, _
Optional ByVal LCount As Long, Optional ByVal RCount As Long) _
As String
Dim nStrg As String
nStrg = LTrim0S(Strg, LCount)
Trim0S = RTrim0S(nStrg, RCount)
End Function
Public Function TrimCrLfS(Strg As String, _
Optional ByVal LCount As Long, Optional ByVal RCount As Long) _
As String
Dim nStrg As String
nStrg = LTrimCrLfS(Strg, LCount)
TrimCrLfS = RTrimCrLfS(nStrg, RCount)
End Function
Public Function LTrim(Strg As Variant, _
Optional TrimStrg As Variant, Optional ByVal Count As Long) _
As String
If IsNull(Strg) Then
LTrim = Strg
Else
LTrim = LTrimS(CStr(Strg), CStr(TrimStrg), Count)
End If
End Function
Public Function LTrim0(Strg As Variant, _
Optional ByVal Count As Long) As String
If IsNull(Strg) Then
LTrim0 = Strg
Else
LTrim0 = LTrim0S(CStr(Strg), Count)
End If
End Function
Public Function LTrimCrLf(Strg As Variant, _
Optional ByVal Count As Long) As String
If IsNull(Strg) Then
LTrimCrLf = Strg
Else
LTrimCrLf = LTrimCrLfS(CStr(Strg), Count)
End If
End Function
Public Function RTrim(Strg As Variant, _
Optional TrimStrg As Variant, Optional ByVal Count As Long) _
As String
If IsNull(Strg) Or IsNull(TrimStrg) Then
RTrim = Strg
Else
RTrim = RTrimS(CStr(Strg), CStr(TrimStrg), Count)
End If
End Function
Public Function RTrim0(Strg As Variant, _
Optional ByVal Count As Long) As String
If IsNull(Strg) Then
RTrim0 = Strg
Else
RTrim0 = RTrim0S(CStr(Strg), Count)
End If
End Function
Public Function RTrimCrLf(Strg As Variant, _
Optional ByVal Count As Long) As String
If IsNull(Strg) Then
RTrimCrLf = Strg
Else
RTrimCrLf = RTrimCrLfS(CStr(Strg), Count)
End If
End Function
Public Function Trim(Strg As Variant, _
Optional TrimStrg As Variant, Optional ByVal LCount As Long, _
Optional ByVal RCount As Long) As String
If IsNull(Strg) Or IsNull(TrimStrg) Then
Trim = Strg
Else
Trim = TrimS(CStr(Strg), CStr(TrimStrg), LCount, RCount)
End If
End Function
Public Function Trim0(Strg As String, _
Optional ByVal LCount As Long, Optional ByVal RCount As Long) _
As String
If IsNull(Strg) Then
Trim0 = Strg
Else
Trim0 = Trim0S(CStr(Strg), LCount, RCount)
End If
End Function
Public Function TrimCrLf(Strg As String, _
Optional ByVal LCount As Long, Optional ByVal RCount As Long) _
As String
If IsNull(Strg) Then
TrimCrLf = Strg
Else
TrimCrLf = TrimCrLfS(CStr(Strg), LCount, RCount)
End If
End Function

|
|
|