Excel Makro Sortieren auch von neuen Einträgen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Nur mal eine schnelle Idee:

Vergib für die Listen jeweils einen Namen.
Dann gib im Makro statt der festen Range den Namen an.
Beim Zellen einfügen wird der Bereich des Namens dann automatisch erweitert.
Das automatische aktualisieren der Liste könnte über ein Ereignismakro:
Private Sub Worksheet_Change(ByVal Target As Range)
erreicht werden.

P.S.: Ich schau mir das späte nochmal genauer an.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)
Oubyi, UserMod Light  19.09.2022, 15:33

Markiere mal H6:H14 und gib in das Namensfels (Links oben in der Ecke, über 1,2,3 und links von A,B,C "Liste1" ein.
Zum überprüfen markiere irgendeine andere Zelle und wähle dann aus dem Feld oben per Dropdown "Liste1" aus oder gib es ein, dann sollte die Liste markiert sein. Wenn Du jetzt Zellen einfügst, wird die erweiterte Liste angezeigt.

Jetzt ersetze mal das "H4:H14" überall in Deinem Makro durch "Liste1".
Teste das, dann sehen wir weiter.

0

Du müsstest im Makro zunächst dynamisch die Länge der Liste ermitteln, z.B. indem du nach der nächsten Überschrift suchst (hier "Liste 2"), deren Zeilennummer ermitteln, davon 1 substrahieren und damit die Auswahl (vonhbis Zeile) anpassen, bevor die Sortierung ausgeführt wird.

Die anderen Kollegen hier haben ja schon Anregungen gegeben, wie man es lösen kann.
ABER wenn die Listen auf die Weise immer länger werden ist es irgendwann auch nicht mehr übersichtlich.
Besser wäre es aufzuräumen, das Excel native Bordmittel wir AutoFilter oder Pivot die nötigen hübschen Ansichten liefern. und zwar für immer ohne Makro.

Gar nicht oder naja, es würde theoretisch Wege geben mit Formatierungserkennung etc., aber ich glaube ohne zu bezahlen kannst du vergessen, dass dir das jemand macht.

Du kannst die Zeilen selbst definieren, das wäre die einfachste Lösung.

Also z.B. neben die 1. und letzte Zelle schreibst du =ZEILE(Wähle hier die 1. Zelle aus). Ist das z.B. in B13 und verweist auf A13, dann verschiebt es sich auf B14/Auswahl auf A14 und du kannst den Wert 14 auslesen.

Eine andere Option wäre die Spalte zu durchlaufen, bei den Listen-Namen zu stoppen (bzw. 1 weiter zu gehen, da du ja nicht den Namen mit filtern möchtest) und dann

Range(Selection, Selection.End(xlDown)).Select

einzugeben. Das bringt dich auf den untersten Wert, funktioniert aber nur mit leerer Zeile zwischen den Listen, sonst geht er ans Ende der letzten Liste.

Damit sind alle betroffenen Zeilen markiert und du kannst deine Sortierung machen.

Habe mal was faules zusammengebaut. Du musst halt entsprechend die richtigen Zellen ersetzen.

Sub Makro1()

Dim i As Integer

Dim lastValue As Integer
Dim firstValue As Integer

Dim lastRow As Integer

Dim fullRange As String

  lastRow = Cells(Cells.Rows.Count, "J").End(xlUp).Row

  Range("J1").End(xlDown).Select
   
  Range(Selection, Selection.End(xlDown)).Select

  For i = 1 To lastRow

    If Cells(i, 10).Value = "ABC" Or Cells(i, 10).Value = "ABC2" Or Cells(i, 10).Value = "ABC3" Then
      Cells(i + 1, 10).Select
      Range(Selection, Selection.End(xlDown)).Select
      lastValue = Selection.End(xlDown).Row
      firstValue = Selection.End(xlUp).Row
       
      fullRange = "J" & firstValue + 1 & ": J" & lastValue
       
      ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Cells(firstValue, 10), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
      With ActiveWorkbook.ActiveSheet.Sort
        .SetRange Range(fullRange)
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
      End With
    End If
     
    If Cells(i, 10).Value = "ABC3" Then
     
      Exit For
     
    End If

  Next i

End Sub

Das funktioniert nur mit leerer Zeile zwischen den Listen, ansonsten müsstest du die Spalte durchlaufen und sobald du ABC2 findest die aktuelle Reihe -1 als lastValue abspeichern. ABC/ABC2/ABC3 sind meine Listen-Namen. Immer wenn du "Cells(i,10)" siehst, dann bedeutet 10 Spalte J, du musst das mit deiner Spalte ersetzen, genauso wie alle Erwähnungen von "J" mit deiner Spalte.