Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1968to1972
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
Inhaltsverzeichnis

Text in Zelle per VBA suchen und Zeilenumbruch löschen

Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 15:25:25
Koopert
Hallo liebes Forum,

ich habe eine Tabelle mit mehreren unterschiedlichen Einzelwerten, welche in den Spalten A, B und C stehen. Diese Einzelwerte (z.B. Farbe, Gewicht, Breite, etc.) werden über eine Suchen & Ersetzen Funktion über "Platzhalter" in eine Zelle in Spalte D, untereinander mit Zeilenumbrüchen geschrieben, sodass eine Zelle die gesamten Werte enthält.
Z.B.
Farbe = blau
Gewicht = 10kg
Breite = 1m

Wobei dann in den Zellen die Werte "blau", "10" und "1" stehen.
Sollte jetzt aus welchen Gründen auch immer ein Einzelwert "leer" sein, möchte ich dass die ganze Zeile verschwindet. Also, z.B. wenn in der Zelle für Gewicht nichts eingetragen ist, soll in der Zelle die Ausgabe dann so aussehen:
Farbe = blau
Breite = 1m

Die Zelle in Spalte D, in die geschrieben wird ist immer mit den jeweiligen Werten vordefiniert, sodass der Code über Ersetzen nach dem Freitext sucht und diesen durch den Wert ersetzt.
Beispiel:
Farbe = varFarbe
Gewicht = varGewicht kg
Breite = varBreite m

Bis jetzt habe ich folgenden Code:




Sub Text_ersetzen()
Dim val_Farbe, val_Gewicht, val_Breite as String
Dim head_Farbe, head_Gewicht, head_Breite, head_Eig As String
Dim col_Farbe, col_Gewicht, col_Breite, col_Eig As Integer
Dim i, last_row, head_row, first_row, loop_row, cl, repl_cl As Long

'Überschriften finden, Spalten rausschreiben und letzte Zeile finden

head_Farbe = "Farbe"
head_Gewicht = "Gewicht"
head_Breite = "Breite"
head_Eig = "Eigenschaften"
head_row = 1

col_Farbe = Application.WorksheetFunction.Match(head_Farbe, Cells(head_row, 1).EntireRow, False)
col_Gewicht = Application.WorksheetFunction.Match(head_Gewicht, Cells(head_row, 1).EntireRow, False)
col_Breite = Application.WorksheetFunction.Match(head_Breite, Cells(head_row, 1).EntireRow, False)
col_Eig = Application.WorksheetFunction.Match(head_Eig, Cells(head_row, 1).EntireRow, False)

last_row = Cells(Rows.Count, col_Eig).End(xlUp).Row

'Schleife zum Austauschen der Variablen
loop_row = 2


For i = loop_row To last_row

'Werte aus den Zellen auslesen
val_Farbe = Cells(loop_row, col_Farbe).Value
val_Gewicht = Cells(loop_row, col_Gewicht).Value
val_Breite = Cells(loop_row, col_Breite).Value

'Werte ersetzen:
Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "varFarbe", val_Farbe)
Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "varGewicht", val_Gewicht)
Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "varBreite", val_Breite)

loop_row = loop_row + 1 'Schleife um 1 hochzählen

Next i

End Sub


Ich komme jetzt nicht so wirklich weiter bei "Werte ersetzen" und wie ich es schaffe, wenn in einer Zelle nichts steht, dass dann diese Textzeile, inkl. Zeilenumbruch aus meinem Text entfernt wird. Wichtig ist hier auch zu erwähnen, dass nur dieser spezielle Zeilenumbruch entfernt werden soll und nicht alle in der Zelle enthaltenen.

Mein Gedankengang wäre jetzt, das ebenfalls über eine Ersetzen-Funktion zu machen, aber da fehlt mir die Idee wie ich den Cursor in die Zeile bekomme um den Zeilenumbruch zu entfernen:



If IsEmpty(val_Farbe.Value) Then

Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "Farbe = varFarbe", "")

Else
Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "varFarbe", val_Farbe)

End If



Danke schon mal für die Hilfe!
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 15:43:40
Onur
Statt deine Datei zu beschreiben, solltest du sie posten, denn wie sollen wir ein Makro für eine Datei schreiben, ohne sie zu kennen und ohne es testen zu können???
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 16:02:11
daniel
Hi
das kannst du doch per Formel lösen, wenn die Spalten schon in der richtigen Reihenfolge angeordnet sind.

=Textverketten(Zeichen(10);wahr;Wenn(A2:C2="";"";A$2:C$2&" = "&A2:C2&Wenn(A$1:C$1="Gewicht";" kg";""))

Gruß Daniel
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 16:23:38
Koopert
Ja, das wäre generell möglich, allerdings kommen da am Schluss noch ein paar Eigenschaften mehr hinzu, weshalb es über eine Formel entsprechend lang werden würde und VBA deshalb die bessere Alternative ist.

Zur besseren Veranschaulichung hier die Beispieldatei:

https://www.herber.de/bbs/user/168136.xlsm
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 17:43:58
daniel
Hi
nö, die Formel wird nicht länger, wenn Eigenschaften hinzukommen.
zumindest nicht, solange die Spalten mit den Eigenschaften in der Reihenfolge angeordnet sind, in der sie auch in der Zelle erscheinen sollen und solange die Texte aus der Überschriftenspalte in die Textzelle übernommen werden kann.
Denn die Formel würde sich dann nur dadurch ändern, dass die letzte Spaltenbezeichnung sich ändert.
und ob da B2:C2 für drei Eigenschaften steht, oder B2:Z2 für 25 Eigenschaften, die Formel bleibt so wie sie ist.
hier nochmal die Formel für deine Beispieldatei.
wenn da noch Spalten hinzu kommen, dann verlängert sich die Formel nicht:

ich würde das sogar so machen:
1. ergänze die Überschriften um einen Unterstrich und ggf um die Einheit, also "Farbe _", "Gewicht _ kg", "Breite _ m"
2. verwende diese Formel:
="Das Produkt hat folgende Eigenschaften:"&ZEICHEN(10)&ZEICHEN(10)&

LET(üb;Tabelle1[[#Kopfzeilen];[Farbe _]:[Breite _ m]];
Werte;Tabelle1[@[Farbe _]:[Breite _ m]];
TEXTVERKETTEN(ZEICHEN(10);WAHR;WENN(Werte ="";"";WECHSELN(üb;"_";Werte))))

wie gesagt, wenn weitere Eigentschaften hinzukommen, muss nur die Spaltenbezeichnung der letzten Spalte (hier "[Breite _ m]") angepasst werden, zusammengefasst werden alle dazwischenliegenden Spalten.

Gruß Daniel
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 18:17:44
Yal
Hallo Koopert,

warum ein "Replace", wenn es weniger aufwändig wäre, den String komplett von null auf aufzubauen?

Da Du eine Tabelle hast, kann man die Tabellenstruktur verwenden, um an den Daten ranzukommen.

Teste folgende Code:
Sub Test()

Dim Z As ListRow
Dim Elt
Dim Txt As String

With Range("Tabelle1").Parent.ListObjects("Tabelle1")
For Each Z In .ListRows
Txt = "Das Produkt hat folgende Eigenschaften:" & vbLf
For Each Elt In Split("Farbe;Gewicht;Breite", ";")
With Z.Range(.ListColumns(Elt).Index)
If .Value > "" Then Txt = Txt & vbLf & Elt & " = " & .Value
End With
Next
Debug.Print Txt
Next
End With
End Sub


VG
Yal
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 18:34:00
Koopert
Hallo und erstmal Danke für die vielen Anregungen. Ihr habt voll und ganz Recht, dass es über Text verketten einfacher wäre.

Leider ist es so, dass die Texte sich von Produkt zu Produkt unterscheiden. D.h. ich kann den Text vor den Eigenschaften nicht wirklich eingeben, da dieser in jeder Zeile unterschiedlich ist. Dazu kommt, dass der Vortext zwischen 500 bis 2500 Zeichen lang ist und anschließend unten die Eigenschaften drangesetzt werden.
Zum Teil unterscheiden sich aber auch die Eigenschaften der Produkte und sind nicht immer gleich (z.B. bei manchen ist dann keine Breite in den Eigenschaften angegeben).
Aus dem Grund muss die Lösung über Suchen & Ersetzen laufen...

Danke nochmals!
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 18:44:15
daniel
hi
naja, meine Formel mit Textverketten sorgt doch dafür, dass bei nicht angegeben Eigenschaften die ganze Zeile fehlt.
Es ist viel einfacher, diese wegzulassen, wenn man den Text neu aufbaut, als ihn hinterher wieder rauszunehmen.

Und wenn der Vortext sich Zeilenweise ändert, kannst du ja den Vortext weiterhin in die Spalte schreiben und von dort in die Formel übernehmen, also nicht als festen Text in die Formel eingeben, sondern als Zellbezug.

Wie gesagt, das einzige was gegen die Formel spricht, wäre wenn die Eigenschaften in einer anderen Reihenfolge aufgeführt werden müssen, als sie in der Tabelle angeordnet sind und sich diese Anordnung der Spalten nicht einfach ändern lässt.

Gruß Daniel
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 19:05:51
Koopert
Ja, genau das ist mein Problem, da die Eigenschaften pro Zeile unterschiedlich sein können, auch vom Aufbau. Aus diesem Grund muss ich leider wegnehmen. Ich denke über Suchen & Ersetzen lässt sich das lösen, allerdings fehlt mir wie gesagt hier der Ansatz wie ich einfach nur die leere Zeile dann lösche.
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
19.03.2024 19:32:23
daniel
naja, wenn du unbedingt willst, das kann man schon durch Suchen und Ersetzen lösen.

du musst dann:
Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "varFarbe", val_Farbe)

durch diesen If-Block ersetzen:

If val_Farbe > "" then

Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, "varFarbe", val_Farbe)
else
Cells(loop_row, col_Eig).Value = Replace(Cells(loop_row, col_Eig).Value, vbLf & "Farbe = varFarbe", "")
end if

Gruß Daniel


Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
20.03.2024 12:00:14
Yal
Hallo Koopert,

als Erweiterung von Daniels Idee müsstest Du vielleicht den Text mehr als Teil der Programmierung verstehen:

Wenn der Basis-Text in der From
"das Produkt hat @Farbe|Breite|Höhe@"
vorliegt, ist es für eine Verarbeitung leicher, die erwartete Eigenschaften zu extrahieren, lesen und wenn vorhanden in "Farbe = ..", "Breite = .." zu übergeben, bzw. eine Eigenschaft wegzulassen, wenn nicht vorhanden.
Diese Eigenschaften entsprechen idealerweise genau die Spaltenüberschrift der Tabelle.

VG
Yal

AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
20.03.2024 14:25:44
Koopert
Ja, das stimmt.
Ich habe nur das Problem, dass ich die Parameter, die ich für eine Abfrage bräuchte (welche Werte geschrieben werden müssen) in der Excel Datei nicht habe... aber sonst 100% Zustimmung.
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
20.03.2024 15:20:07
Yal
Mit einer Auflistung in Form von kodierte Parameter "das Produkt hat @Farbe|Breite|Höhe@" stellst Du die Abfrage, was Du haben möchtest. Aufgebaut wird nur, was vorhanden ist, aber auf alle Fälle die kodierte Parameter rausgeworfen.
Es ist eine Mischform zwischen komplettes Replace und komplettes Neugenerieren. ES funktioniert nur, wenn die Rückgabe der vorhandenen Werte eine feste Schreibweise haben:
aus "@Farbe|Breite|Höhe@"
wird "/vbLf/Farbe = blau /vbLf/Höhe = 10 cm" (ein Beispiel, wo Breite fehlen würde)

Das Auswerten der "Pseudo-Parameter" lässt sich am besten mit Regex auslesen.

Function RegExExtrakt(ByVal Target) As String

Dim R
If TypeOf Target Is Range Then Target = Target.Cells(1).Value
Set R = CreateObject("VBScript.RegExp")
R.Pattern = "@[\d\D]+@"
On Error Resume Next
RegExExtrakt = R.Execute(Target)(0)
End Function

Function Bezeichnung_umsetzen(Text As String)
Dim PseudoParam As String
Dim P
Dim Erg As String

PseudoParam = RegExExtrakt(Text)
For Each P In Split(Replace(PseudoParam, "@", ""), "|")
P = Parameter_suchenUndAufbauen(P) 'siehe vorigen Code
If P > "" Then Erg = Erg & vbLf & P
Next
Bezeichnung_umsetzen = Replace(Text, PseudoParam, Erg)
End Function

Sub Test()
Debug.Print Bezeichnung_umsetzen("das Produkt hat @Farbe|Breite|Höhe@")
End Sub


VG
Yal
Anzeige
AW: Text in Zelle per VBA suchen und Zeilenumbruch löschen
20.03.2024 14:24:26
Koopert
Vielen Dank!
Das vbLf hat mir gefehlt!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige