Erweiterung für suchen ersetzen makro

Lieber Experte,

habe seit längerem ein Makro laufen, läuft einwandfrei und bräuchte noch eine Erweiterung dazu.
Leider ist mir der Ersteller des Makros nicht mehr bekannt.

Es handelt sich um ein Suchen Ersetzen Makro das Deutsche Wörter nach Englische übersetzt.
Die Übersetzungspaare sind im Tabellenblatt „Translation“
Spalte A Deutsch, Spalte B Englisch.
In der gleichen Arbeitsmappe befindet sich das Tabellenblatt „Gesamtstückliste“ in der die Wörter gesucht und ersetzt werden.
Das gesamte Tabellenblatt wird durchsucht und einzelne Zellen ersetzt.
Da ich oft mehr als 4000 Zeilen habe wäre es super, wenn die ersetzten Zellen farbig dargestellt würden.
Vielen Dank für die Mühe - OS2
Hier das Makro:
Sub mehrfachSuchenUndErsetzen()

'sucht im aktiven Tabellenblatt jeweils die Eintraege aus
'suchArray und ersetzt mit ersetzArray

Application.ScreenUpdating = False

Dim wksTrans As Worksheet, wksAkt As Worksheet
Dim suchArray()
Dim ersetzArray()
Dim k As Long, Zeile As Long

Set wksAkt = ActiveSheet
Set wksTrans = Worksheets(„Translation“)
Const Zeile1 = 2 'Zeile mit 1. Übersetzungsdaten im Blatt „Translation“

If wksAkt.Name = wksTrans.Name Then
MsgBox „Im Blatt „„Translation““ darf das Übersetzungsmakro nicht eingesetzt werden!“, _
vbInformation, „Übersetzen“
GoTo Beenden
End If
If MsgBox(„Daten im Tabellenblatt übersetzen“, vbQuestion + vbYesNo, _
„Übersetzen“) = vbNo Then GoTo Beenden

'Übersetzungswerte in Datenarrays einlesen
With wksTrans
'letzte Zeile mit Daten
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
'nach Spalte A aufsteigend sortieren ab Zeile 2 (Zeile1 hat Spaltentitel)
With .Range(.Rows(Zeile1), .Rows(Zeile))
.Sort key1:=.Range(„A1“), order1:=xlAscending, Header:=xlNo
End With
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
ReDim suchArray(Zeile1 To Zeile)
ReDim ersetzArray(Zeile1 To Zeile)
For Zeile = Zeile1 To Zeile
suchArray(Zeile) = .Cells(Zeile, 1)
ersetzArray(Zeile) = .Cells(Zeile, 2)
Next Zeile
End With

'Daten in absteigender Reihenfolge ersetzen.
'Ist wichtig, wenn „Lookat“ nicht xlWhole sondern xlPart ist-austauschen unten
For k = UBound(suchArray) To LBound(suchArray) Step -1
wksAkt.UsedRange.Replace what:=suchArray(k), Replacement:=ersetzArray(k), _
Lookat:=xlWhole, MatchCase:=False
Next k
Beenden:
'Variablen aufräumen
Set wksTrans = Nothing: Set wksAkt = Nothing
Erase suchArray(), ersetzArray()

Application.ScreenUpdating = True

End Sub

Das ist leider nicht ganz so einfach, wie ich dachte: Im letzten Anweisungsblock vor dem Beenden muss die For-Schleife noch einmal geschachtelt werden.

Dabei darf die Replace-Funktion nicht pauschal über das UsedRange-Objekt ausgeführt werden, sondern muss mittels Schleife jede Zelle nach dem Vorhandensein durchsucht werden (am Besten vor dem Ersetzen!"):

Dim Zelle As Range

For Each Zelle In UsedRange
If Zelle.Value Like sucharray(k) Then Zelle.Interior.ColorIndex = 5
Next Zelle

ColorIndex = 5 steht z.B. für Blau bei Standardpalette.

Den Code fügt man am besten vor wksAkt.UsedRange.Replace… ein

Hallo Surfin Willy,

erstmals vielen Dank für ihre Mühe die Sie sich gemacht haben. Ich füge diese Woche Ihre Anweisungen ein und melde mich anschließend.
Sorry für die späte Antwort, ging einfach am Wochenende nicht.

Viele Grüße

OS2

Hallo Willy,

ich komme leider allein nicht auf die richtige Lösung.
Das Makro rein kopiert, bleibt stehen am neuen Code vor der Zeile
For Each Zelle in Used Range

Vielleicht kannst Du mir bitte noch mal unter die Arme greifen.

Meldung: Objekt erforderlich

Viele Grüße

OS2

Hmmm, jetzt wird es knifflig - ich kann jetzt nur noch Vermutungen anstellen. VBA lässt normalerweise einen recht unstrukturierten Code zu, d.h. man kann die Dim Anweisungen überall in der Procedur oder der Funktion schreiben. Vielleicht wurde dies mit neueren Versionen von Excel geändert?

Probiere die >>Dim Zelle as Range

1 Like

Hallo Willy,

scheint nicht so einfach zu sein.
Ich benütze Excel 2000 und noch 2003 - auf beiden Versionen kriege ich die Meldung Objekt erforderlich.
So habe ich das Makro mit F8 Zeile für Zeile durchgetippt und bleibe stehen bei:
For Each Zelle In UsedRange
habe auch alles andere probiert doch will nicht.

Läuft das Makro bei Dir?

Vielen Dank schon mal

OS2

Hallo os2,

ja, bei mir lief das Makro. Ich kannte aber bis dato den vordefinierten Bereich UsedRange nicht. Ansonsten ersetze diesen durch in
For Each Zelle In UsedRange durch z.B.
For Each Zelle In Range(„A1:IV65536“)
ggf. kennt er auch Zelle nicht, aber die Dim-Anweisung sollte bei Dir auch stehen: Dim Zelle as Range
Sollte er damit Probleme haben, versuche es mit
Dim Zelle as Object
Das wäre zwar nicht ganz sauber, da Object natürlich sehr weitreichend ist, aber manchmal hängt sich Excel an einfachen Dingen auf :frowning:

1 Like

Hallo Willy,

Makro funktioniert - wunderbar.
Läuft eine Zeit lang, da das einfärben noch mehr Zeit braucht, doch vielen, vielen Dank.
Ich habe noch den Bereich bei For Each Zelle In Range(„A1:IV65536“) angepasst, verkleinert.

Schön, das es noch hilfbereite Leute gibt.

Viele Grüße

OS2

Super, das freut mich.

Viele Grüße
Surfin Willy