AW: Zahlen aus einer Zelle sortieren?
12.11.2015 12:57:40
fcs
Hallo Janosch,
hier eine benutzerdefinierte VBA-Funktion, die du wie eine normale Tabellenfunktion nutzen kannst.
Wenn du direkt die Zellinhalte umwandeln willst, dann die Zellen markieren und Makro prcZellinhalSortieren starten
Gruß
Franz
'Code in einem allgemeinen Modul der Datei
Option Explicit
Sub prcZellinhaltSortieren()
If MsgBox("Inhalte in den selektierten Zellen am Leerzeichen splitten und Inhalt sortieren", _
_
vbOKCancel, "Makro: prcZellinhaltSortieren") = vbCancel Then Exit Sub
Dim Zelle As Range
Application.ScreenUpdating = False
For Each Zelle In Selection
If Trim(Zelle.Text) "" Then
Zelle.Value = fncSortieren(sText:=Zelle.Text, sTrennzeichen:=" ")
End If
Next
Application.ScreenUpdating = True
End Sub
Public Function fncSortieren(sText As String, sTrennzeichen As String)
'Teilt die texte am Trennzeichen, Sortiert aufsteigend und gibt sortierte Zahlenfolge zurück
'Formelbeispiel in Tabellenzelle: =fncSortieren(A2;" ")
Dim arrText As Variant, intK As Integer
Dim arrZahl()
If Trim(sText) = "" Then fncSortieren = "": Exit Function
arrText = VBA.Split(sText, sTrennzeichen)
ReDim arrZahl(LBound(arrText) To UBound(arrText))
For intK = LBound(arrText) To UBound(arrText)
If IsNumeric(arrText(intK)) Then
arrZahl(intK) = CLng(arrText(intK))
Else
arrZahl(intK) = arrText(intK)
End If
Next
If LBound(arrText) = UBound(arrText) Then
fncSortieren = sText
Else
Call QuickSort(arrZahl)
fncSortieren = VBA.Join(arrZahl, sTrennzeichen)
End If
End Function
'Quicksort hier stibitzt: https://www.herber.de/forum/archiv/108to112/109556_Alphabetisch_sortieren_mit_QuickSort.html#109556
Public Sub QuickSort(ByRef VA_array, Optional V_Low1, Optional V_high1)
On Error Resume Next
Dim V_Low2, V_high2, V_loop As Integer
Dim V_val1, V_val2 As Variant
If IsMissing(V_Low1) Then
V_Low1 = LBound(VA_array, 1)
End If
If IsMissing(V_high1) Then
V_high1 = UBound(VA_array, 1)
End If
V_Low2 = V_Low1
V_high2 = V_high1
V_val1 = VA_array((V_Low1 + V_high1) / 2)
While (V_Low2 V_val1 And _
V_high2 > V_Low1)
V_high2 = V_high2 - 1
Wend
If (V_Low2 V_Low1) Then Call QuickSort(VA_array, V_Low1, V_high2)
If (V_Low2