Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1768to1772
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Suchen und Ersetzen mit VBA
09.07.2020 11:48:42
Marc
Hallo liebe Excel und VBA-Freunde,
ich bin ein DAU in VBA, aber da ich nach einer besseren Funktion als die "suchen und ersetzen" Funktion von Excel gesucht habe.
Denn dann wird die Formatierung einzelner Wörter nicht übernommen und anstelle, dass ich nur 1 Wort ändern muss, müsste ich dann 4.
Ich habe nämliche ca. 200 Zellen in den ich mehr als 255 Zeichen habe und viele Wörter innerhalb der Zellen sind redundant.
Nun habe ich dieses Script gefunden:
Sub CharactersReplace(Rng As Range, FindText As String, ReplaceText As String, Optional  _
MatchCase As Boolean = False)
'UpdatebyExtendoffice20160711
Dim I As Long
Dim xLenFind As Long
Dim xLenRep As Long
Dim K As Long
Dim xValue As String
Dim M As Long
Dim xCell As Range
xLenFind = Len(FindText)
xLenRep = Len(ReplaceText)
If Not MatchCase Then M = 1
For Each xCell In Rng
If VarType(xCell) = vbString Then
xValue = xCell.Value
K = 0
For I = 1 To Len(xValue)
If StrComp(Mid$(xValue, I, xLenFind), FindText, M) = 0 Then
xCell.Characters(I + K, xLenFind).Insert ReplaceText
K = K + xLenRep - xLenFind
End If
Next
End If
Next
End Sub

Sub Test_CharactersReplace()
Dim xRg As Range
Dim xTxt As String
Dim xCell As Range
On Error Resume Next
If ActiveWindow.RangeSelection.Count > 1 Then
xTxt = ActiveWindow.RangeSelection.AddressLocal
Else
xTxt = ActiveSheet.UsedRange.AddressLocal
End If
Set xRg = Application.InputBox("Select a range:", "Kutools for Excel", xTxt, , , , , 8)
If xRg Is Nothing Then Exit Sub
Call CharactersReplace(xRg, "Ersetze das Wort", "Gegen das Wort", True)
End Sub

Das Skript funktioniert...… aber leider nur mit Zellen weniger als 255 Zeichen...… Jetzt habe ich allerhand gelesen wegen eines Umweges mit Arrys und so weiter.
Aber als DAU kann ich leider das nicht integrieren, geschweige, dass ich coden könnte.
Könnt ihr mich dahingehend unterstützen?
Vielen Dank und Beste Grüße
Marc St.

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suchen und Ersetzen mit VBA
10.07.2020 12:35:43
Matthias
Moin!
Wenn du dir Funktion hier so austauschst, sollte es klappen. Dein Matchcase habeich da nicht integriert. Ich lasse nur einen Textvergleich durchführen.
Sub CharactersReplace(Rng As Range, FindText As String, ReplaceText As String, Optional _
MatchCase As Boolean = False)
'UpdatebyExtendoffice20160711
Dim I As Long
Dim xLenFind As Long
Dim xLenRep As Long
Dim K As Long
Dim xValue As String
Dim M As Long
Dim xCell As Range
xLenFind = Len(FindText)
xLenRep = Len(ReplaceText)
If Not MatchCase Then M = 1
For Each xCell In Rng
If VarType(xCell) = vbString Then
xValue = xCell.Value
xCell = Replace(xValue, FindText, ReplaceText, , , vbTextCompare)
End If
Next
End Sub

Einfach mal an einer Beispielmappe testen.,
VG
Anzeige
AW: Suchen und Ersetzen mit VBA
10.07.2020 17:00:10
Marc
Moin Matthias,
danke für deine Hilfe, es ist jedoch so, dass durch die Replacefunktion die Formatierung gelöscht wird.
Ich habe in den Zellen mehrere Wörter, wobei manche Fett und andere kursive sind und das soll natürlich erhalten bleiben sonst ändere ich statt 1 Wort immer 5. :(
Beste Grüße
AW: Suchen und Ersetzen mit VBA
10.07.2020 22:49:14
Matthias
Moin!
Kannst du ggf. mal den Link bzw. die Seite zu dem Hinweis mit dem Array schicken!?
Wenn das geht, das ein einzubauen wäre wohl möglich. Mir fehlt aber grad die Idee dazu. Also mit einem Array den Text aufsplitten und dann ersetzen wäre nicht das Problem. Du brauchst ja aber das Format. Dann müsste man das Array wieder an die Character Funktion übergeben. Die nimmt aber nur 255 Zeichen. Was man jetzt machen könnte: Die String aufsplitten und dabei auch die Formate mit auslesen. Dann ersetzen und die Formate wieder eintragen. Das geht auch bei mehr als 250 Zeichen. Jetzt wäre noch die Fragen, was du da für Formate hast (Fett, kursiv, andere Schriftgröße usw.).
VG
Anzeige
AW: Suchen und Ersetzen mit VBA
11.07.2020 00:45:24
Marc
Also...
wie gesagt ich bin ein DAU und verstehe leider die Codes nicht, aber bspw. hier:
https://stackoverflow.com/questions/51997789/how-to-bypass-255-character-limit-of-vba-mass-replace-function.
Aber interessant fand ich den Ansatz hier:
https://stackoverflow.com/questions/40419678/find-and-replace-in-excel-2010-without-losing-cell-formatting-unable-to-run-on
Keine Ahnung was der untere User gemacht hat, aber der obere hat fast den gleichen code wie ich.
Also ich habe Fett und Kursive und Standard... Die Schriftart und Größe bleibt gleich.
Ich hoffe, ich konnte dich unterstützen :)?!
Viele Grüße
Anzeige
AW: Suchen und Ersetzen mit VBA
11.07.2020 12:13:01
Matthias
Moin!
Ja, das hilft (glaube ich :-) ). Die Idee ist so wie gestern zum Ende beschrieben.
Beim 1. Link wird aber das Format verloren gehen (so meine Einschätzung). Der zweite ist hilfreicher. Der obere hat da zwar ähnlichen Code wie du, er funktioniert aber auch nicht. :-)
Werde morgen mal was dazu basteln.
Noch als Frage: Es kommen in der Zelle nur die Formatierungen vor: Standard oder Fett oder Kursiv oder Kursiv mit Fett. Würde jetzt nur nach den 4 Sachen prüfen.
Ergebnis dann morgen.
VG
AW: Suchen und Ersetzen mit VBA
11.07.2020 12:22:10
Marc
Guten Morgen,
Alle 3 zusammen:
In EINER Zelle gibt es ein Text mit über 255 Zeichen mit den Formaten: Normal, Fett UND Kursiv!
So jetzt sollten wir es haben.
Sauber, danke dass du dich damit beschäftigst ein vllt. einen Mehrwert für unser ganzes Projekt schaffst :)!!
Aber kein Druck und wenn es nicht klappt, ist es auch okay.
Grüße!
Anzeige
AW: Suchen und Ersetzen mit VBA
12.07.2020 18:11:30
Matthias
Moin!
Hier mal mein Ergebnis. Habe aus beiden Code was genommen und den Code noch ein wenig nach meinen Vorstellungen abgeändert. Habe ihn auch mal an meinen Daten getestet. Kannst es aber mal an Testdaten bei dir probieren. Der Funktionsname ist gleich geblieben, so dass man nur die Funktion tauschen muss. Das mit der Match Option habe ich nicht mit drin - wußte nicht was ihr da dann wie haben wollt. Kann man aber noch einbauen. Wenn du Erklärungen zum Code brauchst, einfache melden.
Sub CharactersReplace(Rng As Range, FindText As String, ReplaceText As String, Optional _
MatchCase As Boolean = False)
'UpdatebyExtendoffice20160711
Dim daten As Variant, neutext As Variant
Dim xLenFind As Long, xLenRep As Long, xLenText As Long
Dim i As Long, j As Long, k As Long, stellen As Long, position As Long
Dim xCell As Range
Dim austext As String
Dim altzustand
altzustand = Application.ScreenUpdating
Application.ScreenUpdating = False
xLenFind = Len(FindText)
xLenRep = Len(ReplaceText)
For Each xCell In Rng
If VarType(xCell) = vbString Then
austext = xCell
xLenText = Len(austext)
'Daten auslesen
ReDim daten(1 To xLenText + 1, 1 To 2)   'Zeichenanzahl, Format
ReDim neutext(1 To xLenText)
For i = 1 To xLenText
neutext(i) = Mid(austext, i, 1)
daten(i, 1) = 1
j = 0
If xCell.Characters(Start:=i, Length:=1).Font.FontStyle = "Kursiv" Or xCell. _
Characters(Start:=i, Length:=1).Font.FontStyle = "Fett Kursiv" Then j = j + 1        'Kursiv
If xCell.Characters(Start:=i, Length:=1).Font.Bold = True Then j = j + 2             _
'Fett
daten(i, 2) = j
Next
'Daten ersetzen
position = InStr(1, austext, FindText, vbTextCompare)
If position = 0 Then GoTo weiter
While position > 0
neutext(position) = ReplaceText
daten(position, 1) = xLenRep
For j = position + 1 To position + xLenFind - 1
daten(j, 1) = ""
neutext(j) = ""
Next
position = InStr(position + xLenFind, austext, FindText, vbTextCompare)
Wend
'Daten zurückschreiben
xCell = Join(neutext, "")
k = daten(1, 2)
position = 1
For i = 1 To xLenText + 1
If k = daten(i, 2) Then
If daten(i, 1)  "" Then
stellen = stellen + daten(i, 1)
End If
Else
'formatieren
If k = 1 Or k = 3 Then
'kursiv machen
xCell.Characters(Start:=position, Length:=stellen).Font.FontStyle = "Kursiv" _
End If
If k = 2 Or k = 3 Then
'fett machen
xCell.Characters(Start:=position, Length:=stellen).Font.Bold = True
End If
k = daten(i, 2)
position = position + stellen
stellen = 1
End If
Next
End If
weiter:
Next
Application.ScreenUpdating = altzustand
End Sub

VG
Anzeige
AW: Suchen und Ersetzen mit VBA
13.07.2020 09:13:02
Marc
Moin Matthias,
erstmal super, dass du das machst!!
Ich habe den Code kopiert und eingesetzt und die Call Funktion dazugesetzt (Also bloß die obere Funktion ausgetauscht)?
Leider funktioniert der Code nicht so wie gewünscht oder ich mache etwas falsch.
Wenn ich etwas ein Wort ersetze wie z.B. "Auto" mit "Bushaltestelle", dann verschiebt der Code die "Fett-Markierung" um die zusätzliche Anzahl an Buchstaben Auto = 4, Bushaltestelle = 14 (also so um 10 Stellen). Der Code merkt sich also eher die Position als das Wort...
Beste Grüße
AW: Suchen und Ersetzen mit VBA
13.07.2020 20:57:32
Matthias
Moin!
Genau du musst nur die obere Funktion austauschen. Habe am Code noch ein paar Sachen geändert. Jetzt sollte er eigentlich laufen. Bitte nochmal testen.
Sub CharactersReplace(Rng As Range, FindText As String, ReplaceText As String, Optional _
MatchCase As Boolean = False)
'UpdatebyExtendoffice20160711
Dim daten As Variant, neutext As Variant
Dim xLenFind As Long, xLenRep As Long, xLenText As Long
Dim i As Long, j As Long, k As Long, stellen As Long, position As Long
Dim xCell As Range
Dim austext As String
Dim altzustand
altzustand = Application.ScreenUpdating
Application.ScreenUpdating = False
xLenFind = Len(FindText)
xLenRep = Len(ReplaceText)
For Each xCell In Rng
If VarType(xCell) = vbString Then
austext = xCell
xLenText = Len(austext)
'Daten auslesen
ReDim daten(1 To xLenText + 1, 1 To 2)   'Zeichenanzahl, Format
ReDim neutext(1 To xLenText)
For i = 1 To xLenText
neutext(i) = Mid(austext, i, 1)
daten(i, 1) = 1
j = 0
If xCell.Characters(Start:=i, Length:=1).Font.Italic = True Then j = j + 1        ' _
Kursiv
If xCell.Characters(Start:=i, Length:=1).Font.Bold = True Then j = j + 2             _
'Fett
daten(i, 2) = j
Next
'Daten ersetzen
position = InStr(1, austext, FindText, vbTextCompare)
If position = 0 Then GoTo weiter
While position > 0
neutext(position) = ReplaceText
daten(position, 1) = xLenRep
For j = position + 1 To position + xLenFind - 1
daten(j, 1) = ""
neutext(j) = ""
Next
position = InStr(position + xLenFind, austext, FindText, vbTextCompare)
Wend
'Daten zurückschreiben
xCell = Join(neutext, "")
xCell.Characters.Font.Bold = False
xCell.Characters.Font.Italic = False
k = daten(1, 2)
position = 1
For i = 1 To xLenText + 1
If k = daten(i, 2) Then
If daten(i, 1)  "" Then
stellen = stellen + daten(i, 1)
End If
Else
'formatieren
If k = 1 Or k = 3 Then
'kursiv machen
xCell.Characters(Start:=position, Length:=stellen).Font.Italic = True
End If
If k = 2 Or k = 3 Then
'fett machen
xCell.Characters(Start:=position, Length:=stellen).Font.Bold = True
End If
k = daten(i, 2)
position = position + stellen
stellen = daten(i, 1)
End If
Next
End If
weiter:
Next
Application.ScreenUpdating = altzustand
End Sub
VG
Anzeige
AW: Suchen und Ersetzen mit VBA
14.07.2020 09:06:48
Marc
Guten Morgen,
wir haben es fast!!
Also bei der Textersetzung in der ersten ZELLE passt es! :)
Jedoch; bei jeder weiteren Zelle ist die Formatierung, wieder um einige Zeichen weiter verschoben.... Die Verschiebung geschieht aber nur 1x nach dem Wechsel von der 1. zur 2. Zelle, sodass bspw. die "Fett-Formatierung" konstant bei Zelle 2-40 verschoben verbleibt.
Hat das etwas mit der Speicherbelegung zu tun? Müsste da etwas "resettet" werden? (Ich versuche ein wenig mit zu Brainstormen).
Darüber hinaus ist die Performance bei ca 40 Zellen á 400 Zeichen nahe des Absturzes... Aber wo gehobelt wird, da fallen auch Späne.
Vielen Dank und Beste Grüße
Anzeige
AW: Suchen und Ersetzen mit VBA
14.07.2020 12:17:56
peterk
Hallo
Bitte markierte Zeile einfügen:

k = daten(1, 2)
position = 1
stellen = 0    ' Bitte einfügen !!!
For i = 1 To xLenText + 1

AW: Suchen und Ersetzen mit VBA
14.07.2020 12:50:58
Marc
Super!
Ich glaube wir haben es geschafft!!
Ich habe es ein paar Beispiele ausprobiert und der Code funktioniert.
Performance ist so ein Thema, aber egal er schafft 40 Zeilen in knapp 40 Sekunden :D.
Danke an Matthias für die ganzen Mühen und danke an peterk für sein hilfreichen Input zu guter Letzt.
Wenn mir noch etwas auffällt melde ich mich zurück :)!
Bis dahin und eine schöne Woche!
Anzeige
AW: Suchen und Ersetzen mit VBA
14.07.2020 14:37:26
peterk
Hallo Marc
Anbei noch eine kleine Verbesserung bzgl. Performance (wenn nur wenige Formatierungen im Text dann cCharRange höher setzen)

Sub CharactersReplace(Rng As Range, FindText As String, ReplaceText As String, _
Optional MatchCase As Boolean = False)
'UpdatebyExtendoffice20160711
Const cCharRange = 10
Dim daten As Variant, neutext As Variant
Dim xLenFind As Long, xLenRep As Long, xLenText As Long
Dim i As Long, j As Long, k As Long, stellen As Long, position As Long
Dim xCell As Range
Dim austext As String
Dim altzustand
Dim foundItalic As Boolean
Dim foundBold As Boolean
altzustand = Application.ScreenUpdating
Application.ScreenUpdating = False
xLenFind = Len(FindText)
xLenRep = Len(ReplaceText)
Debug.Print Time, "Start"
For Each xCell In Rng
If VarType(xCell) = vbString Then
austext = xCell
xLenText = Len(austext)
'Daten auslesen
ReDim daten(1 To xLenText + 1, 1 To 2)   'Zeichenanzahl, Format
ReDim neutext(1 To xLenText)
For i = 1 To xLenText
neutext(i) = Mid(austext, i, 1)
daten(i, 1) = 1
j = 0
If (i Mod cCharRange = 1) Then
' liefert
' False (keine Formatierung)
' True(alles formatiert),
' Null (teilweise formatiert)
foundItalic = IsNull(xCell.Characters(Start:=i, Length:=cCharRange).Font. _
Italic)
If Not foundItalic Then
foundItalic = xCell.Characters(Start:=i, Length:=10).Font.Italic
End If
foundBold = IsNull(xCell.Characters(Start:=i, Length:=cCharRange).Font.Bold) _
If Not foundBold Then
foundBold = xCell.Characters(Start:=i, Length:=10).Font.Bold
End If
End If
If foundItalic Then
If xCell.Characters(Start:=i, Length:=1).Font.Italic = True Then j = j + 1 ' _
Kursiv
End If
If foundBold Then
If xCell.Characters(Start:=i, Length:=1).Font.Bold = True Then j = j + 2   ' _
Fett
End If
daten(i, 2) = j
Next
'Daten ersetzen
position = InStr(1, austext, FindText, vbTextCompare)
If position = 0 Then GoTo weiter
While position > 0
neutext(position) = ReplaceText
daten(position, 1) = xLenRep
For j = position + 1 To position + xLenFind - 1
daten(j, 1) = ""
neutext(j) = ""
Next
position = InStr(position + xLenFind, austext, FindText, vbTextCompare)
Wend
'Daten zurückschreiben
xCell = Join(neutext, "")
xCell.Characters.Font.Bold = False
xCell.Characters.Font.Italic = False
k = daten(1, 2)
position = 1
stellen = 0
For i = 1 To xLenText + 1
If k = daten(i, 2) Then
If daten(i, 1)  "" Then
stellen = stellen + daten(i, 1)
End If
Else
'formatieren
If k = 1 Or k = 3 Then
'kursiv machen
xCell.Characters(Start:=position, Length:=stellen).Font.Italic = True
End If
If k = 2 Or k = 3 Then
'fett machen
xCell.Characters(Start:=position, Length:=stellen).Font.Bold = True
End If
k = daten(i, 2)
position = position + stellen
stellen = daten(i, 1)
End If
Next
End If
weiter:
Next
Application.ScreenUpdating = altzustand
Debug.Print Time, "Ende"
End Sub

Anzeige
AW: Suchen und Ersetzen mit VBA
14.07.2020 15:30:58
Matthias
Moin!
Hier nochmal geändert. Wobei ich das bei meinen Testläufen nicht reproduzieren kann. Falls der Fehler noch da ist, wenn möglich mal eine Datei oder so ein paar Teststrings hochladen.
Bei der Performance habe ich schon versucht so viel wie möglich auf Zugriffe auf die Zellen zu vermeiden. Ist beim Auslesen / Setzen der Formatierung aber notwendig (wobei ich das da auch schon beim Neuformatieren gerafft habt). Auf Grund dessen dauert es da ein wenig. Wenn der Suchstring nicht vorkommt, überpsringe ich jetzt sämtlichen Code. Mehr lässt sich jetzt auf die schnelle wohl nicht verbessern. Bitte mal testen.
Sub CharactersReplace(Rng As Range, FindText As String, ReplaceText As String, Optional _
MatchCase As Boolean = False)
'UpdatebyExtendoffice20160711
Dim daten As Variant, neutext As Variant
Dim xLenFind As Long, xLenRep As Long, xLenText As Long
Dim i As Long, j As Long, k As Long, stellen As Long, position As Long
Dim xCell As Range
Dim austext As String
Dim altzustand
altzustand = Application.ScreenUpdating
Application.ScreenUpdating = False
xLenFind = Len(FindText)
xLenRep = Len(ReplaceText)
For Each xCell In Rng
If VarType(xCell) = vbString Then
austext = xCell.Value
position = InStr(1, austext, FindText, vbTextCompare)
If position = 0 Then GoTo weiter
xLenText = Len(austext)
'Daten auslesen
ReDim daten(1 To xLenText + 1, 1 To 2)   'Zeichenanzahl, Format
ReDim neutext(1 To xLenText)
For i = 1 To xLenText
neutext(i) = Mid(austext, i, 1)
daten(i, 1) = 1
j = 0
If xCell.Characters(Start:=i, Length:=1).Font.Italic = True Then j = j + 1        ' _
Kursiv
If xCell.Characters(Start:=i, Length:=1).Font.Bold = True Then j = j + 2             _
'Fett
daten(i, 2) = j
Next
'Daten ersetzen
While position > 0
neutext(position) = ReplaceText
daten(position, 1) = xLenRep
For j = position + 1 To position + xLenFind - 1
daten(j, 1) = ""
neutext(j) = ""
Next
position = InStr(position + xLenFind, austext, FindText, vbTextCompare)
Wend
'Daten zurückschreiben
xCell = Join(neutext, "")
xCell.Characters.Font.Bold = False
xCell.Characters.Font.Italic = False
k = daten(1, 2)
position = 1
For i = 1 To xLenText + 1
If k = daten(i, 2) Then
If daten(i, 1)  "" Then
stellen = stellen + daten(i, 1)
End If
Else
'formatieren
If k = 1 Or k = 3 Then
'kursiv machen
xCell.Characters(Start:=position, Length:=stellen).Font.Italic = True
End If
If k = 2 Or k = 3 Then
'fett machen
xCell.Characters(Start:=position, Length:=stellen).Font.Bold = True
End If
k = daten(i, 2)
position = position + stellen
stellen = daten(i, 1)
End If
Next
End If
weiter:
Erase daten
Erase neutext
Next
Application.ScreenUpdating = altzustand
End Sub

VG
AW: Suchen und Ersetzen mit VBA
15.07.2020 09:59:35
Marc
Guten Morgen,
super danke euch beiden!!
Die Performance hat noch mal ein guten Schritt nach vorne geschafft.
Ich habe eure beiden Codes ausprobiert... ich sehe Abweichungen in den Zeilen... ,aber verstehe sie nicht.
Jedoch, funktionieren beide Codes gleich schnell, das habe es mir der Stoppuhr validiert.
Excel schafft nun 167 Zellen mit knapp 400 Zeichen in 48 Sekunden.
Ich bin damit sehr zu frieden und muss endlich nicht immer jedes einzelne Wort 3-fach anklicken, um anschließend str+v zu drücken :D

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige