Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 14:18:05
28.04.2024 13:43:14
Anzeige
Archiv - Navigation
1836to1840
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

Zahlen aus String - etwas anders

Zahlen aus String - etwas anders
25.06.2021 14:40:24
Axel224
Hallo zusammen,
Gern möchte ich aus dem gemischten Zellinhalt meiner Tabellenüberschriften nach den möglichen Mustern "Text Zahl Text" oder auch "Zahl Text Text" oder "Text Text Zahl" oder oder oder... diesen in seine Bestandteile zerlegen und jedes Bestandteil des Strings in einer neuen Zeile ausgeben.
Würde dann so aussehen:
Zeile 1 der numerische Teil
Zeile 2-4 evtl. auch 5 der zerlegte Text
Prinzipiell tut mein Code schon was er soll, nur fehlt es mir an der korrekten Sortierung. Wenn der Ur-String eine andere Reihenfolge hat als "Text Zahl Text" bekomme ich logischerweise in der 1. Zeile nicht den numerischen Teil ausgegeben, sondern Text. Wie kann ich den ausgelesenen String auf Zahlen prüfen und diese immer in der 1. Zeile in der Ausgabespalte aufführen? Falls das die Sache erleichtert, es ist IMMER eine 5-stellige Zahl.
Würde mich freuen, wenn da jemand helfen kann.
Hier noch mein Codeschnipsel, den ich mir schon zusammengegangstert habe... Falls sich da jemand wiedererkennt, dann sag ich schon mal Danke! ;)
Sorry für die blöden Bezichnungen der Variablen. Ich dachte das bekommt nie jemand zu Gesicht.
On Error Resume Next 'BEGINN Spaltenüberschriften separieren
strSep = " "
letztespalte = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Column
erste = Cells(1, 1).End(xlDown).Row + 1
For spalte = 1 To letztespalte
strText = Cells(erste, spalte).Text
If strText "" Then
strText = Trim(strText)
Cells(1, spalte) = Trim(Split(strText, strSep)(2))
Cells(2, spalte) = Trim(Split(strText, strSep)(1))
Cells(3, spalte) = Trim(Split(strText, strSep)(0))
Cells(4, spalte) = Trim(Split(strText, strSep)(3))
End If
Next 'ENDE Spaltenüberschriften separieren

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Mit ZellFmln auf UDF-Basis so, ...
25.06.2021 15:13:38
Luc:-?
…Axel:
ZahlZelle (singulare MatrixFml in B1): {=INDEX(VSplit(A1;;1);VERGLEICH(WAHR;ISTZAHL(VSplit(A1;;1));0))}
TextZellen (plurale MatrixFml): {=MTRANS(VSplit(GLÄTTEN(WECHSELN(A1;B1;""))))}
Voraussetzungen:
1. Nur eine Zahl im Text!
2. TrennZeichen ist LeerZeichen (auch vor und nach der Zahl, falls diese inmitten des Textes steht, sonst nur eines von beiden erforderlich)!
Anmerkung:
Unter Xl2019 könnten die MatrixFmln uU selbsterweiternd sein und nicht der {} (FmlEingabeAbschluss per [Strg]+[Umsch]-[Enter]) bedürfen.
UDF-Link:
VSplit (Vs1.1) https://www.herber.de/bbs/user/99024.xlsm (BsplMappe m.UDFs)
Gruß, Luc :-?
Anzeige
AW: Zahlen aus String - etwas anders
25.06.2021 15:19:34
Daniel
Hi
so vielleicht so, Code ab der Befüllung von strText einfügen, die Variablendeklaration am Anfang.

dim Texte as string
dim Zahlen as string
dim T
strText = trim(strText)
for each T in Split(strText, strSep)
if isnumeric(T) then
Zahlen = Zahlen & T & strSep
else
Texte = Texte & T & strSep
end if
next
if Zahlen = "" then Zahlen = strSep
T = split(Zahlen & Texte, strSep)
Cells(1, spalte).Resize(ubound(T) + 1, 1).value = Worksheetfunction.Transpose(T)
Gruß Daniel
AW: Zahlen aus String - etwas anders
25.06.2021 16:12:21
Yal
Hallo Axel,
Daniel hat zwar bereit eine Lösung geliefert, die "très chick" aussieht, gebe trotzdem meine Version (ich bin nicht langsam, sondern unterbrochen worden :-)

Sub Trennen()
Dim LetzteSpalte As Long
Dim Erste As Long
Dim C As Long 'Column
Dim Arr, i, j, k
Const cSep = " "
On Error Resume Next
LetzteSpalte = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Column
Erste = Cells(1, 1).End(xlDown).Row + 1
For C = 1 To LetzteSpalte 'BEGINN Spaltenüberschriften separieren
Arr = Split(Cells(Erste, C).Text, cSep)
If UBound(Arr) > -1 Then
j = 1
k = 1
For i = 0 To UBound(Arr)
If IsNumeric(Arr(i)) Then
Cells(j, C) = Trim(Arr(i))
j = j + 1
Else
Cells(k, C) = Trim(Arr(i))
k = k - 1
End If
Next
End If
Next 'ENDE Spaltenüberschriften separieren
End Sub
Variable-Deklaration ist zwar kein Muss, aber eine sehr empfehlenswerte Gewohnheit.
Sub + End Sub gehören -mMn- in einem publizierten Code drin.
VG
Yal
Anzeige
K = UBound(Arr) anstatt k = 1 owT
25.06.2021 16:19:19
Yal
Ach, meine allererste gefällt dir wohl nicht, ...
25.06.2021 18:54:26
Luc:-?
…Yal…‽ ;->
Und obwohl du Daniels Lösung très chic findest und nur den fehlenden ProzRahmen (der auch anders sein könnte) bemängelst, kommst du doch noch mit einer formal gleichartigen Lösung daher, quasi das Fahrrad nochmals erfindend… :-]
Gruß, Luc :-?
AW: Ach, meine allererste gefällt dir wohl nicht, ...
25.06.2021 20:04:14
Yal
Oh je! Jetzt dass Du es erwähnst und ich deinen Beitrag doch ausführlicher lese. Ich hatte mich von den Formeln ablenken lassen (so, so, reine Formel-Lösung).
Mea culpa. Ich gelobe Besserung.
VG
Yal
Na dann iss ja jut! ;-)
26.06.2021 03:14:58
Luc:-?
Solche Fmln kann man übrigens auch per SubProz um OriginalDaten herumlegen, Yal,
zumindest, wenn die Originale nur 1× in der Fml benötigt wdn. Anderenfalls wäre es eher ungünstig, so zu verfahren. Der Vorteil läge auf der Hand: Das Original könnte ggf leicht rekonstruiert wdn und es entsteht kein zusätzlicher (wenn auch temporärer) PlatzBedarf.
Luc :-?
Anzeige
AW: Ach, meine allererste gefällt dir wohl nicht, ...
26.06.2021 13:28:19
Daniel
Das von Luc ist auch eine Formellösung.
Er benutzt aber nicht nur die von Excel bereit gestellten Funktionen, sondern auch welche, die er sich mal als Erweiterungssatz selbst geschrieben hat.
Aber im Prinzip bleibt es eine Formellösung.
Gruß Daniel
AW: Zahlen aus String - etwas anders
28.06.2021 10:00:42
a.bochnig@betonwerk-schuster.de
Hallo an alle,
erst einmal vielen vielen Dank für die Resonanz. Ich habe nun die Lösungen von Daniel und Yal ausprobiert. Daniels funktioniert bei mir leider nicht. Die richtige Stelle sollte ich aber für seinen Code genommen haben. Yal's Lösung tut im Prinzip schon teilweise das was ich möchte, jedoch wird nun die 1. Zeile des sortierten Strings überschrieben. Eine Formellösung ist auch eine schöne Idee, jedoch habe ich 10 solcher Dateien á 36 Blätter zu bearbeiten. Und zu allem Überfluss verstehe ich nicht mal ansatzweise, was Luc da schickes geschrieben hat. :D
Ich habe euch mal eine Beispieldatei erstellt und hoffe, dass ihr euch nochmal der Sache annehmen könnt. Die ersten drei Überschriften habe ich mal händisch eingetragen. Das wäre also das Wunschergebnis. Die Überschriften sind so wie ihr sie dort seht original und können auf weiteren Tabellenblättern in der Reihenfolge auch variieren. Also zuerst die Zahl dann zwei-dreimal Text. Das macht es für mich als Anfänger noch komplizierter. Die Daten darunter habe ich allerdings gelöscht. Datenschutz blabla.
https://www.herber.de/bbs/user/146823.xlsx
Anzeige
AW: Zahlen aus String - etwas anders
28.06.2021 19:17:10
Peter
Hallo Axel,
ich habe mal eine Lösung erarbeitet und sende Dir hier die Datei.
https://www.herber.de/bbs/user/146838.xlsm
Die ersten 10 Zeilen werden für die interne Bearbeitung benötigt und sind in dem Beispiel ausgeblendet; die eigentliche Tabelle beginnt etwas weiter unten.
Bitte mal ausprobieren, Rückmeldung wäre gut.
Mit freundlichem Gruß
Peter Kloßek
AW: Zahlen aus String - etwas anders
28.06.2021 19:25:01
Yal
Hallo Axel,
ja, ich hatte in der Korrektur "K = UBound(Arr)" geschrieben, was auch nicht ganz richtig ist. "k = UBound(Arr) +1" muss es sein.
Dementsprechend: folgende Code funktioniert auf deinem Beispiel:

Sub Trennen()
Dim LetzteSpalte As Long
Dim Erste As Long
Dim C As Long 'Column
Dim Arr, i, j, k
Const cSep = " "
On Error Resume Next
LetzteSpalte = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Column
Erste = Cells(1, 1).End(xlDown).Row
For C = 1 To LetzteSpalte 'BEGINN Spaltenüberschriften separieren
Arr = Split(Cells(Erste, C).Text, cSep)
If UBound(Arr) > -1 Then
j = 1
k = UBound(Arr) + 1
For i = 0 To UBound(Arr)
If IsNumeric(Arr(i)) Then
Cells(j, C) = Trim(Arr(i))
j = j + 1
Else
Cells(k, C) = Trim(Arr(i))
k = k - 1
End If
Next
End If
Next 'ENDE Spaltenüberschriften separieren
End Sub
Dann muss nur noch die Schleife über die 36 Blätter hinzufügen:

Sub Durchlauf()
Dim W As Worksheet
For Each W In ActiveWorkbook.Worksheets
Trennen W
Next
End Sub
Sub Trennen(Blatt As Worksheet)
Dim LetzteSpalte As Long
Dim Erste As Long
Dim C As Long 'Column
Dim Arr, i, j, k
Const cSep = " "
On Error Resume Next
With Blatt
LetzteSpalte = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
Erste = .Cells(1, 1).End(xlDown).Row
For C = 1 To LetzteSpalte 'BEGINN Spaltenüberschriften separieren
Arr = Split(.Cells(Erste, C).Text, cSep)
If UBound(Arr) > -1 Then
j = 1
k = UBound(Arr) + 1
For i = 0 To UBound(Arr)
If IsNumeric(Arr(i)) Then
.Cells(j, C) = Trim(Arr(i))
j = j + 1
Else
.Cells(k, C) = Trim(Arr(i))
k = k - 1
End If
Next
End If
Next 'ENDE Spaltenüberschriften separieren
End With
End Sub
VG
Yal
Anzeige
AW: Zahlen aus String - etwas anders
28.06.2021 19:29:59
Daniel
Hi
"Funktioniert nicht", ist als Fehler Beschreibung ungefähr so aussagekräftig wie "Machs anders" als Hilfe.
kannst du mal genauer zeigen, wie du meinen Ansatz in dein Makro eingebaut hast und auch beschreiben, was da jetzt nicht funktioniert?
am besten lädst du die Datei mal mit Makro hoch.
Gruß Daniel
AW: Zahlen aus String - etwas anders
28.06.2021 19:43:56
Daniel
Also wenn du es brauchst, hier nochmal der ganze Code.
funktioniert hervorragend bei mir.
Warum nicht bei dir?

Sub test()
Dim Spalte As Long
Const strSep As String = " "
Dim strText As String
Dim Texte As String
Dim Zahlen As String
Dim T
For Spalte = 4 To 82
strText = Cells(6, Spalte).Value
strText = Trim(strText)
Zahlen = ""
Texte = ""
For Each T In Split(strText, strSep)
If IsNumeric(T) Then
Zahlen = Zahlen & T & strSep
Else
Texte = Texte & T & strSep
End If
Next
If Zahlen = "" Then Zahlen = strSep
T = Split(Zahlen & Texte, strSep)
Cells(1, Spalte).Resize(UBound(T) + 1, 1).Value = WorksheetFunction.Transpose(T)
Next
End Sub
Gruß Daniel
Anzeige
AW: Zahlen aus String - etwas anders
29.06.2021 06:57:27
a.bochnig@betonwerk-schuster.de
Hallo Daniel, Ja das war ungeschickt beschrieben. Entschuldige bitte. Um es nochmal der Vollständigkeit halber genauer zu beschreiben, es ist gar nichts passiert beim ersten Versuch. Keine Veränderung auf dem Blatt. Jetzt im Zusammenhang funktioniert es einwandfrei. Vielen Dank nochmal. Mir ist dann auch noch eine Idee gekommen und die konnte ich soeben fertigstellen. Da muss man auch erstmal drauf kommen... Ich weiß, ihr ratet immer von dem Select-Befehl ab, aber ich bin immer froh wenns funktioniert. ;) Bitte nicht wundern, dass da jetzt überflüssige Variablen definiert sind. Im Makro passieren noch ein paar Sachen mehr.
Option explicit

Sub spalten ()
Dim i, letzte, lspalte  As Integer
Dim erste, start, anzahl, Zeile, Spalte, letztespalte As Long
Dim strTxt, strText, strSep As String
On Error Resume Next                                                'BEGINN Spaltenüberschriften separieren
strSep = " "
letztespalte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
erste = Cells(1, 1).End(xlDown).Row + 1
For Spalte = 1 To letztespalte
strText = Cells(erste, Spalte).Text
If strText  "" Then
strText = Trim(strText)
Cells(2, Spalte).Value = Trim(Split(strText, strSep)(0))
Cells(3, Spalte).Value = Trim(Split(strText, strSep)(1))
Cells(4, Spalte).Value = Trim(Split(strText, strSep)(2))
Cells(5, Spalte).Value = Trim(Split(strText, strSep)(3))
Range(Cells(1, Spalte), Cells(6, Spalte)).Select
Selection.NumberFormat = "@"
Selection.AutoFilter.Sort
With ActiveSheet.AutoFilter.Sort.SortFields.Clear
End With
ActiveSheet.AutoFilter.Sort. _
SortFields.Add2 Key:=Range(Cells(1, Spalte), Cells(6, Spalte)), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveSheet.AutoFilter.Sort
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Selection.AutoFilter.Sort
End If
Next                                                              'ENDE Spaltenüberschriften separieren
End Sub
Die anderen teste ich auch gleich noch.
Habt nochmal alle vielen Dank. Das Problem ist definitiv gelöst.
Anzeige
AW: Zahlen aus String - etwas anders
29.06.2021 06:57:44
Axel
Hallo Daniel, Ja das war ungeschickt beschrieben. Entschuldige bitte. Um es nochmal der Vollständigkeit halber genauer zu beschreiben, es ist gar nichts passiert beim ersten Versuch. Keine Veränderung auf dem Blatt. Jetzt im Zusammenhang funktioniert es einwandfrei. Vielen Dank nochmal. Mir ist dann auch noch eine Idee gekommen und die konnte ich soeben fertigstellen. Da muss man auch erstmal drauf kommen... Ich weiß, ihr ratet immer von dem Select-Befehl ab, aber ich bin immer froh wenns funktioniert. ;) Bitte nicht wundern, dass da jetzt überflüssige Variablen definiert sind. Im Makro passieren noch ein paar Sachen mehr.
Option explicit

Sub spalten ()
Dim i, letzte, lspalte  As Integer
Dim erste, start, anzahl, Zeile, Spalte, letztespalte As Long
Dim strTxt, strText, strSep As String
On Error Resume Next                                                'BEGINN Spaltenüberschriften separieren
strSep = " "
letztespalte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
erste = Cells(1, 1).End(xlDown).Row + 1
For Spalte = 1 To letztespalte
strText = Cells(erste, Spalte).Text
If strText  "" Then
strText = Trim(strText)
Cells(2, Spalte).Value = Trim(Split(strText, strSep)(0))
Cells(3, Spalte).Value = Trim(Split(strText, strSep)(1))
Cells(4, Spalte).Value = Trim(Split(strText, strSep)(2))
Cells(5, Spalte).Value = Trim(Split(strText, strSep)(3))
Range(Cells(1, Spalte), Cells(6, Spalte)).Select
Selection.NumberFormat = "@"
Selection.AutoFilter.Sort
With ActiveSheet.AutoFilter.Sort.SortFields.Clear
End With
ActiveSheet.AutoFilter.Sort. _
SortFields.Add2 Key:=Range(Cells(1, Spalte), Cells(6, Spalte)), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveSheet.AutoFilter.Sort
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Selection.AutoFilter.Sort
End If
Next                                                              'ENDE Spaltenüberschriften separieren
End Sub
Die anderen teste ich auch gleich noch.
Habt nochmal alle vielen Dank. Das Problem ist definitiv gelöst.
Anzeige
AW: Zahlen aus String - etwas anders
29.06.2021 07:05:33
Axel
@Peter: Funktioniert 1A. Ich benötige die Daten zwar ab Zeile 1, aber das hätte ich sicherlich noch hinbekommen. Soweit reicht mein VBA in der Regel gerade so aus. ;)
@Yal: Deins klappt auch wunderbar. Jetzt hab ich die Qual der Wahl.
AW: Zahlen aus String - etwas anders
30.06.2021 21:17:18
Peter
Hallo Axel,
vielen Dank für Deine freundliche Antwort. Ich nahm dies zum Anlass, über meine Lösung noch einmal nachzudenken. Wie sieht es bei der anderen Lösung aus mit der Konstellation, dass die Ziffernfolge am Anfang steht? Oder, was passiert, wenn nur 1 Alpha-Begriff erscheint oder mehr als 2? In meiner bisherigen Lösung waren nur 2 Wörter (mit Buchstaben) vorgesehen. Jetzt habe ich noch eine Lösung, bei der mit Zeile 1 begonnen wird. Zur Bearbeitung werden jedoch 2 Zeilen eingefügt, die zum Schluss wieder gelöscht werden. Es können jetzt 1 bis 4 Alpha-Begriffe verwendet werden. Hier die neue Lösung:
https://www.herber.de/bbs/user/146890.xlsm
Noch ein Hinweis: Bitte nach erfolgtem Test immer erst die Zeilen löschen, und erst dann neu testen.
Mit freundlichem Gruß
Peter Kloßek
Anzeige
AW: Zahlen aus String - etwas anders
01.07.2021 06:45:47
Axel
Hallo Peter,
ja so soll es sein. Gefällt mir wirklich gut. Danke für deinen Einsatz. :)

38 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige