Beim Testen einer von mir geschrieben VBA Anwendung in Excel 2010, ist mir heute eine Merkwürdigkeit aufgefallen, die ich persönlich als Bug in Excel 2010 einstufen würde.
Meine Anwendung verwendet unter anderem Kontrollkästchen aus der Formularsymbolleiste, welche in einer Arbeitsmappe per VBA Code ein- und ausgeblendet werden. Zudem werden die Zellen, die diese Kontrollkästchen enthalten ebenfalls per Code ein- und ausgeblendet. Der Fehler in Excel 2010 äußerte sich in meiner Anwendung durch ein inkorrektes Positionieren der Steuerelemente, wenn folgende Schritte durchgeführt wurden:
- Ausblenden von Formular-Steuerelementen (Visible = False) per Code.
- Ausblenden der Zeilen, die die Steuerelemente enthalten.
- Speichern und Schließen der Mappe.
- Öffnen der Mappe und Einblenden der Mappe.
- Die Steuerelemente liegen alle übereinander und haben ihre Position verloren.
Das Problem tritt übrigens bei Excel 2007 nicht auf. Um nun wirklich sicher zu gehen, dass es sich hier auch tatsächlich um ein Excel 2010 Problem handelt, habe ich mir eine kleine Beispielanwendung geschrieben, welche in einer Mappe 9 Kontrollkästchen untereinander positioniert. Die Eigenschaft zur Objektpositionierung der Steuerelemente ist auf „Nur von Zellposition abhängig“ gesetzt. Folgende zwei Screenshots zeigen die Tabelle in Excel 2007 und Excel 2010 im Ausgangszustand ohne jegliche Einwirkung von VBA Code.
In einem Standardmodul sind die zwei Prozeduren „HideCheckboxes()“ und „ShowCheckboxes()“ abgelegt und den jeweiligen Schaltflächen zugeordnet. Der relativ simple Code blendet zunächst die Steuerelemente ein bzw. aus sowie anschließend die Zellen.
Führt man nun die zuvor erwähnte Schritte aus – Ausblenden über einen Klick auf die Schaltfläche „Hide“, Schließen der Mappe und erneutes Öffnen – erhält man die nachfolgend abgebildeten Zustände in Excel 2007 und 2010:
Sie sehen, die Kontrollkästchen liegen alle übereinander. Wenn man sich in Excel 2007 die Eigenschaft „TopLeftCell“ zu jedem Kontrollkästchen per MsgBox ausgeben lässt, wird in Excel 2007 korrekterweise $C$3, $C$4, $C$5, usw. auch nach dem erneuten Öffnen angezeigt. Excel 2010 überschreibt schon beim Ausblenden diese Eigenschaft temporär mit $C$2 für jedes Kontrollkästchen. Wenn die Datei gespeichert und geschlossen wird, bleibt logischerweise das Überschreiben der Eigenschaft erhalten und somit werden die Steuerelemente nach erneutem Öffnen der Datei beim Einblenden falsch positioniert.
Wobei hier interessant ist, dass „TopLeftCell“ restauriert werden kann, solange nicht gespeichert und geschlossen wird.
Die Datei ist im Open XML Format abgelegt, somit lässt sich diese in *.zip umbenennen und mit einem Entpacker dekomprimieren. Je nachdem, ob die Datei mit Excel 2007 oder Excel 2010 erzeugt wurde, enthält das Archiv im Unterordner „drawings“ unterschiedliche Dateien. Im nächsten Screenshot sind die beiden Dateien „drawing1.xml“ und „vmlDrawing1.vml“ für die Excel 2010 Datei zu sehen:
In der mit Excel 2007 erstellten Datei ist die Datei „drawing1.xml“ nicht enthalten. Schauen wir uns jedoch zunächst die Datei „vmlDrawing1.vml“ etwas genauer an. In einem Texteditor sind die Kontrollkästchen schnell gefunden.
Das Wort „Anchor“ lässt auf die Zelle schließen, die für das Kontrollkästchen zur Positionierung verwendet wird. Und vergleicht man jetzt die Werte für „Anchor“ aus der Datei „vmlDrawing1.vml“ für Excel 2010 mit der für Excel 2007, stellt man fest, dass nach dem Ausblenden und Speichern der Datei in Excel 2010 alle Werte auf die Folge „2, 0, 1, 0, 4, 0, 13, 0“ gesetzt wurden. In Excel 2007 stehen diese Werte auf „2, 0, 2, 0, 4, 0, 13, 0“ für das erste Kontrollkästchen, auf „2, 0, 3, 0, 4, 0, 13, 0“ für das zweite und so fort.
Wenn nun die Werte für „Anchor“ von Excel 2007 manuelle in die Datei „vmlDrawing1.vml“ übertragen werden, anschließend wieder ein Zip-Archiv erstellt, die Datei in *.xlsm umbenannt und in Excel 2007 geöffnet werden, lässt sich der Originalzustand der Kontrollkästchen beim Einblenden wieder herstellen. Wird die Datei in Excel 2001 geöffnet, haben diese Änderungen an „Anchor“ keine Auswirkungen. Die Datei „vmlDrawing1.vml“ dürfte somit nur noch aus Kompatibilitätsgründen enthalten sein.
In der Datei „drawing1.xml“ sind Angaben zu den Kontrollkästchen enthalten, jedoch auch aber in der Datei „sheet1.xml“ im Ordner „worksheets“ für die erste Tabelle. Die Werte unterscheiden sich logischerweise auch von denen, die für eingeblendete Kontrollkästchen enthalten sind. Leider konnte ich auch nicht durch Experimentieren mit diesen Werten einen Zustand herstellen, so dass beim Ausführen des Makros zum Einblenden die Steuerelemente ihre Originalposition einnehmen.
Abschließend habe ich noch weitere Steuerelemente getestet; Excel 2010 verhält sich ebenfalls bei Kombinationsfeldern, Optionsfeldern und bei Schaltflächen in derselben Art wie bei den Kontrollkästchen. Bei Schaltflächen kann es passieren, dass diese nach dem Einblenden auf eine Linie reduziert werden, was den Anschein erweckt, als wären diese nicht mehr vorhanden.
Sollte dieses Verhalten von Excel 2010 nicht absichtlich entwickelt worden sein, ist dies meines Erachtens ein Bug. Im gegenteiligen Fall stellt sich für mich die Frage nach dem warum. Zumal dieses Verhalten aus meiner Sicht keine nennenswerten Vorteile bringt.
Als Abhilfe bleibt zunächst nur das Neu-Positionieren der Steuerelemente per Code, wobei dann in der Tabelle die Positionen irgendwo abgelegt sein sollten.
Diesen Artikel habe ich auch in meinem Blog bei www.software.maninweb.de publiziert.
Ich habe das gleiche Problem bei einer Praxisanwendung. Weiß jemand ob das Problem mit einem ServicePack behoben ist?