Excel 2013: Automatisches Sortieren einer Tabelle (automatisches Verschieben von Datenblöcken)

Hallo,
folgendes Problem:

in Excel 2013
will ich z.B.:

A    B  C   D
10  2   1   50
16  2   1   59
35  4   1   71
41  2   1   59

so automatisch sortieren lassen, dass wenn ich in Spalte A einen weiteren Wert eingebe (z.b. 12) , mir dieser automatisch zwischen 10 und 16 geschoben wird.

also aus:
A    B  C   D
10  2   1   50
16  2   1   59
35  4   1   71
41  2   1   59
12

soll werden:
A    B  C   D
10  2   1   50
12
16  2   1   59
35  4   1   71
41  2   1   59

und beim Verschieben der anderen Zeilen sollen die Werte aus B/C/D immer mit dem dazugehörigen A-Wert mitgehen.

Jemand eventuell eine Idee dazu?

MfG Artur B.

Hallo Artur,
das ist eine Standard-Sortieraufgabe. Du kannst den Bereich Deiner Daten markieren und dann nach Spalte A sortieren.
Wenn Du es automatisiert haben willst, kannst Du VBA verwenden.
Z. B. kopierst Du folgenden Code in den Code-Bereich des Tabellenblattes:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
’ startet, sobald sich ein Wert in einer Zelle ändert
If target.column 1 then Exit Sub ’ bricht ab bei allen Spalten außer A
Call sortieren
End Sub

Das Sortierprogramm kopierst Du in ein Modul Deiner Arbeitsmappe:

Option Explicit

Sub sortieren
With ActiveSheet
If .FilterMode Then .ShowAllData
End With
Cells.EntireColumn.Hidden = False
Cells.EntireRow.Hidden = False
Range(Cells(1, 1), Cells(activecell.row, 4)).Sort Key1:=Range(Cells(1, 1), Cells(activecell.row, 4)), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers
End Sub

Wenn es irgendwo hakt, einfach fragen! :smile:

Freundliche Grüße

Thomas

Wenn es irgendwo hakt, einfach fragen! :smile:

Hallo Thomas

Mit VBA klappt es bestens. Einen „Wunsch“ dazu hätte ich allerdings:

Wenn ich in Spalte A z. B. „Huber“ eingebe, befindet sich „Huber“ richtig sortiert an einer neuen Stelle in Spalte A. Der Cursor befindet sich in Spalte A an unterster Stelle auf einer leeren Zelle.

Ich möchte zu „Huber“ noch weitere Eingaben machen in Spalten B, C und D. Ich muss „Huber“ nun aber zuerst an seiner neuen Stelle suchen. Wie kriegt man das hin, dass die Eingabezelle „Huber“ markiert/aktiviert bleibt, damit ich diese Huber-Zelle nicht lange suchen muss?

Ich habe es mit Kommentaren versucht:
Am Anfang des Makros gebe ich ein
ActiveCell.AddComment
ActiveCell.Comment.Text Text:=„xyz“

Am Ende des Makros:
Selection.SpecialCells(xlCellTypeComments).Select
Selection.ClearComments

Aber der Kommentar wird an der untersten (leeren) Zelle in Spalte A eingetragen, nicht bei „Huber“. Und auch wenn es klappen würde mit dem Kommentar: Wenn ich andere Kommentare in verschiedenen andern Zellen habe, ist es mit dieser Lösung nicht optimal.

Eine andere Variante wäre: zuerst die „Huber“-Werte in den Spalten B, C und D einzugeben. Und dann erst in Spalte A den „Huber“. Aber das finde ich nicht besonders Anwender-freundlich.

Kennst Du eine bessere Lösung?

Vielen Dank! Niclaus

Ich möchte allerdings noch Eingaben in Spalte B oder C oder D machen und muss deshalb in Spalte A den

Hallo Thomas,

vielen Dank für die Lösung.

Ist genau das was ich gesucht hab.
Habe es nur noch an meine richtige Tabelle angepasst und es läuft wie es soll.

Vielen Dank

MfG Artur B.

Hallo Niclaus,
Du willst also den Cursor sozusagen mitsortieren lassen. Ist bestimmt manchmal hilfreich, aber eine Patentlösung fällt mir da nicht ein.
Wenn es nur einen „Huber“ gäbe, wäre es einfach, nach dem Inhalt der Startzelle zu suchen, aber darauf bist Du sicher auch schon gekommen.
Der Ansatz mit dem Kommentar wäre vielleicht ausbaufähig, indem Du vor den evtl. vorhandenen Kommentar eine seltene Zeichenkette setzt und danach suchst. Oder den alten Kommentarinhalt in eine Variable speichern, ihn durch ´was exotisches ersetzen und nach der erfolgreichen Suche wieder zurückschreiben. Dann kann es auch nicht zum Overflow wegen Kommentarlänge kommen.
Viel Erfolg
Thomas

Du willst also den Cursor sozusagen mitsortieren lassen. Ist
bestimmt manchmal hilfreich, aber eine Patentlösung fällt mir
da nicht ein.
Der Ansatz mit dem Kommentar wäre vielleicht ausbaufähig,

Hallo Thomas
Ich habe mich mit der Kommentar-Lösung beschäftigt. Ich gehe dabei einmal davon aus, dass in der Spalte A keine Kommentare vorhanden sind.

Sub sortieren()

Application.MoveAfterReturn = False
' Bringt an dieser Stelle nichts, muss vorher gestartet werden!
ActiveCell.AddComment
ActiveCell.Comment.Text Text:="xyz&zyx"

 With ActiveSheet
 If .FilterMode Then .ShowAllData
 End With
 Cells.EntireColumn.Hidden = False
 Cells.EntireRow.Hidden = False
 Range(Cells(1, 1), Cells(ActiveCell.Row, 4)).Sort Key1:=Range(Cells(1, 1), \_
 Cells(ActiveCell.Row, 4)), Order1:=xlAscending, Header:=xlNo, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortTextAsNumbers

Range("A:A").SpecialCells(xlCellTypeComments).Select
Selection.ClearComments
Application.MoveAfterReturn = True

End Sub

Das funktioniert, aber nur wenn ich die „Markierung nach Drücken der Eingabetaste verschieben“ ausschalte.

Sub move\_EinAus()
Application.MoveAfterReturn = False
End Sub

Und zwar muss ich diese Ausschaltung machen, bevor ich eine Eingabe in der Spalte A mache. Ich habe es versuchsweise in das Makro Sub sortieren() eingebaut, ohne Erfolg. Ich muss die „Markierung …“ zwingend vorher ausschalten.

Hast Du eine Ahnung, wie man dieses „Ausschalten“ in die Makros
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
oder Sub sortieren() einbauen könnte?

Viele Grüsse und vielen Dank
Niclaus

Hallo Niclaus,

anscheinend funktioniert die Codezeile ja prinzipiell. Vielleicht hilft es, dem Makro mehr Zeit zu geben oder den Befehl in ein Unter-Makro zu schreiben …?
Es gibt auch einen Befehl, die bisherigen Änderungen / Einstellungen zu übernehmen, fällt mir aber momentan nicht ein :expressionless:

Viel Erfolg

Thomas

Grüezi Thomas

Vielleicht hilft es, dem Makro mehr Zeit zu geben oder den
Befehl in ein Unter-Makro zu schreiben …?

Ich hatte beides versucht, das half aber nicht.

Falls es Dich interessiert: Ich habe doch noch eine Lösung gefunden: Ich habe einen zweiten Code in den Code-Bereich des Tabellenblattes eingefügt, mit dem die Cursor-Bewegung ausgeschaltet wird:

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
If Target.Column 1 Then
 Application.MoveAfterReturn = True
 Exit Sub
Else
 Application.MoveAfterReturn = False
End If
End Sub

Noch einmal vielen Dank und viele Grüsse
Niclaus