Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1464to1468
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

String zerlegen

String zerlegen
30.12.2015 21:05:50
Matthias
Hallo Excel-Profis,
ich habe ein kleines Problem beim zerlegen eines Strings.
Bin gerade daran mir eine kleine (Private)Verwaltung zu programmieren.
Ich habe ein einem Excel Sheet Zellen mit variablem Inhalt, der aber in der Art immer gleich ist.
Also im Prinzip ist die Zelle je Zeile folgend beschrieben:
G1
1-234-56-78-901 Auftrag-Text
3-456-78-90-123 Auftrag-Text
.
.
2-345-67-89-012 Auftrag-Text
Es können in einer Zelle eine Unterschiedliche Anzahl von Zeilen vorkommen.
Diese Zeile lese ich von einem anderen Dokument ein, wo diese schon so in nur einer Zelle stehen.
Die Bestellnummern/Materialnummern sind immer gleich aufgebaut (?-?-?-?-?).
Ich möchte nun diesen String so zerlegen, das ich jeweils nur die Bestellnummern und den Aftrags-Text in einem separaten String habe. Diese String's sollen später in Word übergeben werden und dort in ein Dokument (per Bookmarks) eingefügt werden.
Das funktioniert schon im Prinzip.
Es wäre mir erst einmal egal, ob nachher 2 Strings oder 2 Array[1..x] mit den "getrennten" Bestellnummern und Auftrag-Texte angelegt würden.
quasi:
strNummer ="1-234-56-78-901(LF)3-456-78-90-123(LF)2-345-67-89-012"
strText ="Auftrag-Text(LF)Auftrag-Text(LF)Auftrag-Text"
oder
strNummer[1]="1-234-56-78-901"
strNummer[2]="3-456-78-90-123"
strNummer[3]="2-345-67-89-012"
strText[1] ="Auftrag-Text"
strText[2] ="Auftrag-Text"
strText[3] ="Auftrag-Text"
Ich habe gerade keinen Plan wie ich da vorgehen kann?
Habe schon versucht mit

strMaterialnummer = Worksheets(1).Range("G" & gefunden_zeile)
strSuch_Materialnummer = "?-?-?-?-?"
iPosition = InStr(10, strMaterialnummer, strSuch_Materialnummer, 0)
die Position des ersten Vorkommens der Nummer zu ermitteln und dann diese heraus zu kopieren und so weiter(Schleife bis Ende des Strings), aber das mit den Wildcards funktioniert irgendwie nicht!
Kann mir hier jemand helfen, bin leider in VBA (noch) nicht so der Crack!
Thx Matthias

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: String zerlegen
30.12.2015 21:26:29
Sepp
Hallo Matthias,
mal als Ansatz.
Sub trennen()
Dim strNr As String, strText As String
Dim varTmp As Variant
Dim lngI As Long

With Sheets("Tabelle1") 'tabellennname - Anpassen!
  varTmp = Split(.Range("G1").Text, vbLf)
  For lngI = 0 To UBound(varTmp)
    strNr = strNr & Split(varTmp(lngI), " ")(0) & vbLf
    strText = strText & Split(varTmp(lngI), " ")(1) & vbLf
  Next
End With

strNr = Left(strNr, Len(strNr) - 1)
strText = Left(strText, Len(strText) - 1)

MsgBox strNr & vbLf & strText
End Sub

Gruß Sepp

Anzeige
AW: String zerlegen
30.12.2015 22:14:18
Matthias
Hallo Sepp,
danke für den ersten Tipp.
Leider habe ich vergessen zu erwähnen das der Auftrag-Text natürlich aus mehreren Wörtern bestehen kann.
Also kann es z.B. so aussehen "1-234-76-88-368 Auftrag mit den 2 / 3 Möglichkeiten"
Denke da funktioniert die Suche nach " " (Leerzeichen) als Trennung nicht.
Daher war mein Gedanke dies über die Wildcards zu machen.
Was aber immer so ist, das ja wohl die Auftragsnummer immer am Anfang steht und immer gleich lang (15 Zeichen) ist.

AW: String zerlegen
30.12.2015 22:16:47
Sepp
Hallo Matthias,
wenn die Auftragsnummer eine fixe Länge hat, dann so.
Sub trennen()
Dim strNr As String, strText As String
Dim varTmp As Variant
Dim lngI As Long

With Sheets("Tabelle1") 'tabellennname - Anpassen!
  varTmp = Split(.Range("G1").Text, vbLf)
  For lngI = 0 To UBound(varTmp)
    strNr = strNr & Trim(Left(varTmp(lngI), 15) & vbLf)
    strText = strText & Trim(Mid(varTmp(lngI), 16)) & vbLf
  Next
End With

strNr = Left(strNr, Len(strNr) - 1)
strText = Left(strText, Len(strText) - 1)

MsgBox strNr & vbLf & strText
End Sub

Gruß Sepp

Anzeige
AW: String zerlegen
30.12.2015 22:38:09
Matthias
Hi Sepp,
danke Dir für diesen Schnellen Tipp und den Code!
Habe es mal so auf die Schnelle versucht und das hilft mir für den Anfang schon einmal weiter!
Das mit dem vbLf war mir (noch) nicht so bekannt, hoffte aber das es so etwas wie in Pascal früher gab ;)
Gibt es da eigentlich auch etwas wie EOS (also end of string) mit ist das mit dem UBound noch nicht so klar ... Habe zwar die Erklärung bei MS gelesen, aber so richtig verstehe ich das nicht.
Muss ich mich aber da nochmals hinein knien (VBA mache ich nur so nebenbei etwas, sonst gerade am C# lernen, aber im alter dauerts länger)!
Hätte da noch eine weitere Frage,
da mir ja beim Aufruf meiner SUB nicht bekannt ist, wie viele Zeilen es gibt bei dem extrahieren, könnte ich wenn ich die Nummer und den Text in ein Array kopieren möchte, dies Dynamisch während der Laufzeit erzeugen? Oder gibt es eine Möglichkeit herraus zu finden mit wie vielen Zeilen eine Zelle gefüllt ist?

Anzeige
AW: String zerlegen
30.12.2015 22:55:36
Sepp
Hallo Matthias,
EOF gibts bei Arrays nicht. Ubound() gibt die Obergrenze des Array an, mit Lbound() erhälst du die Untergrenze.
So kannst du die Strings in Arrays schreiben.
Sub trennenArray()
Dim strNr() As String, strText() As String
Dim varTmp As Variant
Dim lngI As Long

With Sheets("Tabelle1") 'tabellennname - Anpassen!
  varTmp = Split(.Range("G1").Text, vbLf)
  'Arrays dimensionieren
  Redim strNr(UBound(varTmp))
  Redim strText(UBound(varTmp))
  For lngI = 0 To UBound(varTmp)
    strNr(lngI) = Trim(Left(varTmp(lngI), 15))
    strText(lngI) = Trim(Mid(varTmp(lngI), 16))
  Next
End With


End Sub

End Sub
Gruß Sepp

Anzeige
AW: String zerlegen
30.12.2015 23:08:44
Matthias
Danke Dir nochmals!
Der Code und der Trick mit dem Array, muss man sich merken!
Das ganze hilft mir echt schon sehr weiter und ich kann meine Urlaubsbeschäftigung weiter machen.
Thx, Matthias

Vielleicht ist das Folgende (ArchivNutzung!) ...
31.12.2015 02:29:20
Luc:-?
…auch noch interessant für dich, Matthias,
oder Andere (Sepp kennt das ja schon ;-]):
 ABCDEFG
11-234-56-78-901 Auftrag-Text1-234-56-78-901Auftrag-Text1-234-56-78-901, 3-456-78-90-123, 2-345-67-89-012
23-456-78-90-123 Auftrag und Text3-456-78-90-123Auftrag und TextAuftrag-Text, Auftrag und Text, Auftragstext 1 a
32-345-67-89-012 Auftragstext 1 a2-345-67-89-012Auftragstext 1 aMxFml C1:D3: {=VSplit(WECHSELN(A1:A3;" ";"|";1);"|")}
4 MxFml C5:C7: {=INDEX(VSplit(WECHSELN(A1:A3;" ";"|";1);"|");;1)}ZFml E1:=VJoin(C1:C3;", ")
51-234-56-78-901Auftrag-Text1-234-56-78-901Auftrag-Text ZFml E2:=VJoin(D1:D3;", ")
63-456-78-90-123Auftrag und Text3-456-78-90-123Auftrag und Text1-234-56-78-901, 3-456-78-90-123, 2-345-67-89-012
72-345-67-89-012Auftragstext 1 a2-345-67-89-012Auftragstext 1 aAuftrag-Text, Auftrag und Text, Auftragstext 1 a
8ZFmln A5[:A7]:=Splint(A1;;1;1)MxFml D5:D7: {=INDEX(VSplit(WECHSELN(A1:A3;" ";"|";1);"|");;2)}
9ZFmln B5[:B7]:=VJoin(Splint(A1;;2))MxFmln E6[:E7]: {=VJoin(INDEX(VSplit(WECHSELN(A$1:A$3;" ";"|";1);"|");;ZEILE(A1));", ")}
(Die 1.Lösung war übrigens eine Sache von 5-10min. Alles Andere hat dann länger gedauert. Außerdem hat mich vorher ein anderes Thema lange beschäftigt.)
Mit UDFs hast du die Wahl, sie in ZellFmln oder SubProzeduren (als Fkt) zu verwenden. VSplit erzeugt wie die zugrundeliegende vbFkt Split immer ein Array, nur kann es mit ersterer auch eine Matrix wdn (bei einem Vektor alsArgument1), während Split ein skalares Argument benötigt. Letzteres gilt auch für Splint, dafür spart man hier INDEX ein, wenn man nur bestimmte Teile haben will. Die Kombi von VSplit* und INDEX kann aber einen ganzen Vektor aus der Ergebnis­Matrix herauslösen. Das kann natürlich auch in einer SubProzedur so gemacht wdn (mit WorksheetFunction.Index). Mit VJoin*° können die separierten Vektoren ggf zu einem Text vereinigt wdn.
GRutsch für beide! Gruß, Luc :-?
_______________
* Unter RECHERCHE zu finden!   ° Aktuelle Version 1.4 nur in hochgeladenen BspDateien des Archivs!

Anzeige
AW: Vielleicht ist das Folgende (ArchivNutzung!) ...
31.12.2015 02:44:13
Matthias
Danke Luc:-? für Deinen Vorschlag.
Ich möchte aber von der Verarbeitung innerhalb der Excelltabelle über Funktionen weg.
Das hatte ich bisher und mein Ziel war dies durch VBA zu ersetzen.
Ich lese jetzt auch aus weiteren Dateien Zellen ein und verarbeite diese usw.

Das basiert auf/ist auch VBA! owT
31.12.2015 03:10:22
Luc:-?
:-?

AW: Das basiert auf/ist auch VBA! owT
31.12.2015 13:46:14
Matthias
Hi Luc,
danke Dir für die Anregung, aber habe ich da etwas falsches verstanden?
Gibt es da noch eine weitere Möglichkeit?
Man(n) möchte ja immer etwas dazu lernen ;)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige