Die mehrfache Verkettung eines Strings können Sie eigentlich ganz einfach in einer Schleife erledigen:
Dim l As Long
Dim nResultat As String
For l = 1 To 10
nResultat = nResultat & "Hallo"
Next 'l
Mit zunehmender Länge des aneinander zu hängenden Strings (Füll-String) und mit zunehmender Anzahl wird die Schleife unverhältnismäßig langsamer. Denn bei jedem Anfügen wird der bereits fertig gestellte Teil einmal umkopiert. Erheblich schneller geht es, den Ergebnis-String einmal in der leicht zu errechnenden Soll-Länge mittels der String-Funktion von Visual Basic mit einem beliebigen Zeichen vorbelegt zu erstellen und anschließend nur noch mittels der Mid$-Funktion den Füll-String nacheinander darüber zu kopieren:
Dim l As Long
Dim nResultat As String
Dim nLen As Long
nLen = Len("Hallo")
nResultat = String$(10 * nLen, 0)
For l = 1 To 10
Mid$(nResultat, l * nLen - 1, nLen) = "Hallo"
Next 'l
Wenn der zu füllende String bereits gegeben ist, erübrigt sich seine Erstellung. Der weiteren Verwendbarkeit halber gleich in eine Prozedur gepackt, sähe das so aus:
Public Sub FillMultiString(Str As String, FillStr As String)
Dim l As Long
Dim nPos As Long
Dim nLen As Long
Dim nLenMax As Long
nLenMax = Len(FillStr)
nLen = Len(Str)
nPos = 1
Do While nPos <= nLenMax
Mid$(FillStr, nPos, nLen) = Str
l = l + 1
nPos = l * nLen + 1
Loop
End Sub
Hierbei machen wir uns zu Nutze, dass das Überschreiben mittels Mid$ über das Ende eines gegebenen Strings hinaus ohne Folgen bleibt, wenn die Gesamtlänge nicht genau bündig in einem Vielfachen des Teil-Strings aufgeht. Die vorhergehende Aufgabe, einen String n-mal zu verketten, erledigen Sie nun unter Verwendung dieser Prozedur wie folgt - auch hier gleich wieder in eine praktische Funktion verpackt:
Public Function MultiString(Str As String, ByVal Count As Long) _
As String
MultiString = String$(Count * Len(Str), 0)
FillMultiString Str, MultiString
End Function
Für den gewissermaßen dazwischen liegenden Spezialfall, dass der Ziel-String zwar noch nicht gegeben ist, aber eine maximale Länge vorgegeben ist, können Sie dazu den Aufruf von FullMultiString wie folgt verkürzt in eine Funktion packen:
Public Function MultiStringLength(Str As String, _
ByVal Length As Long) As String
MultiStringLength = String$(Length, 0)
FillMultiString Str, MultiStringLength
End Function
Sollen zwischen die Teil-Strings jeweils ein Trenn-String eingefügt werden, können Sie natürlich gleich den Teil-String und den Trenn-String zusammengefügt übergeben und anschließend den überzähligen Trenn-String wieder abschneiden. Doch auch hier würden Sie wieder den Geschwindigkeitsverlust hinnehmen müssen, den das dabei erforderliche zusätzliche Kopieren des Ergebnis-Strings mit sich bringen würde. Den Geschwindigkeitsverlust vermeiden Sie, wenn der Ergebnis-String gleich von vornherein entsprechend kürzer angelegt wird:
Public Function MultiStringSep(Str As String, _
ByVal Count As Long, Separator As String) As String
MultiStringSep = _
String$(Count * (Len(Str) + Len(Separator)) - 1, 0)
FillMultiString Str & Separator, MultiStringSep
End Function
|