Re: sortieren nach eingabe...
20.03.2003 18:53:38
MRR
Hi Jenso,
hier noch einmal zum Mitschreiben.
Der Code ist mit einem bestimmten Ereignis verbunden - dem Anklicken IRGENDEINER Zelle der Tabelle, in den wir ihn hineinstellen. Jedes Mal, wenn der User eine Zelle oder einen Bereich (z.B. Spaltenkopf) anklickt, wird diese Prozedur AUTOMATISCH aufgerufen - da muss NIEMAND irgendein Makro für starten oder sonstwie aufrufen.
Im Einzelnen:Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Die wird automatisch aufgerufen und "weiss", welche Zelle (Target) gerade angeklickt wurde.
Alle folgenden Aktionen (nämlich das Sortieren) sollen nur passieren, wenn man im Bereich der Spalten A:E klickt. Sollte Deine Tabelle mehr Daten haben (z.B. im Bereich A:K), müsste man hier eine Anpassung vornehmen.
Wenn die Schnittmenge der angeklickten Zelle und dem Spaltenbereich Deiner Tabelle in irgendeiner Form übereinstimmt, dann soll was passieren
If Not Intersect(Target, Range("A:E")) Is Nothing Then
Das Sortieren soll jedoch nur passieren, wenn wir eine ganze Spalte markiert haben. Dazu lesen wir aus, wie viele Zeilen in "Target" sind. Sollten dies 65536 sein, hat der User eine Spalte markiert.
If Target.Rows.Count = 65536 Then
Damit beim gleich folgenden Zell-Anklicken (hier im Code) nicht ERNEUT die selbe Prozedur aufgerufen wird (wie gesagt, die macht das ja automatisch, sobald "man" (User oder Makro) eine Zelle auswählt), schalten wir das Reagieren auf Ereignisse aus.
Application.EnableEvents = False
Wir markieren jetzt die erste Zelle in der markierten Spalte.
Cells(1, Target.Column).Select
Unter der Voraussetzung, dass die Tabellendaten in A1 beginnen, können wir von dort aus per STRG-* den gesamten Listenbereich ansprechen, um diesen zu sortieren. Das Sortierfeld/-spalte ist die, in die wir uns soeben hingesetzt haben (Range(ActiveCell)). Wenn ich davon ausgehe, dass wir eine Überschriftzeile haben, setzen wir Header auf JA (Überschriften werden vorhanden sein).
Range("A1").CurrentRegion.Sort Key1:=Range(ActiveCell), Order1:=xlAscending, Header:=xlYes
NICHT VERGESSEN das Reagieren auf Ereignisse UNBEDINGT wieder einzuschalten!!!
Application.EnableEvents = True
End If
End If
End Sub
So, das war's mit der Erklärung. Hoffe, dass es jetzt etwas deutlicher geworden ist.
Matthias