Supportnet / Forum / Tabellenkalkulation
Excel/Access: Sortierung mehrstelliger Zahlen im Text
Frage
Hallo Forumianer, ich habe folgende Aufgabe zu lösen: Sortierung von Textzellen, die Zahlenwerte beinhalten
z. B.
Lampe 50W
Lampe 100W
Lampe 2000W
Wie kann ich diese Spalte über Filter/Autofilter/VBA-Code sortieren, dass die Reihenfolge sinnvoll ist - also so wie dargestellt? Jede mir bekannte Sortierung sortierte die Zahlenwerte "xyW" jeweils innerhalb der Stellenanzahl der Zahlen (erst die zweistelligen, dann die dreistelligen etc.)?
Für eine Rückmeldung und Tipps vielen Dank!
Antwort 1 von nighty
hi all :)
ein beispiel :)
gruss nighty
Option Explicit
Sub sortieren()
Dim zaehler1 As Long
Dim zaehler2 As Integer
Dim Text As String
For zaehler1 = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Text = Cells(zaehler1, 1).Value
For zaehler2 = 2 To Len(Text)
If Not IsNumeric(Mid$(Text, zaehler2, 1)) Then
Cells(zaehler1, 2).Value = Mid$(Text, zaehler2, 1)
Exit For
End If
Next zaehler2
Next zaehler1
Columns("A").Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
ein beispiel :)
gruss nighty
Option Explicit
Sub sortieren()
Dim zaehler1 As Long
Dim zaehler2 As Integer
Dim Text As String
For zaehler1 = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Text = Cells(zaehler1, 1).Value
For zaehler2 = 2 To Len(Text)
If Not IsNumeric(Mid$(Text, zaehler2, 1)) Then
Cells(zaehler1, 2).Value = Mid$(Text, zaehler2, 1)
Exit For
End If
Next zaehler2
Next zaehler1
Columns("A").Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Antwort 2 von Geo
Hey, traumhaft! Ich bin erfreut und nahezu restlos begeistert, dass 1. so rasch, und 2. so kompetent eine Lösung ans Tageslicht kommt!
1000 Dank an Nighty!
Der Code laeuft gut, führt allerdings noch nicht zum gewünschten Ergebnis:
1) Sortierung: Es gibt eine Sortierung, doch kann ich bei bestem Willen ihre Regel nicht definieren.
So wird aus:
Lampe 100W
Lampe 50W
Lampe 10W
Lampe 120W
Lampe 1W
Lampe 5000W
Lampe 40W
folgende Reihenfolge:
Lampe 50W
Lampe 5000W
Lampe 40W
Lampe 1W
Lampe 120W
Lampe 10W
Lampe 100W
Ich probierte ein sort by, allerdings wird dann wieder alles vermischt. Also eine Unterabfrage?
Oder wie könnte man erreichen, dass erstens alles in sich, und zweitens jeweils in sinnvoller Sortierung (alphanumerisch) angeordnet wird?
Zur Klarheit, das sollte der Code machen:
Lampe 1W
Lampe 10W
Lampe 40W
Lampe 50W
Lampe 100W
Lampe 120W
Lampe 5000W
2) Warum wird in der nebenstehenden Spalte ein Kleinbuchstabe pro Eintrag erzeugt? Könnte dies verhindert werden? :-?
Ich würd´ mich tierisch nochmal über ein Feedback freuen!
Nachtgruß v. Geo
1000 Dank an Nighty!
Der Code laeuft gut, führt allerdings noch nicht zum gewünschten Ergebnis:
1) Sortierung: Es gibt eine Sortierung, doch kann ich bei bestem Willen ihre Regel nicht definieren.
So wird aus:
Lampe 100W
Lampe 50W
Lampe 10W
Lampe 120W
Lampe 1W
Lampe 5000W
Lampe 40W
folgende Reihenfolge:
Lampe 50W
Lampe 5000W
Lampe 40W
Lampe 1W
Lampe 120W
Lampe 10W
Lampe 100W
Ich probierte ein sort by, allerdings wird dann wieder alles vermischt. Also eine Unterabfrage?
Oder wie könnte man erreichen, dass erstens alles in sich, und zweitens jeweils in sinnvoller Sortierung (alphanumerisch) angeordnet wird?
Zur Klarheit, das sollte der Code machen:
Lampe 1W
Lampe 10W
Lampe 40W
Lampe 50W
Lampe 100W
Lampe 120W
Lampe 5000W
2) Warum wird in der nebenstehenden Spalte ein Kleinbuchstabe pro Eintrag erzeugt? Könnte dies verhindert werden? :-?
Ich würd´ mich tierisch nochmal über ein Feedback freuen!
Nachtgruß v. Geo
Antwort 3 von nighty
hi Geo :)
stimmt war mal wieder in eile,sonntag mach ich fertig
gruss nighty
stimmt war mal wieder in eile,sonntag mach ich fertig
gruss nighty
Antwort 4 von nighty
hi all :)
diesmal gestestet,ist zwar noch net das non plus ultra aber geht schon mal :)
ich bruete nochmal darueber um es zu verkuerzen bzw zu beschleunigen :))
gruss nighty
Option Explicit
Sub sortieren()
Dim zaehler1 As Long
For zaehler1 = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(zaehler1, 1) = Val(Mid$(Cells(zaehler1, 1), 7, Len(Cells(zaehler1, 1)) - 7))
Next zaehler1
Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For zaehler1 = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(zaehler1, 1) = "Lampe " & CStr(Cells(zaehler1, 1)) & "W"
Next zaehler1
End Sub
diesmal gestestet,ist zwar noch net das non plus ultra aber geht schon mal :)
ich bruete nochmal darueber um es zu verkuerzen bzw zu beschleunigen :))
gruss nighty
Option Explicit
Sub sortieren()
Dim zaehler1 As Long
For zaehler1 = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(zaehler1, 1) = Val(Mid$(Cells(zaehler1, 1), 7, Len(Cells(zaehler1, 1)) - 7))
Next zaehler1
Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For zaehler1 = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(zaehler1, 1) = "Lampe " & CStr(Cells(zaehler1, 1)) & "W"
Next zaehler1
End Sub
Antwort 5 von nighty
hi Geo :)
werd die woche noch was basteln um artikel unanhaengig zu sein, mit richtiger erfassung der zahl, ein dreidimensionales array erstellen,sortieren ,ueber das array neu zusammensetzen.
das es ein bisl hand und fuss hat :))
gruss nighty
werd die woche noch was basteln um artikel unanhaengig zu sein, mit richtiger erfassung der zahl, ein dreidimensionales array erstellen,sortieren ,ueber das array neu zusammensetzen.
das es ein bisl hand und fuss hat :))
gruss nighty
Antwort 6 von Geo
heyhey nighty, du bist ja des wahnsinns!
so prompt und so fit: merci beaucoup!
jetzt sieht´s gleich viel besser aus und mir ist klar, warum die coderei für mich ihre mindestens sieben siegel hat! :-)
dein code funktioniert bestens, wenngleich - was du zum teil ja ohnehin schon weisst - ein bisserl was noch suboptimal ist:
1. artikelunabhaengig: es gibt ja nicht nur lampen sondern auch leuchten, sommerreifen oder espressotassen usw.
2. leider gibt´s auch - grrrr, ich trau mich gar nicht es zu sagen: "lampen für autos", "leuchte grün" - also mit text naeher bezeichnete artikel.... soll heißen: die differenzierung in zaehler1 (text) und zaehler (zahl+einheit) - wie du es im ersten code machtest - müsste beibehalten werden: oder was haelst du von einer bedingten sortierungsschleife?
3. bitte erschlage mich jetzt nicht, doch kommt´s noch viel, viel schlimmer: es folgen auf die o.a. technische angabe noch weitere informationen (auch technischer art wie z. b. "220v", allerdings auch rein textliche z. b. "oberteil" oder "mit gelber fassung") - haenge ich diese attribute an die quelldaten und führe deinen code aus...naja, du weisst es eh: alles verschwindet. deshalb...wie könnten wir diese infos behalten? - ach nein, sortiert sollten sie nicht auch noch werden :-)
hey, nighty, wenn du das hinbekommst, hast du dir einen preis verdient! ich googelte, codete, studierte gestern 6 stunden, und fand keine lösung - im www nur manche gleiche lösungsgesuche! also wem auch immer das gelingt, wird in die hall of vba-fame aufgenommen!
ich grüble (weil ich die lösung asap brauche) derzeit, ob und wie eine hintergründliche (nicht sichtbare) zellenaufteilung in einzelemente, die jeweils im eigenen format sortiert werden, realisierbar waere. was haelst du von der idee?
übrigens noch zur inormation: die zellenstruktur und die zelleninhalte sind nicht auf meinen mist gewachsen - ich muss mich nur nun damit herumaergern...allerdings ist absolut ausgeschlossen - was vernünftig und eigentlich notwendig waere, die zelleninhalte neu zu gestalten: wir reden naemlich von rd. 200.000 datensaetzen...
ich hoffe, ich hab dich jetzt nicht geschockt und dir deine laune (und super hilfsbereitschaft) verdorben...
es waere super, wenn du dich nochmal meldest und dein dreidimensionales array oder was auch immer :-) uns zeigst - wie gesagt: das problem gibt´s haeufig und offenbar aber keine lösung...
schönen sonntag, lieben gruss! :-)
so prompt und so fit: merci beaucoup!
jetzt sieht´s gleich viel besser aus und mir ist klar, warum die coderei für mich ihre mindestens sieben siegel hat! :-)
dein code funktioniert bestens, wenngleich - was du zum teil ja ohnehin schon weisst - ein bisserl was noch suboptimal ist:
1. artikelunabhaengig: es gibt ja nicht nur lampen sondern auch leuchten, sommerreifen oder espressotassen usw.
2. leider gibt´s auch - grrrr, ich trau mich gar nicht es zu sagen: "lampen für autos", "leuchte grün" - also mit text naeher bezeichnete artikel.... soll heißen: die differenzierung in zaehler1 (text) und zaehler (zahl+einheit) - wie du es im ersten code machtest - müsste beibehalten werden: oder was haelst du von einer bedingten sortierungsschleife?
3. bitte erschlage mich jetzt nicht, doch kommt´s noch viel, viel schlimmer: es folgen auf die o.a. technische angabe noch weitere informationen (auch technischer art wie z. b. "220v", allerdings auch rein textliche z. b. "oberteil" oder "mit gelber fassung") - haenge ich diese attribute an die quelldaten und führe deinen code aus...naja, du weisst es eh: alles verschwindet. deshalb...wie könnten wir diese infos behalten? - ach nein, sortiert sollten sie nicht auch noch werden :-)
hey, nighty, wenn du das hinbekommst, hast du dir einen preis verdient! ich googelte, codete, studierte gestern 6 stunden, und fand keine lösung - im www nur manche gleiche lösungsgesuche! also wem auch immer das gelingt, wird in die hall of vba-fame aufgenommen!
ich grüble (weil ich die lösung asap brauche) derzeit, ob und wie eine hintergründliche (nicht sichtbare) zellenaufteilung in einzelemente, die jeweils im eigenen format sortiert werden, realisierbar waere. was haelst du von der idee?
übrigens noch zur inormation: die zellenstruktur und die zelleninhalte sind nicht auf meinen mist gewachsen - ich muss mich nur nun damit herumaergern...allerdings ist absolut ausgeschlossen - was vernünftig und eigentlich notwendig waere, die zelleninhalte neu zu gestalten: wir reden naemlich von rd. 200.000 datensaetzen...
ich hoffe, ich hab dich jetzt nicht geschockt und dir deine laune (und super hilfsbereitschaft) verdorben...
es waere super, wenn du dich nochmal meldest und dein dreidimensionales array oder was auch immer :-) uns zeigst - wie gesagt: das problem gibt´s haeufig und offenbar aber keine lösung...
schönen sonntag, lieben gruss! :-)
Antwort 7 von ErichG
Hi zusammen,
das Problem ist auch Thema in Herbers Excel-Forum.
Dort steht eine mögliche Lösung:
http://www.herber.de/forum/archiv/776to780/t776290.htm#776763
(Ich schreibe dies, um evtl. unnötige Doppelarbeit verhindern zu helfen...)
Grüße von Erich aus Kamp-Lintfort
das Problem ist auch Thema in Herbers Excel-Forum.
Dort steht eine mögliche Lösung:
http://www.herber.de/forum/archiv/776to780/t776290.htm#776763
(Ich schreibe dies, um evtl. unnötige Doppelarbeit verhindern zu helfen...)
Grüße von Erich aus Kamp-Lintfort
Antwort 8 von Geo
Ich kann mich Erich nur anschließen, allerdings nicht nur, um Doppelarbeit zu ersparen:
Dieser Erich aus Kamp-Lintfort ist ein Held:
Sein Lösungsvorschlag http://www.herber.de/forum/archiv/776to780/t776290.htm#776763 funktioniert astrein...
So bin ich grenzenlos begeistert,
und danke Allen (v.a. auch Nighty), die sich Gedanken um mein Sortierproblem gemacht haben!
Viele Grüße
und ich hoffe, man liest sich wieder
George
Dieser Erich aus Kamp-Lintfort ist ein Held:
Sein Lösungsvorschlag http://www.herber.de/forum/archiv/776to780/t776290.htm#776763 funktioniert astrein...
So bin ich grenzenlos begeistert,
und danke Allen (v.a. auch Nighty), die sich Gedanken um mein Sortierproblem gemacht haben!
Viele Grüße
und ich hoffe, man liest sich wieder
George
Antwort 9 von nighty
hi alle :)
gut ding will weile haben :(
hab ja nun auch was gemacht brauch es ja nun nicht fort setzen wie es aussieht ,wollte meine function einsetzen und die drei glieder einem array uebergeben.
hier die function schonmal
parameter= ob erste zweite oder dritte usw. zahl,
die isoliert werden soll.
Rem beispiel :)
Rem A1=michael123telefon456huhu7,11ende
Rem B1=Sumtext(A1,1)=123
Rem B2=Sumtext(A1,2)=456
Rem B3=Sumtext(A1,3)=7,11
Rem usw. nach bedarf :))
Function Sumtext(Zellen As Range, zaehler1 As Integer) As String
Dim Zelle As Range
Dim zeich1 As Integer
Dim schalter As Boolean
Dim zaehler3 As Integer
ReDim zaehler2(Len([Zellen])) As String
zaehler3 = 1
Application.Volatile
If zaehler1 > Len([Zellen]) Then zaehler1 = Len([Zellen])
For zeich1 = 1 To Len([Zellen])
If Mid([Zellen], zeich1, 1) Like "[0-9,]" = True Then
zaehler2(zaehler3) = zaehler2(zaehler3) & Mid([Zellen], zeich1, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], zeich1, 1) Like "[0-9,]" = False Then
zaehler3 = zaehler3 + 1
schalter = False
End If
Next zeich1
Sumtext = zaehler2(zaehler1)
End Function
gut ding will weile haben :(
hab ja nun auch was gemacht brauch es ja nun nicht fort setzen wie es aussieht ,wollte meine function einsetzen und die drei glieder einem array uebergeben.
hier die function schonmal
parameter= ob erste zweite oder dritte usw. zahl,
die isoliert werden soll.
Rem beispiel :)
Rem A1=michael123telefon456huhu7,11ende
Rem B1=Sumtext(A1,1)=123
Rem B2=Sumtext(A1,2)=456
Rem B3=Sumtext(A1,3)=7,11
Rem usw. nach bedarf :))
Function Sumtext(Zellen As Range, zaehler1 As Integer) As String
Dim Zelle As Range
Dim zeich1 As Integer
Dim schalter As Boolean
Dim zaehler3 As Integer
ReDim zaehler2(Len([Zellen])) As String
zaehler3 = 1
Application.Volatile
If zaehler1 > Len([Zellen]) Then zaehler1 = Len([Zellen])
For zeich1 = 1 To Len([Zellen])
If Mid([Zellen], zeich1, 1) Like "[0-9,]" = True Then
zaehler2(zaehler3) = zaehler2(zaehler3) & Mid([Zellen], zeich1, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], zeich1, 1) Like "[0-9,]" = False Then
zaehler3 = zaehler3 + 1
schalter = False
End If
Next zeich1
Sumtext = zaehler2(zaehler1)
End Function

