Excel VBA: Suchen und ersetzen mittels Array
#1
Hallo zusammen,

habe wieder eine für mich knifflige Aufgabe und hoffe auf Eure Hilfe.
In einer Tabelle in Spalte "C" beginnend ab Zeile 4 bis Zeile 250 stehen unterschiedliche Abkürzungen die ich gerne VBA-technisch aktualisieren/austauschen möchte.
In der Spalte sind auch mehrere Leerzellen verteilt in die natürlich nichts geschrieben werden soll.


Als Ansatz und Beispiel habe ich folgenden Code gefunden:

Code:
Sub mehrfachSuchenUndErsetzen()
 'sucht im aktiven Tabellenblatt jeweils die Eintraege aus
 'suchArray und ersetzt mit ersetzArray

 Dim suchArray()
 Dim ersetzArray()
 Dim k As Long
 suchArray = Array("az", "bu", "cf")
 ersetzArray = Array("b", "z", "r")
 For k = LBound(suchArray) To UBound(suchArray)
   Call ActiveSheet.UsedRange.Replace(suchArray(k), ersetzArray(k), , , False)
 Next k
End Sub

Wie müsste der Code angepasst werden damit nur in Spalte "C" die Werte ausgetauscht werden?

Vielen Dank für Eure Hilfe!
Top
#2
Moin Erich!
Da wärst Du doch selbst drauf gekommen?
Call ActiveSheet.UsedRange.Replace(

Grenze den benutzten Bereich mit Spalte C ein:
Call ActiveSheet.UsedRange.Columns("C").Replace(

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • sharky51
Top
#3
(14.12.2015, 15:38)RPP63 schrieb: Moin Erich!
Da wärst Du doch selbst drauf gekommen?
Call ActiveSheet.UsedRange.Replace(

Grenze den benutzten Bereich mit Spalte C ein:
Call ActiveSheet.UsedRange.Columns("C").Replace(

Gruß Ralf

Moin Ralf,

Du hast recht ...ich habe wieder zu kompliziert gedacht.

Ich danke Dir vielmals!
Top
#4
Hi,

habe das nun wie folgt angepasst.
Leider bekomme ich einen komischen Effekt.

Code:
Sub mehrfachSuchenUndErsetzen()
 'sucht im aktiven Tabellenblatt jeweils die Eintraege aus
 'suchArray und ersetzt mit ersetzArray
 '09-2006
 'E.Bimczok http://profi-excel.de
 Dim suchArray()
 Dim ersetzArray()
 Dim k As Long
 
 endRow = ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Row
 suchArray = Array("A", "AG", "B", "E", "F", "G", "HK", "HV", "K", "M", "P", "R", "Rep", "S", "SL", "SP", "SW", "Z")
 ersetzArray = Array("A", "G", "B", "E", "F", "T", "H", "V", "K", "M", "P", "D", "R", "O", "L", "S", "W", "Z")
 For k = LBound(suchArray) To UBound(suchArray)
   Call ActiveSheet.Range(Cells(4, 3), Cells(endRow, 3)).Replace(suchArray(k), ersetzArray(k), , , False)
 Next k
End Sub

Das Teil funktioniert soweit, aber leider nicht bei allen Ersetzungen.
Bei "SL" erwarte ich eigentlich "L" bekomme aber "OL"
und bei "SW" erwarte ich "W" und nicht "OW" !

Komisch, was könnte die Ursache sein?
Top
#5
Hi!
Beim Range.Replace fehlt der Parameter LookAt:=xlWhole.
Aus der VBA-Hilfe (siehe rot markiertes):

Zitat:Syntax
Ausdruck.Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte, SearchFormat, ReplaceFormat)
...
Anmerkungen
Die Angaben für LookAt, SearchOrder, MatchCase und MatchByte werden jedesmal gespeichert, wenn Sie diese Methode verwenden. Falls Sie beim nächsten Aufruf dieser Methode keine Werte für die Argumente angeben, werden die gespeicherten Werte verwendet. Die Angaben dieser Argumente ändern die Angaben im Dialogfeld Suchen, und eine Änderung der Angaben im Dialogfeld Suchen ändert die gespeicherten Werte, die verwendet werden, falls diese Argumente angegeben werden. Um Probleme zu vermeiden, sollten Sie die Argumente bei jeder Verwendung dieser Methode ausdrücklich angeben.
bedeutet als Code:
Code:
ActiveSheet.Range(Cells(4, 3), Cells(endRow, 3)).Replace(suchArray(k), ersetzArray(k), xlWhole, , False)

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • sharky51
Top
#6
(14.12.2015, 16:42)RPP63 schrieb: Beim Range.Replace fehlt der Parameter LookAt:=xlWhole.

Hi,

aber selbst dann wird bei dieser Reihenfolge aus AG T . Wink

Gruß Uwe
Top
#7
(14.12.2015, 16:42)RPP63 schrieb: Hi!
Beim Range.Replace fehlt der Parameter LookAt:=xlWhole.
Aus der VBA-Hilfe (siehe rot markiertes):

bedeutet als Code:
Code:
ActiveSheet.Range(Cells(4, 3), Cells(endRow, 3)).Replace(suchArray(k), ersetzArray(k), xlWhole, , False)

Gruß Ralf

Einfach Wahnsinn was DU / Ihr drauf habt.
Danke es funktioniert und Du hast einem alten Mann geholfen!
Top
#8
@Uwe!  :19:
Zitat:aber selbst dann wird bei dieser Reihenfolge aus AG T . Wink
wohl wahr …
AG -> G -> T

@Erich: Vielleicht solltest Du die Arrays nochmal überdenken.  Blush

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • sharky51
Top
#9
(14.12.2015, 16:57)RPP63 schrieb: @Uwe!  :19:
wohl wahr …
AG -> G -> T

@Erich: Vielleicht solltest Du die Arrays nochmal überdenken.  Blush

Gruß Ralf

Hmm,
was meinst Du mit überdenken?
Gibt es noch eine andere einfache Möglichkeit ans Ziel zu kommen?

Muss jetzt leider einige Stunden abschalten....die Familie ruft!

Hoffentlich bis bald!
Top
#10
Für später:  :21:
Zunächst mal hast Du ja Dubletten drin Z -> Z bringt nicht viel.
Die Arrays werden der Reihe nach abgearbeitet, so dass
in Schritt 2 AG zu G wird,
in Schritt 6 wird aus G T, also wird aus AG unbeabsichtigt T

Mal ohne Dubletten und in logischer Reihenfolge:
("" und Kommata musst Du ergänzen)

ABCDEFGHIJK
1SucheGAGHKHVRRepSSLSPSW
2ErsatzTGHVDROLSW

Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste