Ich brauche Eure Hilfe mit dem Sortieren von Zahlen in Textfeldern mit
unterschiedlichem format!
Also ein Beispiel:
1
5.1
1.2
10.2.1
1.2.3
2
2.1.5
3
3.2.1.1
3.3.1.1.1
Und so sollte es sortiert werden:
1
1.2
1.2.3
2
2.1.5
3
3.2.1.1
3.3.1.1.1
5.1
10.2.1
Ich kann die ja nicht einfach zu Zahlen formatieren, weil dann aus 10.6.1
eine Zahl 37052 wird :-(
Wie könnte man das lösen? Geht das nur per VB?
Vielen Dank
Gruss Marco
Am Wed, 17 Sep 2008 16:06:08 +0200 schrieb Marco:
> Ich brauche Eure Hilfe mit dem Sortieren von Zahlen in Textfeldern mit
> unterschiedlichem format!
>
> Also ein Beispiel:
>
> 1
> 5.1
> 1.2
> 10.2.1
> 1.2.3
> 2
> 2.1.5
> 3
> 3.2.1.1
> 3.3.1.1.1
das folgende Makro schreibt dir in die Zelle rechts daneben eine Zahl.
Du kannst dann nach dieser Hilfsspalte aufsteigend sortieren (Bereich
musst du noch anpassen und eventuell neben deinem Bereich eine neue
leere Spalte einfügen. Funktioniert auch nur für 5 Gliederungsebenen,
wie in deinem Beispiel.):
Sub Sortierspalte()
Dim rngZelle As Range
Dim intLänge As Integer
Dim i As Integer
Dim myarr As Variant
'Hier Bereich anpassen
For Each rngZelle In Range("A2:A11")
intLänge = Len(rngZelle) - Len(WorksheetFunction _
.Substitute(rngZelle, ".", ""))
Select Case intLänge
Case 0
rngZelle.Offset(0, 1) = rngZelle * 10 ^ 4
Case 1
ReDim myarr(intLänge)
myarr = Split(rngZelle, ".")
rngZelle.Offset(0, 1) = myarr(0) * 10 ^ 4 + myarr(1) * 10 ^
3
Case 2
ReDim myarr(intLänge)
myarr = Split(rngZelle, ".")
rngZelle.Offset(0, 1) = myarr(0) * 10 ^ 4 + myarr(1) * 10 ^ 3 _
+ myarr(2) * 10 ^ 2
Case 3
ReDim myarr(intLänge)
myarr = Split(rngZelle, ".")
rngZelle.Offset(0, 1) = myarr(0) * 10 ^ 4 + myarr(1) * 10 ^ 3 _
+ myarr(2) * 10 ^ 2 + myarr(3) * 10 ^ 1
Case 4
ReDim myarr(intLänge)
myarr = Split(rngZelle, ".")
rngZelle.Offset(0, 1) = myarr(0) * 10 ^ 4 + myarr(1) * 10 ^ 3 _
+ myarr(2) * 10 ^ 2 + myarr(3) * 10 ^ 1 + myarr(4)
End Select
Next
End Sub
Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP2 / Vista Ultimate
Office 2003 SP2 / 2007 Ultimate
Vielen Dank für die schnelle Hilfe!
Leider erhalte ich noch eine Fehlermeldung "Laufzeitfehler 13 Typen
unverträglich" und der VB Debuger markiert mir folgenden Bereich im Case 2:
rngZelle.Offset(0, 1) = myarr(0) * 10 ^ 4 + myarr(1) * 10 ^ 3 _
+ myarr(2) * 10 ^ 2
Er füllt die Spalte B aber trotzdem ab mit einer 5 stelligen Zahl, aber die
Sortierung stimmt auch mit Hilfe dieser Zahlen nicht, aber das wird wohl an
dem Formelfehler liegen, der die Funktion im Case 2 stoppt.
Gruss Marco
Ok, mein Fehler, da war ein Wert mit 6.6. erfasst, also noch ein Punkt ohne
folgende Zahl!
Wert gelöscht und nun läuft der Code durch :-)
Aber die Sortierreihen folge stimmt leider noch nicht.
Ich erhalte nun folgendes Resultat:
Ursprungswert - Sortierwert
1 - 10000
1.1 - 11000
1.2 - 12000
1.3 - 13000
2 - 20000
2.1 - 21000
2.2 - 22000
2.3 - 23000
3.6 - 36000
3.7 - 37000
3.7.1 - 37100
3.7.2 - 37200
3.7.2.1 - 37210
3.7.2.2 - 37220
3.7.2.3 - 37230
3.7.2.4 - 37240
3.7.2.5 - 37250
3.7.2.7 - 37270
3.7.2.8 - 37280
3.7.2.9 - 37290
3.7.3 - 37300
bis hier alles ok :-)
3.7.2.10 - 37300 <-- müsste weiter oben sein
3.7.2.11 - 37310 <-- müsste weiter oben sein
3.7.4 - 37400
3.7.5 - 37500
3.7.7 - 37700
3.7.8 - 37800
3.7.9 - 37900
3.8 - 38000
3.7.10 - 38000 <-- müsste weiter oben sein
3.8.1 - 38100
Hoffentlich kriegen wir das noch hin, das wäre Hammer wenn das funktionieren
würde :-)
Vielen Dank schon einmal für Deine Hilfe!
Gruss Marco
On 18 Sep., 09:08, "Marco" <n...@spam.com> wrote:
>
> Aber die Sortierreihen folge stimmt leider noch nicht.
>
> Ursprungswert - Sortierwert
>
> 1 - 10000
> 1.1 - 11000
> 1.2 - 12000
> 1.3 - 13000
> 2 - 20000
> 2.1 - 21000
> 2.2 - 22000
> 2.3 - 23000
> 3.6 - 36000
> 3.7 - 37000
> 3.7.1 - 37100
> 3.7.2 - 37200
> 3.7.2.1 - 37210
> 3.7.2.2 - 37220
> 3.7.2.3 - 37230
> 3.7.2.4 - 37240
> 3.7.2.5 - 37250
> 3.7.2.7 - 37270
> 3.7.2.8 - 37280
> 3.7.2.9 - 37290
> 3.7.3 - 37300
>
> bis hier alles ok :-)
Du könntest das auch mit einer Funktion lösen, die dir einen Sort-
Index erstellt.
Die folgenden Zeilen tun dies für standarmässig 3-stellige Werte
zwischen den Punkten, bei Bedarf einfach den 3.Parameter anpassen:
Public Function Sort_Index(rngZelle As Range, strTrenner As String,
Optional intLen As Integer = 3) As String
Dim A As Variant
Dim intI As Integer
Dim strLen As String
For intI = 1 To intLen
strLen = strLen & "0"
Next intI
A = VBA.Split(rngZelle.Text, strTrenner)
For intI = 0 To UBound(A)
Sort_Index = Sort_Index & Format(A(intI), strLen)
Next intI
End Function
In der Zelle rufst Du die Funktion dann wie folgt auf:
=Sort_Index(A1;".")
oder für mehr Stellen:
=Sort_Index(A1;".";5)
Nach dieser Spalte kannst Du dann sortieren (lassen).
--
Mit freundlichen Grüssen
Thomas Ramel
- MVP für MS-Excel -
Hi Thomas
Hurra, damit funktionert es einwandfrei :-)
Vielen Dank allen für die Hilfestellung!!!
Gruss Marco