Hi Moni,
da ist das Baby, ganz frisch aus Lordchens stumpfer Feder
Vorsicht, Papier ist noch nass
Man geht folgendermaßen vor: In jender Arbeitsmappe, in der sich das ahnungslose Tabellchen befindet, öffnet man über Extras/Makro/Visualbasic Editor den VBA-Editor.
Im Projekt-Manager erkennt man Projekt1(Name der Arbeitsmappe). Direkt darunter aber mehrere Tabellen (Tabellen-Klassenmodule). Jene Tabelle, die unser unschuldiges Tabellchen repärsentiert, klicken wir an, wir gelangen in den Codebereich dieser Tabelle!
Im oberen Bereich des Windows (CodeEditor) befinden sich zwei ComboBoxen, die linke davon klicken wir an (Objektkatalog). Darin befinden sich zwei Einträge: Allgemein und Worksheet.
Wir klicken auf Worksheet und wählen aus der rechten Combobox das Ereignis: BevoreRightClick
aus. Wir fügen just den nachfolgenden Code ein:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As _
Boolean)
Dim janein As Variant
Dim nCell As Excel.Range
Dim x As Long, y As Long, i As Long
Dim a As String, j As String
Dim f As Integer
a = Target.Address(False, False, xlA1)
janein = MsgBox("Soll die Tabelle ab der Zeile/Spalte: " + a + " sortiert" & _
"werden?", vbQuestion + vbYesNo, "Autosortierung")
If janein = vbNo Then Exit Sub
Selection.SpecialCells(xlCellTypeLastCell).Select
x = Selection.Column
y = Selection.Row
a = a + ":" + Cells(y, x).Address(False, False, xlA1)
For Each nCell In Range(a)
f = InStr(nCell.Text, ".")
If f <> 0 Then
Cells(nCell.Row, x + 1).Value = DatePart("yyyy", nCell.Text)
ElseIf nCell.Text <> "" Then
j = "1." + nCell.Text
Cells(nCell.Row, x + 1).Value = DatePart("yyyy", j)
End If
Next
a = Cells(y, x + 1).Address(True, False, xlA1)
f = InStr(a, "$")
a = Left(a, f - 1)
Range("A:" + a).Select
Selection.Sort key1:=Columns(a)
End Sub Was passiert da genau:
Stellen wir uns mal vor, diese Tabelle enthält in einer Spalte Datumsangaben. Diese Tabelle soll hinsichtlich den Jahren sortiert werden. Aber:
Die Daten liegen wie folgt (u.U.) vor, z.B.:
01.12.99
11.1997
1998
01
27.04.1996
26.3.1999
u.s.w.
Schauder 
Eine solche Tabelle exakt nach Jahren zu sortieren ist unmöglich!!! Eigentlich ja, aber nicht für ein Lordchen Und schon gar nicht, wenn in die "Guru"-Kiste gegriffen wird. 
Ist hinter der noch ahnungslosen Tabelle der obige Code hinterlegt, so braucht der Anwender den Mauspfeil in die allererste Zelle der Spalte zu setzen, deren Datumsangaben für die Sortierung maßgeblich sind. Hier klickt man auf die Rechte Maustaste, es erfolgt eine Frage, ob sortiert werden soll. Wenn nein, erscheint das gewohnte Pulldown-Menü. Wenn aber ja geklickt wird, ermittelt das Programm den Bereich der Tabelle, bis zu welcher Spalte hier Einträge gemacht wurden. In einer freien Spalte, werden temporäre Daten abgelegt. Das Programm durchläuft nun die gesamte Spalte von oben nach unten und prüft die Einträge. Aus den Einträgen wird jeweils aber nur das Jahr in der Schreibweise: JJJJ extrahiert und in die gleichen Zeile der temporären Spalte eingetragen. Hier befindet sich auch ein besonderer Trick, der mit der DatePart-Funktion möglich ist:
If f <> 0 Then
Cells(nCell.Row, x + 1).Value = DatePart("yyyy", nCell.Text)
ElseIf nCell.Text <> "" Then
j = "1." + nCell.Text
Cells(nCell.Row, x + 1).Value = DatePart("yyyy", j)
End If Das hat etwas mit den Systemeinstellungen zu tun, die Tage, Monate und das Jahr werden nämlich mit einem "." getrennt. Findet die DatePart-Funktion aber keinen ".", so wird ein fiktives Jahr ausgegeben, aber wenn eine Zahl mit "." vorliegt, so wird exakt nach dem Jahr gesplittet - genau das machten wir mit j="1."+"1999" wir fügen klammheimlich einen xbeliebigen Monat hinzu, wichtig ist ja das Jahr.
Voila, sind alle Daten umgewandelt, wird sortiert.
Ich habe die temporäre Spalte noch in der Tabelle gelassen, damit man sieht, wie exakt sortiert wurde.
cu
Lordchen |