The eXpLorer


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
Variant optional. Legt fest, ob die erste Zeile Überschriften enthält oder nicht. Zulässig ist eine der folgenden xlGuess-Konstanten: xlGuess, xlNo oder xlYes. Mit xlYes enthält die erste Zeile Überschriften (die nicht sortiert werden). Mit xlNo gibt es keine Überschriften (der gesamte Bereich wird sortiert). Mit xlGuess übernimmt Microsoft Excel die Entscheidung, ob eine Überschrift vorhanden ist und falls vorhanden, wo sie sich befindet. Die Standardkonstante ist xlNo. [...]

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).

Zum Seitenanfang


The eXpLorer

Zuletzt aktualisiert am 4.04.2004 / 22:30 Uhr
© Copyright 2002-2004 by Philipp von Wartburg, CH-8917 Oberlunkhofen
Alle Rechte vorbehalten