(C) 2009 - 2021 by Mourad Louha · Alle Rechte vorbehalten

Positionieren von Steuerelementen per Code – Bug in Excel 2010?

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.

Excel Controls Bug

Excel Controls Bug

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:

Excel Controls Bug

Excel Controls Bug

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.

Excel Controls Bug

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:

Excel Controls Bug

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.

Excel Controls Bug

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.

 

 
Comments
Annegret Jäger

Ich habe das gleiche Problem bei einer Praxisanwendung. Weiß jemand ob das Problem mit einem ServicePack behoben ist?

Hallo Annegret…

Meines Wissens ist das nicht behoben worden; auf meinem Rechner mit aktuellem SP ist der Fehler noch vorhanden.

Da ich auch das Problem in einem Projekt hatte, habe ich mir dann die Positionen per Code gemerkt und restauriere diese wieder per Code. Gibt ja auch Fälle, wo man nicht immer weiss, ob der Kunde seine Installationen aktuell hält.

Viele Grüße :-)

Ich habe ein verwandtes Problem , jedoch hilft hier auch nicht das neu-positionieren per Makro.

In einem Workbook mit mehreren Sheets, auf dem jeweils Steuerelemente (Buttons, Drop-Downs etc) positioniert sind, verschieben sich die Steuerelemente beim Drucken, wenn ich mehrere Sheets gleichzeitig (per Mehrfachauswahl) selektiert habe.

Selbst wenn ich danach die gespeicherten Koordinaten per Script wieder einstelle, vehält sich Excel merkwürdig. Erst nach einem Schliessen-Öffnen der Datei lassen sich die Elemente per Script wieder korrekt positionieren.

Gibt es dazu erfahrungen?

Gruss
Christian

Hallo Christian,

Erfahrungen mit diesem Problem habe ich bislang nicht, allerdings habe ich ein wenig recherchiert und folgendes gefunden:

Hoffe, das hilft schon mal weiter.

Gruß :-)

Hallo liebe Leute,

das bestehende Problem in Exel wird ganz einfach dadurch gelöst, indem ein kleiner Befehlshinweis wie folgt eingeben wird:

1. Sie wählen den Karteireiter „Entwicklertools“

2. Sie aktivieren den Entwurfsmodus.

3. Sie markieren das betreffende Kombinationsfeld und wählen mit der rechten Maustaste bzw. gleichfolgend mit der linken Maustaste die Eigenschaften aus.

4. In der Splate „DragBehavior setzen Sie den Wert: 1- fnDragBehavior“

5. bei allen betroffenen Kombinationsfeldern den Schritt 3. und 4.

6.Entwurfmodus anschließend schließen.

7. Problem behoben

Hoffe allen ein wenig geholfen zu haben und wünsche allen noch eine gute Zeit.

Hallo Peter, vielen Dank für die Hinweise :-) Viele Grüße, Mourad

Hallo ihr Lieben,

der Artikel ist zwar schon etwas älter, aber vielleicht liest das hier ja doch noch einer ;)
Ich habe genau das Problem wie oben beschrieben. Leider gibt es in meinem Eigenschaftsmenü keine Spalte „DragBehavior“ oder ähnliches. Gibt es dennoch einen Weg, die Kästchen an ihrem Platz zu behalten, ohne einen Code dafür schreiben zu müssen?

Danke schonmal im Vorraus :)

Hallo Neele,

na klar liest hier noch einer ;-) Das fnDragBehavior bezieht sich auf ActiveX-Steuerelemente. Falls Du Formularsteuerelemente verwendest, gibt’s die Eigenschaft nicht.

Grüße, Mourad

Hallo zusammen,
ich habe das gleiche Problem wie Neele, bei mir fehlt auch die Spalte „DragBehavior“. Es handelt sich aber um ein ActiveX-Steuerelement. Hat jemand eine Lösung bzw. was mache ich falsch?

Grüße, Katja

Hallo Katja,

habe ein Bild gemacht, wie es bei mir aussieht, siehe hier:

Zuvor hatte ich eine Combobox (Kombinationsfeld) aus den ActiveX-Steuerelementen eingefügt, dieses im Entwurfsmodus angeklickt und im Kontextmenü „Eigenschaften“ ausgewählt. Dann erhälst Du die Palette. Anschließend kann man die Werte für die Eigenschaft auswählen. Geht das auch bei Dir?

Viele Grüße

Hallo,
nein, dieses Feld fehlt leider bei mir :-(
Bei mir geht’s nach dem Feld „AutoLoad“ direkt mit „Enabled“ weiter, zumindest ist dies so in den Eigenschaften vom „optionButton“ und der „Checkbox“ – liegt es eventuell daran? Wenn ich eine Combobox einfüge, bekomme ich allerdings dort unter Eigenschaften den Punkt „DragBehavior“… Irgendeine Idee? :-)

Viele Grüße

Hallo Katja,

das ist schon korrekt, denn diese Eigenschaft steht Kontrollkästchen (Checkboxen) und Optionsfeldern (Optionbutton) nicht zur Verfügung, sondern nur Kombinationsfeldern (Comboboxes) und Textfeldern (Textboxes) zur Verfügung. Bin auch im Verlauf der letzten Kommentare auch davon ausgegangen, dass es sich um Kombinationsfelder handelt. Eine Idee, wie sich das Excel-Problem ohne Aufwand beheben lässt, habe ich erstmal so leider nicht.

Viele Grüße

Hallo,

da ich dasselbe Probleme habe, habe ich den Tipp von Peter W. ausprobiert. Dies hat bei mir aber leider nicht funktioniert. Hat jemand ne Idee an was das liegen kann?

Viele Grüße

Hallo,
ich hatte das gleiche Problem. Mir wurden ständig die Option Button verschoben, wenn ich im ausgeblendeten Zustand gespeichert habe.
Habe jetzt das Dateiformat nach .xlsb geändert. Seitdem habe ich keine Probleme mehr. Alles erscheint nach dem Speichern wieder wie es sein soll.
Vielleicht kann jemand mal testen ob das allgemein funktioniert, oder ob das bei mir jetzt nur Zufall ist.
Viele Grüße bibe

Hallo bibe,

vielen Dank für die Info. Meines Erachtens ist das Problem leider nicht komplett behoben. Jedenfalls bearbeite ich zurzeit gerade ein Projekt, wo ich in diesem Fall Kombinationsfelder aus den Formularsteuerelementen verwendet habe. Excel 2013 und Excel 2016 haben so ihre Probleme mit dem Ein- und Ausblenden; Excel 2010 nicht (mehr). Insofern positionniere ich grundsätzlich die Elemente per Code, wenn ich ein- und ausblende. Dateiformat ist XLSB.

Viele Grüße, Mourad

Ich habe es jetzt in *.xlsb gespeichert und siehe da, die Textfelder bleiben auch nach dem aus/ausblenden an Ort und Stelle. In *.xlsm nicht.

Hallo Christian,

vielen Dank für die Rückmeldung. PS: die Freischaltung des Kommentars hat etwas länger gedauert, da ich längere Zeit abwesend war.

Gruß, Mourad

Trackbacks for this post