Probleme mit Sortier-Makro

Meine Programmversion: EXCEL 2002, SP3.

Hallo Zusammen!

Ich habe in meiner Excel-Liste zwei Makros.

  1. Makro „Alle“: Dieses Makro hebt eine vorhandene Filterung auf und sortiert alle Daten nach Spalte „A“.:
  2. Makro „Status_Todo“: Dieses Makro selektiert die Datensätze nach bestimmten Spalteninhalten und sortiert sie an-schließend nach dem Inhalt einer anderen Spalte:
    (Makro-Quellcode sh. unten)

Bei der Aufzeichnung der Makros war das Problem, dass Excel die ursprüngliche „Range“ abgespeichert hat, so dass Sätze, die danach eingefügt wurden, nicht mehr sortiert wurden. Ich habe daher das Makro manuell geändert, so dass die Range jetzt auf „A2:Z999“ verweist. Dies erscheint mir ausreichend, da ich nie mehr als 999 Zeilen in den entspre-chenden Listen habe.

Mein Problem ist, dass Excel gelegentlich automatisch die Range von „A2…“ auf „A1…“ zurücksetzt. Dies führt dazu, dass auch die Titelzeile mitsortiert wird. Keine Ahnung, warum Excel dies macht, oft funktionieren die Makros wochenlang problemlos, um dann wieder anzufangen „zu spinnen“.

Gibt es eine intelligentere Möglichkeit, die zu sortierende Range zu definieren, bzw. Excel endgültig klar zu machen, dass die Kopfzeile natürlich nicht mitsortiert werden soll?

Bei der Gelegenheit: Das Makro „Alle“ kann nicht ausgeführt werden, wenn die Sätze gar nicht gefiltert sind. Dann kommt ein Debug-Fehler. Aus der Datenbank-Programmierung weiß ich, daß es dort kein Problem gibt, wenn man eine Tabelle die bereits in physischer Ordnung ist nochmals auf physische Ordnung setzt. Excel scheint hier zickiger zu sein. Gibt es eine Möglichkeit, daß Excel hier etwas „lockerer“ wird?

Vielen Dank an alle Makrospezialisten in voraus.
Conrad

Makro-Quellcode:

  1. Sub Alle()
    ’ Alle Makro
    ’ Hebt alle Filter auf und zeigt alle Sätze an
    ActiveSheet.ShowAllData
    Range(„A2“).Select
    Range(„A2:Z999“).Sort Key1:=Range(„A2“), Order3:=xlAscending, _
    Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
    xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
    DataOption3:=xlSortNormal
    End Sub

  2. Sub Status_todo()
    'Sortiert Status nicht „erledigt“ und nicht „zurückgestellt“
    Selection.AutoFilter Field:=12, Criteria1:=„Erl“, Operator:=xlAnd, _
    Criteria2:=„Zur“
    Range(„A2“).Select
    Range(„A2:Z999“).Sort Key1:=Range(„B2“), Order1:=xlAscending, Key2:=Range( _
    „C2“), Order2:=xlAscending, Key3:=Range(„A2“), Order3:=xlAscending, _
    Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
    xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
    DataOption3:=xlSortNormal
    End Sub

Hallo, Conrad!

Zwei Punkte:

Mein Problem ist, dass Excel gelegentlich automatisch die
Range von „A2…“ auf „A1…“ zurücksetzt. Dies führt dazu, dass
auch die Titelzeile mitsortiert wird. Keine Ahnung, warum
Excel dies macht, oft funktionieren die Makros wochenlang
problemlos, um dann wieder anzufangen „zu spinnen“.

Das dürfte das Problem mit „xlGuess“ sein:

Range(„A2“).Select
Range(„A2:Z999“).Sort Key1:=Range(„A2“),
Order3:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:= _
xlTopToBottom, DataOption1:=xlSortNormal,
DataOption2:=xlSortNormal, _
DataOption3:=xlSortNormal

Verwende zum einen UsedRange statt Range("…"), dann hast Du in jedem Fall (auch, wenn’s mal mehr als 999 Zeilen werden) alles drin.
Dann schau noch mal in der Online-Hilfe unter „Sort“ nach, was für Header gesetzt sein muss, um fix die Überschriftenzeile zu verwenden (ich vermute mal xlYes) und wie dann die anderen Range-Parameter anzugeben sind.

Ordnung setzt. Excel scheint hier zickiger zu sein. Gibt es
eine Möglichkeit, daß Excel hier etwas „lockerer“ wird?

Ich baue in jede Funktion eine Standard-Fehlerbehandlung ein, die so aussieht:

Const cstrProcName = "GetZeile" 'ErrorHandler:blush:$N=FindFiles
'--------------------
On Error GoTo ErrorHandler

' Fehlerbehandlungsblock hinzugefügt vom Fehlerbehandlungsroutinen-Add-In. Bearbeiten Sie diesen Codeabschnitt NICHT.
'--------------------
ErrorHandler:
 Select Case Err.Number
 Case 0
 ' hier müsste noch alles rein, um fehlerunabhängig "aufzuräumen"
 case 47110815
 ' hier kommen die erwarteten Fehler rein
 ' bei unkritischen Sachen wie Löschen einer ohnehin
 ' nicht vorhandenen Datei/Tabelle o. ä.:
 resume next
 ' oder auch resume errorhandler
 Case Else
 MsgBox "Fehler: " & vbTab & Err.Number & "-" & Err.Description & vbCrLf \_
 & "Modul:" & vbTab & mcstrModName & vbCrLf \_
 & "Funktion:" & vbTab & cstrProcName, vbExclamation + vbOKOnly, "Fehler!"
 Resume ErrorHandler
 End Select
' Ende des Fehlerbehandlungsblocks.

In Deinem Fall: Lass Dein Makro in den Fehler laufen, schau auf Err.Number und trage das als Case-Statement mit einem Resume Next ein.

Dann sieht Excel das ganze Thema deutlich lockerer…

Gruß, Manfred