VBA ist wunderbar, um verschiedene Dinge in der Microsoft Office-Welt zu automatisieren und sich ein paar schöne Hilfsmittel zu schaffen für ein effektiveres Arbeiten.
Eine typischer Fall, der nicht nur in VBA auftritt, sondern auch in vielen anderen Programmiersprachen, ist das Ersetzen eines Textes durch einen anderen Text. Das Ersetzen kann dabei vollständig erfolgen, oder es soll im Orignal-String nur ein Substring (Teiltext) ersetzt werden. Das könnte zum Beispiel eine Dateiendung in einem Dateinamen sein, die substituiert werden soll.
Replace-Funktion Parameter erläutert
Dafür gibt es im VBA die Replace-Funktion, welche die folgenden Parameter und Rückgabewerte aufweist.
Expression
Find
Das ist der gesuchte Text oder Textfragment (Substring), welcher in dem orginalen Text gefunden werden soll.
Replace
Das ist der Text mit dem der gesuchte Text ersetzt werden soll.
Start
Das ist ein optionaler Parameter. Hier kann man bestimmen, an welcher Stelle/Position im originalen Text mit dem Suchen und Ersetzen begonnen werden soll. Es handelt sich um ein Zahlenwert. Der erste Buchstabe beginnt bei 1. Dies ist etwas ungewöhnlich, da bei anderen Programmiersprachen immer bei null begonnen wird. Der Standardwert ist 1.
Count
Auch ein optionaler Parameter. Kommt der gesuchte Substring mehrmals im originalen Text vor, so kann man hier festlegen, wie oft der Substring ersetzt werden soll. Das ist praktisch, wenn man nur das erste Vorkommen eines Strings ersetzen möchte.
Compare
Selten benötigt man diesen Zahlenparameter, der die Vergleichsmethode festlegt. Der Standardwert genügt hier. Ansonsten gibt es
[-1] vbUseCompareOption
Bei Verwendung dieses Parameters muss eine Option-Compare-Anweisung der jeweiligen Prozedur vorangestellt werden.
[0] vbBinaryCompare
Es wird die binäre Repräsentation von gesuchten und durchsuchten String miteinander verglichen.
[1] vbTextCompare
Es wird ein Textvergleich zwischen gesuchten und durchsuchten String durchgeführt.
[2] vbDatabaseCompare
Wird nur in Microsoft Access verwendet für Vergleiche innerhalb von Datenbanken
Rückgabewert/Return
Der Rückgabewert ist der neue String mit den ersetzten Parametern.
Anwendungsbeispiele Replace-Funktion im VBA
Einfaches Beispiel ohne optionale Parameter
Hier werden alle gefundenen Substrings durch den zu ersetzenden Text substituiert.
Private Sub ReplaceExample1()
Dim strOriginal As String
Dim strSearch As String
Dim strReplace As String
Dim strNew As String
strOrignal = "Meine Oma fährt im Hühnerstall Motorrad!"
strSearch = "Motorrad"
strReplace = "Dreirad"
strNew = Replace(strOrignal, strSearch, strReplace)
'Ausgabe in Direktfenster
Debug.Print strNew
End Sub
Output/Ergebnis: Meine Oma fährt im Hühnerstall Dreirad!
Nur bestimmte Anzahl im String ersetzen
Bei diesem Beispiel wird nur ein ein Vorkommen des gesuchten Text ersetzt, da der optionale Parameter Count definiert wurde.
Private Sub ReplaceExample2()
Dim strOriginal As String
Dim strSearch As String
Dim strReplace As String
Dim strNew As String
strOrignal = "Gibst Du Opi Opium, bringt Opium Opi um!"
strSearch = "Opi"
strReplace = "Omi"
strNew = Replace(strOrignal, strSearch, strReplace, Count:=1)
Debug.Print strNew
End Sub
Output/Ergebnis: Gibst Du Omi Opium, bringt Opium Opi um!
String ab bestimmter Position durchsuchen
Diese Beispiel zeigt, wie ein String ab einer bestimmten Positione (20) durchsucht wird und die Vorkommen der gesuchten Zeichenkette ersetzt werden. Es wird dann auch nur der String ab der Startposition zurückgegeben.
Private Sub ReplaceExample3()
Dim strOriginal As String
Dim strSearch As String
Dim strReplace As String
Dim strNew As String
strOrignal = "Gibst Du Opi Opium, bringt Opium Opi um!"
strSearch = "Opium"
strReplace = "Omi"
strNew = Replace(strOrignal, strSearch, strReplace, Start:=20)
Debug.Print strNew
End Sub
Output/Ergebnis: bringt Omi Opi um!
Letzte Vorkommen einer Zeichenfolge ersetzen
Die optionalen Parameter Count und Start eignen sich nicht besonders gut, um das letzte Vorkommen eines Zeichens oder Zeichenkette zu ersetzen, da man nie weiß wie lang der orignale String ist. Um das letzte Vorkommen einer Zeichenkette in einem String zu ersetzen, muss man sich der Funktion strReverse bedienen. Diese dreht die Zeichenfolge einfach um, als ob man diese rückwärts lesen würde. Aus unserem “Opi” wird dann “ipO”. So kann man eine Ersetzung von hinten vornehmen.
Private Sub ReplaceExample4()
Dim strOriginal As String
Dim strSearch As String
Dim strReplace As String
Dim strNew As String
strOrignal = "Gibst Du Opi Opium, bringt Opium Opi um!"
strSearch = "Opi"
strReplace = "Omi"
strNew = StrReverse(Replace(StrReverse(strOrignal), StrReverse(strSearch), StrReverse(strReplace), Count:=1))
Debug.Print strNew
End Sub
Output/Ergebnis: Gibst Du Opi Opium, bringt Opium Omi um!
Guten Tag,
ist es möglich mit dem replace-Befehl Leerzeilen von bpsw. 8 Punkt auf 4 Punkt Zeilenhöhe zu verringern oder die leere Zeile zu löschen? Wenn ja, wie sähe der Befehl aus? Herzlichen Dank für eine Hilfestellung!
Hallo,
hier kann ich keinen generellen fertigen Code liefern. Die erste Frage wäre in welcher Office-Anwendung du das umsetzen möchtest? Ich vermute mal Word, da du von Punkt-Größe für die Leerzeilen-Höhe sprichst.
Hier ein vager Ansatz:
In VBA werden Zeilenumbrüche CHR(10) oder CHR(10) & CHR(13) oder vbCRLF repräsentiert. Hier müsstest du mal herausfinden, wie das bei deinem Text ist.
Dann könntest du mittels der Replace-Funktion noch ein Leerzeichen einfügen, z.B.
Replace(strOrignal, CHR(10), CHR(10) & ” “)
und dann müsste man noch die Schriftgröße des eingefügten Leerzeichens ändern. Dazu muss das Leerzeichen ausgewählt werden und dann die FontSize-Eigenschaft geändert werden, z.B.
Selection.Range.Font.Size = 4
Das ganze muss man dann sicherlich noch in einer Schleife verpacken, damit man alle Zeilenumbrüche erwischt.
Wie gesagt, das sind nur vage Anhaltspunkte, da ich die genaue Problemstellung nicht kenne, aber vielleicht hilft es ja bei der weiteren Lösungsfindung.
Lieber Daniel,
herzlichen Dank für Deine ausführliche Antwort. Ich erzeuge von EXCEL 2016 aus einen Buchblock mit einigen hundert Seiten in WORD 2016.
Ich werde Deinen Ansatz ausprobieren!
Viele Grüße Joachim