Fortgeschrittenes VBA: String "zerschneiden"
#1
Hallo zusammen,

bräuchte einen VBA-Experten.
Folgende Problemstellung:
Ich habe einen sehr langen String, in dem sich immer wieder bestimmte Zeichen wiederholen und ich den unterschiedlich langen Text dazwischen auslesen und in eigene Zellen schreiben möchte.
Beispiel:
Langer String in Zelle A1: 
"#A#Text1a#/A#irgendwasdazwischen#B#Text1b#/B#irgendwasdazwischen#A#Text2aa#/A#irgendwasdazwischen#B#Text2bb#/B#irgendwasdazwischen#A#Text3aaa#/A#irgendwasdazwischen#B#Text3bbb#/B#..."
Jetzt hätte ich gerne in fortlaufenden Zellen der Spalte A und B die Infos ausgelesen, die jeweils zwischen #A# und #/A# bzw. zwischen #B# und #/B# stehen:
          A                     B
2:    Text1a           Text1b
3:    Text2aa         Text2bbb
4:    Text3aaa       Test3bbb
...
Solange es noch Infos im String gibt, die dazu passen.

DANKE!
Antworten Top
#2
Hallo,

ich würde zuerst bei "Text" splitten:

Code:
Ar = split(cells(1,1),"Text")

mfg
Antworten Top
#3
Das aber komisch erklärt.

Sind a und b (aa... und bb...) denn irgendwie eindeutig (also im Zweifel etwas länger)?
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#4
Hi, sorry - hätte man die Vorschau Option nutzen sollen.
Hatte "<" und ">" Zeichen verwendet und das hat etwas das Beispiel zerstört.

Die verschiedenen Texte sollen nur verdeutlichen, dass es unterschiedlich lange Texte sein können.
Deshalb wird auch die Split Funktion mit "Text" als Sucher nicht funktionieren.
Antworten Top
#5
Hallo

Das sind also öffnende und schließende Tags, zwischen denen Du den Inhalt auslesen willst. HTML wird es vermutlich nicht sein. Vielleicht ein Ausschnitt aus XML? Die Frage, die ich mir stelle ist, heißen die beiden einzigen verwendeten Tags A und B? Oder sind das auch nur Beispiele? Ich denke mit Deinem Beispieltext wird Hilfe schwierig, weil das immer etwas Fischen im Trüben ist. Lade eine Beispiel Text-Datei hoch, in der die original Tags enthalten sind. Wenn der Text dazwischen vertraulich ist, musst Du ihn ersetzen. Auf den kommt es ja nicht an, aber auf die Struktur des Gesamtstrings.

Aso, können öffnende und schließende spitze Klammern auch innerhalb der auszulesenden Texte vorkommen? Falls nicht, kann man die als Indikatoren nehmen, um den Text zu parsen.

Viele Grüße,

Zwenn
Antworten Top
#6
Falls es mit den spitzen Klammern so ist, wie ich fragte, kannst Du es mit Split() prinzipiell so lösen:

Code:
Sub TextSplit()

  Dim textToParse As String
  Dim splitArray() As String
  Dim oneElement As Long
  Dim currRow As Long
 
  currRow = 2
  textToParse = "<A>Text1a</A>irgendwasdazwischen<B>Text1b</B>irgendwasdazwischen<A>Text2aa</A>irgendwasdazwischen<B>Text2bb</B>irgendwasdazwischen<A>Text3aaa</A>irgendwasdazwischen<B>Text3bbb</B>"
 
  'Zuerst an der schließenden spitzen Klammer splitten
  splitArray = Split(textToParse, ">")
 
  'Das Array durchgehen. Jedes Element, das </A oder </B enthält, enthält auch gesuchten Text
  'Elemente ohne </A oder </B verfallen
  For oneElement = 0 To UBound(splitArray)
    'Auf </A prüfen
    If InStr(1, splitArray(oneElement), "</A") Then
      'Text in Tabelle schreiben
      Cells(currRow, 1) = Trim(Replace(splitArray(oneElement), "</A", ""))
    End If
   
    'Auf </B prüfen
    If InStr(1, splitArray(oneElement), "</B") Then
      'Text in Tabelle schreiben
      Cells(currRow, 2) = Trim(Replace(splitArray(oneElement), "</B", ""))
      currRow = currRow + 1
    End If
  Next oneElement
End Sub


Viele Grüße,

Zwenn
Antworten Top
#7
C1:D999: =INDEX(XMLFILTERN("<a><b>"&WECHSELN(WECHSELN(A1;">";"<");"<";"</b><b>")&"</b></a>";"//b");ZEILE(A1:A999)*8-{5.1})

in dem genannten markierten Bezug C1:D999 nicht mit Eingabe, sondern mit Strg-Umsch-Eing abschließen (Formelarray). Fehlerwerte bekommst Du mit =WENNFEHLER(Formel;"") weg.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#8
Hallo Zwenn, 
vielen Dank. Das geht schon absolut in die richtige Richtung und funktioniert auch problemlos für das gegebene Beispiel.
Leider war das Beispiel wie ich jetzt merke nicht perfekt.
Zusätzliche Herausforderung: Die konkreten Tags, zwischen denen ich die Texte auslesen möchte, sind ähnlich in der Bezeichnung.
Konkret: "Bank" und "BankLeitzahl" ...
Glaube das führt gerade dazu, dass das "A" im Bsp. immer zutrifft... und das macht Probleme. 
Wenn ich aber das ">" am Ende ergänze, funktioniert die "Suche starten" Funktion basierend auf ">" nicht mehr.
Hoffe das war nachvollziehbar. :)
VG
Antworten Top
#9
(20.08.2021, 12:27)Ollowain schrieb: ...
Hoffe das war nachvollziehbar. :)

Hallo Ollowain,

leider sind Deine Ausführungen für mich nicht nachvollziehbar. Lies Dir bitte noch einmal mein erstes Posting durch, beantworte die Fragen daraus und vor allem, lade eine Beispieldatei hoch. Wie Du selbst schreibst, gibt es Probleme, weil die Tagnamen nicht erkannt werden (wenn ich das richtig verstanden habe). Wie soll denn jemand verstehen, was genau Du meinst, wenn nur Du die zu verknüpfende Information in Form der Original Ausgangsdaten kennst?

Noch ein gut gemeinter kleiner Hinweis. Es ist immer eine nette Geste, sich bei allen zu bedanken, die sich fruchtbar an der Diskussion beteiligen oder Dir sogar eine Löung anbieten. Einen Lösungsvorschlag zu ignorieren kommt hingegen sehr unhöflich/ geringschätzig rüber.

Viele Grüße,

Zwenn
Antworten Top
#10
Hallo Zwenn,
sorry, war nicht unhöflich gemeint. Ich hatte nur Probleme, die zweite Lösung überhaupt zu verstehen und habe mich deshalb auf deinen Vorschlag konzentriert.
Natürlich bin ich dankbar für jede angebotene Hilfe. Angel

Bzgl. den Fragen:
- Nein, es ist kein html
- Die Klammern kommen nicht in den Texten vor, die ich auslesen möchte
- Das Problem entsteht (nach meinem Verständnis) gerade noch dadurch, dass die zwei "Identifier-Tags" - "Bank" und "Bankleitzahl" - beide mit "Bank" beginnen.

Hier nochmal ein Beispiel zur Verdeutlichung (oben die Eingabe / unten das gewünschte Ergebnis):


Angehängte Dateien Thumbnail(s)
   
Antworten Top


Gehe zu:


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