Zwischenspeicherung von Objektmethoden-Parametern
Vermutlich ist Ihnen schon mal aufgefallen, dass der Makrorecorder bei der Aufzeichnung von Aktionen bei Methoden eher zuviel als zuwenig Parameter-Einstellungen aufzeichnet. Und vielleicht ist Ihnen sogar aufgefallen, dass bestimmte Parameter in die VBA-Methode übersetzt wurden, obwohl diese Parameter als optional deklariert sind und einen Defaultwert besitzt, wenn nichts angegeben wird. Weshalb also wird ein derartiger Parameter vom Makrorecorder berücksichtigt? Oder ist das nur Zufall?
Wie ich herausgefunden habe, ist es alles andere als Zufall! Verschiedene Objekt-Methoden, wie beispielsweise die Sort-Methode von Range, besitzen ein - zumindest für mein Verständnis - ziemlich ungewöhnliches Verhalten. Einzelne Parameter-Einstellungen werden bei jeder Verwendung der Methode gespeichert und beim nächsten Aufruf der Methode wiederverwendet, falls für diese Parameter keine Werte angegeben werden!
Ausschnitt aus der Excel VBA-Dokumentation
| Anmerkungen "Die Einstellungen für Header, Order1, Order2, Order3, OrderCustom und Orientation werden bei jeder Verwendung dieser Methode gespeichert. Wenn Sie für diese Argumente keine Werte angeben, werden beim nächsten Aufruf der Methode die gespeicherten Werte verwendet. Um Probleme zu vermeiden, legen Sie diese Argumente bei jeder Verwendung dieser Methode explizit fest." |
Dieses höchst interessante Merkmal der Sort-Methode fällt vermutlich kaum jemandem auf. Dabei kann die unsachgemässe Verwendung von Sort in der Praxis zu Fehlern führen, die sehr schwer aufzuspüren sind, sofern man dieses spezielle Verhalten einiger Sort-Parameter nicht kennt. Wie ein derartiger Fehler aussehen könnte, möchte ich Ihnen anhand eines kleinen Beispiels zeigen.
Dazu hier zuerst kurz die Syntax von Sort und die Beschreibung des Header-Argumentes:
Ausschnitt aus der Excel VBA-Dokumentation (Sort-Methode)
| Syntax von Sort Ausdruck.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod) Argument Header |
VBA-Beispiel zum Reproduzieren des Verhaltens
Hier nun ein VBA-Beispiel, das zu einem ungewöhnlichen Verhalten führen kann. Die ersten vier Codezeilen habe ich mit dem Makro-Recorder aufgezeichnet; die letzten beiden Zeilen habe ich von Hand eingegeben. Die Zeilennummern 1 bis 6 dienen lediglich zu Erläuterungszwecken.
Sub SortList()
1: Range("B18").Select
2: Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlNo,
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
3: Range("B13").Select
4: Selection.Sort Key1:=Range("B4"), Order1:=xlDescending, Header:=xlYes,
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
5: Range("B6").Select
6: Selection.Sort Key1:=Range("A4"), Order1:=xlAscending, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
End Sub
In Programmzeile 4 ist der Header-Parameter mit xlYes angegeben. In Zeile 6 ist der Header-Parameter nicht angegeben, was erlaubt ist, da er gemäss Onlinehilfe optional ist. In der Excel VBA-Dokumentation steht auch, dass die Standardkonstante xlNo ist. Das bedeutet, dass die zu sortierende Liste keine Überschriften enthält und die Sortierung (in Codezeile 6) ohne Überschriften erfolgt, da der Header-Parameter nicht angegeben ist und somit der Defaultwert xlNo verwendet wird.
So logisch die obige Begründung auch tönt: Es ist leider nicht so. Wenn Sie sich an die Abschnitt "Anmerkung" in der Excel VBA-Dokumentation erinnern, dann steht dort, dass unter anderem das Header-Argument zwischengespeichert und beim nächsten Aufruf verwendet wird, sofern nichts anderes angegeben wird. Das bedeutet, dass die Sortierung in der Zeile 6 so ausgeführt wird, wie wenn Header:=Yes angegeben wäre, sprich mit Überschriften.
Neben der Sort-Methode verwendet auch die Find-Methode und die Replace-Methode diese Zwischenspeicherung-Technik (Anmerkung des Autors: Ob noch weitere Methoden existieren, ist mir nicht bekannt).
The eXpLorer
Zuletzt aktualisiert am
4.04.2004 / 22:30 Uhr
© Copyright 2002-2004 by Philipp von Wartburg, CH-8917
Oberlunkhofen
Alle Rechte vorbehalten