Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1880to1884
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
Teil einer Zelle ersetzen
26.04.2022 14:25:10
Norist
Hallo!
Ich habe Zellen, in denen mehrere Werte eingetragen sind. Ein Zellinhalt sieht bspw. so aus:
100
200
300
Die Werte sind also alle in einer Zelle, jedoch per Umbruch voneinander getrennt.
Auf einem anderen Tabellenblatt habe ich genau zu diesen Zahlen Texte nach folgendem Aufbau:
100 | aaa
200 | bbb
300 | ccc
Spalte A hat die Zahlen, Spalte B den Text. Alles per Zeile voneinander getrennt.
Diese sollen nun per Makro die Zahlen ersetzen, sodass nach Abschluss des Makros folgendes in den Zellen steht:
aaa
bbb
ccc
Ich habe schon an der .Replace-Funktion herumgebastelt, welche auch ganz gut funktioniert. Ein Problem gibt es aber leider. Im Moment benutze ich folgendes Makro:

For i = 1 To UBound(abvtab)
datasheet.Cells.Replace What:=abvtab(i, 1), Replacement:=abvtab(i, 2), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Next i
Dieses Makro findet und ersetzt. Jedoch nur den ersten übereinstimmenden Wert, den er findet. Bspw. findet er "100", aber bei "100f" gibt er trotzdem "100" aus.
Ich dachte, ich könnte das umgehen, indem ich LookAt auf xlWhole verändere. Problem hier: Das funktioniert nicht, sobald mehrere Sachen gesucht werden sollen. Einzeln "100f" würde er so zuverlässig finden. Sobald aber 100f und 200 in der Zelle stehen, gibt er gar nichts mehr aus, weil diese ja so nicht existieren.
Fällt euch hier ein Workaround ein?

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Teil einer Zelle ersetzen
26.04.2022 14:35:42
Oberschlumpf
Hi,
du gibst dir beim "Aufmalen" des Aussehens deiner Zellen so viel Mühe - wieso zeigst du nicht gleich per Upload eine Bsp-Datei mit Bsp-Daten?
Ciao
Thorsten
AW: Teil einer Zelle ersetzen
26.04.2022 14:36:33
Yal
Hallo Norist,
der Suchen-Ersetzen auf Blatt-Ebene kann nur einen Treffer pro Zelle handeln.
Folgendes Umkehr könnte helfen:

Sub Ersetzen()
Dim Z As Range
Dim E, i
For Each Z In datasheet.Cells.SpecialCells(xlCellTypeConstants)
For Each E In Split(Z, vbCr)
For i = 1 To UBound(abvtab)
Z.Value = Replace(Z.Value, abvtab(i, 1), abvtab(i, 2))
Next
Next
Next
End Sub
VG
Yal
Anzeige
Könnte langsam sein...
26.04.2022 14:41:12
Yal
...bevor meine Mitstreiter über die möglich unperformante Lösung über mich herfallen:

Sub Ersetzen()
Dim Z As Range
Dim E, i
Dim Eintrag As String
For Each Z In datasheet.Cells.SpecialCells(xlCellTypeConstants)
Eintrag = Z.Value
For Each E In Split(Z, vbCr)
For i = 1 To UBound(abvtab)
Eintrag = Replace(Eintrag, abvtab(i, 1), abvtab(i, 2))
Next
Next
Z = Eintrag
Next
End Sub
Diese Lösung bearbeite die Zwischenergebnisse in einer Variable, die am Ende nur einmal in die Zelle geschrieben wird. Das Rückschreiben ist immer zeitraubend.
VG
Yal
Anzeige
AW: Könnte langsam sein...
26.04.2022 14:51:08
Norist
Hey,
vielen Dank für deinen Ansatz! Eingebaut funktioniert das auf Anhieb - leider immer noch mit denselben Problemen wie vorher.
Ich werde mal versuchen, eine Beispieldatei aufzubauen. Vielleicht hilft das weiter.
AW: Könnte langsam sein...
26.04.2022 14:58:55
Oberschlumpf
ups...
Zitat: "Ich werde mal versuchen, eine Beispieldatei aufzubauen."
Dieser Hinweis irritiert mich.
Sag mal bitte: Wie gut in Excel und VBA bist du denn?
Ein Könner muss nix versuchen, ne Bsp-Datei zu erstellen - ein Könner macht das einfach.
Meine "Wie-Gut"-Frage ist keinesfalls arrogant gemeint!
Aber ich (wir?) müssen ja schon wissen, wie detailiert dir alles erklärt werden muss.
Ciao
Thorsten
Anzeige
AW: Könnte langsam sein...
26.04.2022 15:05:24
Norist
Hier die Beispieldatei: https://www.herber.de/bbs/user/152681.xlsm
Lass dich nicht irritieren. Die Bsp-Datei muss separiert werden aus einem Makro-Konstrukt. Das braucht einen kleinen Moment.
Wie "gut" jemand in etwas ist, ist Frage der Perspektive. Aber im Vergleich zu allen, die mir hier helfen können/wollen, würde ich mich wohl als blutigster Anfänger bezeichnen.
Grüße!
AW: Könnte langsam sein...
26.04.2022 15:19:06
Daniel
Hi
Wenn ich dein Problem richtig verstehe, dann könntest du es so lösen, dass du in einer weiteren Hilfsspalte die Anzahl der Zeichen in Spalte A ermittelst (=Länge(A2) ) und danach die Liste absteigend sortiert, bevor du das ganze ausführst.
Du hast bspw "350" und "350i". Du musst hier zuerst " 350i" ersetzen, also den längeren Text. Dann bleibt der kürzere Text zunächst unverändert und kann danach korrekt umgewandelt werden.
Gruß Daniel
Anzeige
Eigentlich...
26.04.2022 17:12:41
Yal
..wäre die Aufgabe eher mit einem SVerweis zu lösen, als ein Replace.
Es bockt, weil deine Schlüssel in der Spalte A von H-Sätze sowohl Text als auch Zahl vermischen.
Markiere die ganze Spalte A, setze den Fromat Text (Strg+1, Text ), dann reinitialisiere jede einzelne Zelle: im Menü Daten, Text in Spalten, getrennt nach Tab (was es in deine Liste nicht gibt, aber genau deswegen).
Dann kannst Du folgende Code verwenden:

Sub Ersetzen()
Dim Z As Range
Dim E, i
Dim Eintrag As String
With Sheets("BA Tabelle")
For Each Z In Range(.Range("A2"), .Range("A99999").End(xlUp))
Eintrag = ""
For Each E In Split(Z.Text, vbLf) 'vbCr war falsch
Eintrag = Eintrag & vbCr & HSaetze_VLookUp(Trim(E))
Next
Z.Offset(0, 1) = Mid(Eintrag, 2)
Next
End With
End Sub
Function HSaetze_VLookUp(Wert As Variant) As String
On Error Resume Next
Wert = Application.VLookup(CStr(Wert), Worksheets("H-Sätze").Range("A:B"), 2, 0)
If Wert = "" Then Wert = Application.VLookup(CLng(Wert), Worksheets("H-Sätze").Range("A:B"), 2, 0)
End Function
Der VLookUp (=SVerweis) ist in eine separate Prozedur, um den On Error zu isolieren.
VG
Yal
Anzeige
AW: Eigentlich...
26.04.2022 19:54:13
Norist
Danke dir!
Leider tut sich da bei mir gar nichts. Der Code geht ohne Fehler durch, verändert aber nichts. Die vorige Anweisung habe ich natürlich befolgt.
AW: Eigentlich...
27.04.2022 08:47:28
Michael
Moin,
hier fehlt in der Function als letzte Zeile

HSaetze_VLookUp = Wert
Dann läuft das prima!
Besten Dank an alle, so ein Problem hatte ich auch schon mal und mich ziemlich rumgequält ;-)
VG
Michael
Ach, ich depp!
27.04.2022 09:35:13
Yal
@Micheal: vielen Dank für die Korrektur :-)
sogar genauer gesagt sollte es so heissen:

Function HSaetze_VLookUp(Wert As Variant) As String
On Error Resume Next
HSaetze_VLookUp = Application.VLookup(CStr(Wert), Worksheets("H-Sätze").Range("A:B"), 2, 0)
If HSaetze_VLookUp = "" Then HSaetze_VLookUp = Application.VLookup(CLng(Wert), Worksheets("H-Sätze").Range("A:B"), 2, 0)
End Function
VG
Yal
Anzeige
AW: Ach, ich depp!
27.04.2022 12:29:19
Norist
Hey,
cool, so läufts gut! :)
Jetzt fehlt nur noch - aber das brauch ich zusätzlich -, dass er mir, wenn er die Zahl nicht findet, diese Zahl dennoch als Ergebnis ausgibt (sodass man dann manuell nachgucken kann, woran das liegt). Aber das bau ich selbst ein.
Danke und Grüße!
AW: Ach, ich depp!
27.04.2022 17:37:56
Yal
Hallo Norist,
wenn der VLookup nichts findet, bleibt die Rückgabe leer. Das testet man eine zweite mal und gibt in dem Fall den String aus Wert aus.

Function HSaetze_VLookUp(Wert As Variant) As String
On Error Resume Next
HSaetze_VLookUp = Application.VLookup(CStr(Wert), Worksheets("H-Sätze").Range("A:B"), 2, 0)
If HSaetze_VLookUp = "" Then HSaetze_VLookUp = Application.VLookup(CLng(Wert), Worksheets("H-Sätze").Range("A:B"), 2, 0)
If HSaetze_VLookUp = "" Then HSaetze_VLookUp = CStr(Wert)
End Function
VG
Yal
Anzeige
AW: Ach, ich depp!
28.04.2022 13:29:50
Norist
Hey Yal,
danke dir für deine Mühe! Das klappt wirklich außerordentlich gut und trifft genau das, was ich erreichen wollte.
Eine kleine (visuelle) Frage hätte ich noch: Das Makro listet die Texte richtig auf, sogar mit einem Textumbruch innerhalb der Zelle. Allerdings SEHE ich diesen Textumbruch erst, wenn ich manuell in die Zelle doppelklicke. Ohne Doppelklick sieht alles aus wie hintereinanderweg geschrieben.
Im Internet habe ich dazu rein gar nichts gefunden - kannst du dir erklären, woran das liegt?
AW: Ach, ich depp!
28.04.2022 17:41:32
Yal
Hallo Norist,
in der Prozedure "Ersetzen" (falls Du den Namen nicht geändet hast), in

For Each E In Split(Z.Text, vbLf) 'vbCr war falsch
Eintrag = Eintrag & vbCr & HSaetze_VLookUp(Trim(E))
Next
ersetzt den vbCr in vbLf. Weil es ist, was auch vorher drin war.
VG
Yal
Anzeige
AW: Ach, ich depp!
28.04.2022 23:31:47
Norist
Hey Yal,
ach cool. Ich hätte vielleicht mal nach vbCr und vbLf suchen können. Das war etwas, was ich mir in dem Code nicht auf Anhieb erklären konnte. Aber nun ergibt alles Sinn. Vielen Dank nochmal! Bin vollkommen zufrieden :)
AW: Teil einer Zelle ersetzen
26.04.2022 16:49:45
snb
Läuft hier wie erwünscht:

Sub M_snb()
sn = Tabelle1.ListObjects(1).DataBodyRange
For j = 1 To UBound(sn)
Tabelle2.ListObjects(1).DataBodyRange.Columns(1).Replace sn(j, 1), sn(j, 2)
Next
End Sub

AW: Teil einer Zelle ersetzen
26.04.2022 18:22:41
Norist
Funktioniert leider nicht. Text von 100 wird immer noch genommen, obwohl bspw. 100i eingetragen wird.
AW: Teil einer Zelle ersetzen
26.04.2022 20:13:37
Daniel
Hi
Ich hatte dir doch geschrieben, dass du die Reihenfolge ändern musst, so dass "100i" vor "100" kommt und zuerst ersetzt wird. Dann funktioniert auch dein ursprünglicher Code.
Du musst nur die Liste vorher nach der Länge der Kürzel absteigend sortieren.
Gruß Daniel
Anzeige
AW: Teil einer Zelle ersetzen
26.04.2022 20:31:02
Norist
Hey,
sorry, hatte ich überlesen. Danke dir!
Ja, diesen Ansatz hatte ich zum Teil schon vorher so und ja, das funktioniert sogar. Jedoch ist diese umsortierte Liste dann leider nicht mehr so übersichtlich.
Falls ich das nicht anders hinbekomme, werd ichs auch so machen. Ist dann nicht schön, aber funktioniert wenigstens.
Grüße!
AW: Teil einer Zelle ersetzen
26.04.2022 21:30:17
Daniel
Lass doch das Makro wieder zurücksortieren
Ich würde auch die Sortierung nach Länge vom Makro ausführen lassen.
Gruß Daniel

315 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige