Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1440to1444
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
VBA - Suchen und ersetzen
20.08.2015 12:59:57
Jan
Hallo zusammen!
Wieder einmal habe ich ein Problem und würde mich über jegliche Tipps oder Hilfen sehr freuen. Es reicht mir, wenn ihr mir im Zweifelsfall einen Wink in die richtige Richtung gebt. Es geht um folgendes Makro:
Sub SuchenUndErsetzen()
' SuchenUndErsetzen Makro
Dim vWhat 'Array der zu suchenden Zeichenfolgen im Stil "*AMI *
Dim vRep  'Array der Ersatzzeichenfolge als Wort. Hier: "Auftragsminuten"
Dim iSuch As Long 'Laufvariable
vWhat = Worksheets("Tabelle1").Range("D8:D41").Value 'Hier stehen die Suchtexte
vRep = Worksheets("Tabelle1").Range("B8:B41").Value 'Hier stehen die Ersatztexte
For iSuch = LBound(vWhat) To UBound(vWhat)
Cells.Replace What:=CStr(vWhat(iSuch, 1)), Replacement:=CStr(vRep(iSuch, 1)), LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Next
Worksheets("Tabelle1").Range("D8:D41").Value = vWhat 'Die Arrays werden wieder an
Worksheets("Tabelle1").Range("B8:B41").Value = vRep  'ihren Ursprungsort gesschrieben
End Sub

Die Array werden am Ende zurückgeschrieben, da die eine Range ja auch ersetzt wurde, da im gesamten Workbook gesucht wurde.
Problem ist simpel: Er sucht nix. Es hat schon einmal funktioniert, seitdem nicht mehr. Es flackert einmal kurz und das wars. Es wurde nichts ersetzt. Ich habe auch durch das flackern das Gefühl, dass der nur im aktuellen Sheet gesucht hat, kann das sein?
Schonmal danke fürs anschauen und den Input.
Gruß, Jan

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Suchen und ersetzen
20.08.2015 13:10:31
Jack_d
Hallo Jan,
nur ne Idee,
du arbeitest ja mit einem Eindimensionalen Array, warum sprichst du also die Arrays auf 2 _ Dimensionen an?

vWhat(iSuch, 1)
&

vRep(iSuch, 1)
Wenn ich grad nicht falsch liege müsste der Such & und Ersetzwert eigentlich immer der Gleiche sein. Bzw.
Probier es doch mal ohne die 2. Dimension also
vWhat(iSuch)
Grüße

AW: VBA - Suchen und ersetzen
20.08.2015 13:23:57
Jan
Hallo Jack_d
Danke für deine Hilfe! Ich habe das Array 2-dimensional angesprochen, weil ich mal aufgeschnappt habe, dass Arrays, die per Range befüllt werden, immer (mindestens) 2dimensional seien. Habe das so analog auch in einem anderen Makro, da funktioniert es. Hinzu kommt, dass es ja auch einmal funktioniert hat. Habe das Makro jetzt mal auf einem anderen Tabellenblatt ausgeführt und siehe da: Das Makro sucht nur im aktuellen Blatt. Habe aus dem Referenzmakro aus dem Internet aber eigtl entnommen, dass Cells sich hier auf das ganze Workbook beziehen müsste.
Ich werde das mit dem eindimensionalen Ansprechen der Arrays sobald ich wieder am Platz bin mal testen.
Gruß, Jan

Anzeige
AW: VBA - Suchen und ersetzen
20.08.2015 13:30:01
Jack_d
Hallo Jan,
Habe aus dem Referenzmakro aus dem Internet aber eigtl entnommen, dass Cells sich hier auf das ganze Workbook beziehen müsste.
naja cells ist insoweit "global" dass es unspezifisch ist.
Wenn du den Code in das jeweilige Blatt kopierst dann funktioniert es eben auch nur in diesem Blatt.
Um das zu umgehen, hab ich bspw. den Großteil meiner Codes in einem Modul und referiere dann über Parent auf das jeweilige Blatt Dann kann man sicher sein das man auch an der richtigen Stelle raus kommt =)

With worksheets("Tabelle1")
.cells(x,y)
end with
Grüße

Anzeige
AW: VBA - Suchen und ersetzen
20.08.2015 13:38:05
Jan
Okay, sorry.
Normalerweise versuche ich immer alle Informationen zu liefern, war jetzt aber was im Stress. Hier die zusätzlich relevante Info:
Das Makro liegt in einem Modul (Modul5) und funktioniert immer nur auf dem aktuellen Sheet. Später möchte ich das Makro auf einen CommandButton legen, sodass es ausgeführt wird, wenn ich diesen drücke (zusammen mit anderen Befehlen, die hier aber nicht relevant sind). Das Makro soll dennoch das gesamte Workbook durchsuchen und die im Array vWhat hinterlegten Zeichenketten durch die in vRep hinterlegten Zeichenketten ersetzen. Da die Arrays am Anfang von einem Tabellenblatt des selben Workbooks eingelesen werden, soll am Ende der Inhalt der Arrays dort wieder hingeschrieben werden, da diese ja auch ersetzt wurden (Zumindest die Range, von der vWhat eingelesen wird).
Entschuldige die Umstände, heute ist was chaotisch bei mir. Und natürlich trotzdem vielen Dank für deine Hilfe!
Gruß, Jan

Anzeige
Häkchen vergessen
20.08.2015 13:40:06
Jan
Sorry, habs Häkchen vergessen, damit das Thema offen bleibt. Das kann man nur durch einen neuen Post korrigieren, oder kann man irgendwo nachträglich editieren?
Gruß, Jan

Kann man nicht
20.08.2015 13:49:10
Jack_d
Hast du insofern schon richtig gemacht.
Am besten lädts du noch eine Mustermappe hoch, dann kann ich mal bissl basteln.
Grüße

Suchen und Ersetzen
20.08.2015 13:56:34
Jan
Alles klar, Danke.
Habe gleich noch 2h Termin und dann keinen Zugriff mehr auf das Dokument, deswegen werde ich die Mustermappe erst morgen schaffen, sorry. Die Ursprungsdatei ist ziemlich umfangreich (300+ Sheets) und es sind sensible Daten. Ich lasse das hier mal offen, vielleicht hat ja dennoch wer bis morgen eine Idee, die Mappe reiche ich andernfalls morgen nach!
Dir nochmal vielen Dank für deine Hilfsbereitschaft!
Gruß, Jan

Anzeige
AW: VBA - Suchen und ersetzen
20.08.2015 15:11:19
Michael
Hi zusammen,
also, bei mir funktioniert es prinzipiell wie eingangs vorgelegt, nur daß ich, um Probleme zu vermeiden, vor dem Replace überprüfe, ob jeweils Werte vorhanden sind - aber das sollte es nicht rausreißen:
Option Explicit
Sub SuchenUndErsetzen()
' im Modul
Dim vWhat 'Array der zu suchenden Zeichenfolgen im Stil "*AMI *
Dim vRep  'Array der Ersatzzeichenfolge als Wort. Hier: "Auftragsminuten"
Dim iSuch As Long 'Laufvariable
vWhat = Worksheets("Tabelle1").Range("D8:D41").Value 'Hier stehen die Suchtexte
vRep = Worksheets("Tabelle1").Range("B8:B41").Value 'Hier stehen die Ersatztexte
For iSuch = LBound(vWhat) To UBound(vWhat)
If vWhat(iSuch, 1)  "" And vRep(iSuch, 1)  "" Then
Cells.Replace What:=CStr(vWhat(iSuch, 1)), Replacement:=CStr(vRep(iSuch, 1)), _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, _
SearchFormat:=False, ReplaceFormat:=False
End If
Next
Worksheets("Tabelle1").Range("D8:D41").Value = vWhat 'Die Arrays werden wieder an
Worksheets("Tabelle1").Range("B8:B41").Value = vRep  'ihren Ursprungsort gesschrieben
End Sub
Sub ArrayTest()
' im Modul
Dim a As Variant
a = Worksheets("Tabelle1").Range("B8:D41").Value
MsgBox "LBound(a): " & LBound(a) & vbLf & _
"LBound(a,1): " & LBound(a, 1) & vbLf & _
"LBound(a,2): " & LBound(a, 2) & vbLf & _
"UBound(a): " & UBound(a) & vbLf & _
"UBound(a,1): " & UBound(a, 1) & vbLf & _
"UBound(a,2): " & UBound(a, 2)
End Sub
Kann es sein, daß es nur deshalb scheinbar nicht funktioniert, weil alle Ersetzungen bereits vorgenommen wurden?
@Jack_d: ich bin erst vor ein paar Tagen beim Rudi mit dem gleichen Denkfehler aufgelaufen, wider besseren Wissens. Wie Du bei http://www.online-excel.de/excel/singsel_vba.php?f=152
nachlesen kannst, werden Arrays, die man aus dem Tabellenblatt übernimmt, *immer* zweidimensional angelegt, auch wenn man nur eine Spalte oder Zeile nimmt.
Jans Schreibweise ist insofern absolut richtig.
Allerdings habe ich zwischenzeitlich auch mit dem UBound gekämpft; es scheint so zu sein, daß man bei mehrdimensionalen Arrays die Nummer der Dimension explizit abfragen kann, wobei 1 den Zeilenwert und 2 den Spaltenwert zurückgibt. Der Wert ist optional, und wenn man ihn wegläßt, wird die Anzahl der Zeilen zurückgegeben - bitte zu testen.
Ach so, gekämpft hatte ich, weil ich dummerweise ein "einzeiliges" Array hatte, da kam ohne Parameter natürlich immer 1 raus.
Schöne Grüße,
Michael
P.S.: mit *AMI würde ich aufpassen, denn sonst wird aus BEL AMI Auftragsminuten, d.h., was links steht, wird "weggeworfen".

Anzeige
AW: VBA - Suchen und ersetzen
20.08.2015 16:04:08
Jan
Hallo Michael,
auch dir erstmal vielen Dank, es begeistert mich immer wieder wie aktiv die Community hier ist.
Ich habe noch kurz Zeit und gehe deswegen näher auf das Problem ein:
Ich habe ca 300 Sheets mit Auszügen für Kostenstellen eines Unternehmens bei dem ich Praktikant bin. Dort tauchen als Kostenarten, welche ich betrachten möchte, beispielsweise Folgende auf:
Auftragsminuten
Warenwert Kaufteile
Bearbeitete Oberfläche
Stück
Umsatz
te-Minuten
TGB-Minuten
299 Gesamt Personalkosten
300 Werkzeuge, Modelle
305 Gemeinkostenmaterial
310 Hilfs- und Betriebsstoffe
320 Instandhaltung Fremd
325 Umbau/Änderungen Fremd
345 Abschreibungen
350 Geringw.Wirtschaftsg.
Zumindest ist das der Standard, den ich über alle Kostenstellen hinweg haben möchte. In _ einzelnen Sheets kann aber auch bspw.

"**      345 Abschreibungen"
oder

"* 345 Abschreibungen"
stehen. Das Einzige was immer gleich ist, ist die Kostenartenziffer und eine Leerstelle sowie die Bezeichnung danach.
Deswegen wie folgt ein Auszug aus der Range, die meinen Array vWhat befüllt:
*AMI *
*PPV *
*QDM *
*QUA *
*SAL *
*TE *
*TGB *
*299 G*
*300 W*
*305 G*
*310 H*
*320 I*
*325 U*
*345 A*
*350 G*
Da ich das vorher eine ganze Weile per Hand gemacht habe für jeden der Begriffe einzeln, weiss ich, dass das mit den Suchbegriffen passt.
Und dennoch funktioniert obenstehendes Makro nur auf dem aktuell offenen Tabellenblatt. Es sind definitiv nicht alle Ersetzungen geschehen, das habe ich überprüft. Auch ist kein Blattschutz aktiviert o.Ä.
Ich befürchte, dass ich grade doch irgendwo ein dickes Brett vor dem Kopf habe..
Gruß,
Jan

Anzeige
Haken vergessen... owT
20.08.2015 16:06:15
Jan
.

AW: VBA - Suchen und ersetzen
20.08.2015 17:16:20
Michael
Hi Jan,
jetzt geht es bei mir auch nicht mehr!
Ich habe noch ein bißchen rumgeschnüffelt und bin auf wiedersprüchliche Aussagen zu Replace gestoßen. Die einen sagen, die Funktionalität wie im Ersetzen-Dialog (daß man von Blatt auf Mappe stellen kann), sei in VBA nicht implementiert, bei irgendjemanden scheint es aber doch geklappt zu haben.
Naja, alles müßig! So geht es auf alle Fälle, mit ner Schleife halt:
Option Explicit
Sub SuchenUndErsetzen()
' im Modul
Dim vWhat 'Array der zu suchenden Zeichenfolgen im Stil "*AMI *
Dim vRep  'Array der Ersatzzeichenfolge als Wort. Hier: "Auftragsminuten"
Dim iSuch As Long 'Laufvariable
Dim wsh As Worksheet
vWhat = Worksheets("Tabelle1").Range("D8:D41").Value 'Hier stehen die Suchtexte
vRep = Worksheets("Tabelle1").Range("B8:B41").Value 'Hier stehen die Ersatztexte
For Each wsh In Worksheets
For iSuch = LBound(vWhat) To UBound(vWhat)
If vWhat(iSuch, 1)  "" And vRep(iSuch, 1)  "" Then
wsh.Cells.Replace What:=CStr(vWhat(iSuch, 1)), Replacement:=CStr(vRep(iSuch, 1)), _
LookAt:=xlPart, MatchCase:=True
' die beiden Parameter kennt mein altes Excel nicht:
'        SearchFormat:=False, _
'        ReplaceFormat:=False
' SearchOrder:=xlByRows, hab ich raus, soll X doch suchen, wie es will
End If
Next
Next
Worksheets("Tabelle1").Range("D8:D41").Value = vWhat 'Die Arrays werden wieder an
Worksheets("Tabelle1").Range("B8:B41").Value = vRep  'ihren Ursprungsort gesschrieben
End Sub
Schöne Grüße,
Michael
P.S.: wenn das so ist, ist der * natürlich kein Problem....

Anzeige
Danke
21.08.2015 07:42:08
Jan
Hallo Michael,
dann scheine ich mit meinem Unverständnis dafür, dass es mal funktioniert hat und dann plötzlich nichtmehr ja nicht ganz alleine dazustehen. Ich werde es dann mit der Schleife realisieren, wie von die erarbeitet. Ich danke dir vielmals für dein Interesse und die tolle Arbeit. Auch an den Rest, der mir hier schon öfters geholfen hat an dieser Stelle nochmal ein großes Lob.
Einen schönen Tag!
Gruß, Jan

Dir auch, und danke f.d. Rückmeldung, owT
21.08.2015 12:24:19
Michael

332 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige