Zahlen aus einer Zelle sortieren?

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Zahlen aus einer Zelle sortieren?
von: Janosch J.
Geschrieben am: 12.11.2015 11:39:30

Guten Tag miteinander,
ich stehe grade vor dem Problem, dass ich recht viele Zellen mit Inhalten wie zB. diesem hier habe: 391 153 40 347 16 3 456 382 365 441 412
Ich brauche diese Zahlen aber in aufsteigender Form (in der gleichen Zelle).
Ich habe mir einen Workaround ausgedacht, der allerdings ziermlich umständlich ist:
Ich nutze die "Text in Spalten" funktion, kopiere dann diese Spalten um die Inhalte dann in transponierter Form wieder an eine leere Stelle zu kopieren. Dann sortiere ich diesen Bereich aufsteigend und kopiere die sortierten Zahlen in ein Worddokument um entsprechende Umbrüche durch Leerzeichen zu ersetzen.
Ich nehme an, dass das reichlich umständlich ist. Aber nach etwas googlen und überlegen kommt mir keine bessere Idee.
Hat von euch Fachleuten vielleicht jemand eine Idee geschweige denn die Lösung?
Schöne Grüße
Jolonosch

Bild

Betrifft: AW: Zahlen aus einer Zelle sortieren?
von: MCO
Geschrieben am: 12.11.2015 12:35:49
Hallo!
Ich hab dir mal eine Funktion gebaut, die die Aufgabe erledigt.
Du gehst auf die Zelle die sortiert werden soll, rechte Maustaste, erster Eintrag.
Im Grunde mache ich das, was du auch schon gemacht hast, jedoch automatisch.
Viel Erfolg!
https://www.herber.de/bbs/user/101456.xlsm
Gruß, MCO

Bild

Betrifft: AW: Zahlen aus einer Zelle sortieren?
von: Janosch J.
Geschrieben am: 12.11.2015 12:50:56
Top! Vielen Dank MCO!
Das vereinfacht das ganze schon ungemein!
Wäre es kompliziert, dass auf mehrere Zellen in einer Spalte anzuwenden?

Bild

Betrifft: Anwendung auf alle gewählten Zellen bzw Bereich
von: MCO
Geschrieben am: 12.11.2015 13:13:39
Hi!
Tausche den Code aus:

Public Function Inhalt_sortieren()
    Dim rng As Variant
    Dim x As Single
    Dim zahlen As Range, bereich As Range
    Dim txt As String
    
    For Each cl In Selection
        rng = Split(Trim(Replace(cl.Value, "  ", " ")))
        txt = ""
        For x = 0 To UBound(rng)
            Cells(cl.Row, Columns.Count - x) = rng(x)
        Next x
        
        Set zahlen = Cells(cl.Row, Columns.Count).CurrentRegion
        
        For x = 0 To UBound(rng)
            txt = txt & " " & WorksheetFunction.Small(zahlen, x + 1)
        Next x
        
        zahlen.ClearContents
        cl.Value = Trim(txt)
    Next cl
    
    Set zahlen = Nothing
End Function
Der gilt jetzt für alle gewählten Zellen, egal ob eine oder mehrere. Vorraussetzung ist der Inhalt, sonst läuft der Code auf Fehler.
Habe auch noch eingebaut, dass mehrere Leerzeichen ignoriert werden, außerdem führende und folgende Leerzeichen.
Wenn der Bereich immer der gleiche ist, kannst du die Zeile am Anfange der Schleife durch diese austauschen:
    For Each cl In Range("D2:D1000").SpecialCells(xlCellTypeConstants)

Das heißt z.B. jede zelle im Bereich D2 bis D1000, in denen Konstanten stehen.
(wie zu Fuss: spalte D markieren, F5, Inhalte..., Konstanten)
Gruß, MCO

Bild

Betrifft: AW: Zahlen aus einer Zelle sortieren?
von: fcs
Geschrieben am: 12.11.2015 12:57:40
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_high2)
        While (VA_array(V_Low2) < V_val1 And _
                V_Low2 < V_high1)
            V_Low2 = V_Low2 + 1
        Wend
        While (VA_array(V_high2) > V_val1 And _
              V_high2 > V_Low1)
            V_high2 = V_high2 - 1
        Wend
        If (V_Low2 <= V_high2) Then
            V_val2 = VA_array(V_Low2)
            VA_array(V_Low2) = VA_array(V_high2)
            VA_array(V_high2) = V_val2
            V_Low2 = V_Low2 + 1
            V_high2 = V_high2 - 1
        End If
    Wend
    If (V_high2 > V_Low1) Then Call QuickSort(VA_array, V_Low1, V_high2)
    
    If (V_Low2 < V_high1) Then Call QuickSort(VA_array, V_Low2, V_high1)
End Sub


 Bild

Beiträge aus den Excel-Beispielen zum Thema "Zahlen aus einer Zelle sortieren?"