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

Entwicklung eines Bilderkarussells in Excel mit VBA

In meinem Lieblingsforum zu Microsoft Office stellte jemand die Frage, ob es möglich ist, in VBA ein Bilderkarussell zu programmieren. Hierbei soll sich eine bestimmte Anzahl von Bildern beim Anklicken einer kreisförmigen Bahn folgen. Beispielsweise würde beim Anklicken eines Bildes in der folgenden Abbildung, das Bild Nummer 1 die Position von Bild Nummer 2 einnehmen, Bild 2 wandert an die Stelle von Bild 3 usw.. Die Beispieldatei inklusive dem VBA Code können Sie am Ende des Artikels herunterladen.

Excel VBA Animator

Einige User haben in dem Forumsbeitrag Lösungen vorgeschlagen, die sicherlich alle interessant und auch funktionsfähig sind. Ich hatte die Idee, die Bahn über Excel Formeln berechnen zu lassen, ein Diagramm zu erstellen und anschließend die Bilder den Koordinaten der Punkte im Diagramm folgen zu lassen. Ausserdem wollte ich herausfinden, ob sich dann Unterschiede zwischen Excel 2003, Excel 2007 und Excel 2010 zeigen.

In einem ersten Schritt musste ich die Formeln in Excel aufzubauen. Hier habe ich die, übrigens ausgezeichnete, Formelsammlung bei www.excelformeln.de zu Rate gezogen, wo ein Beispiel zur Erstellung eines Diagramms für eine Ellipse zu finden ist. Für eine Ellipse gilt die Formel:

x² / a² + y² / b² = 1

oder wenn man dies nach y auflöst:

y = ±b/a*SQRT(a² - x²) wobei SQRT die Wurzelfunktion darstellt.

Folgend eine Abbildung einer Ellipse mit den wichtigsten Parametern.

Excel VBA Animator

Die Punkte F1 und F2 heißen hier „Brennpunkte“ oder „Fokusse“, die Strecke e wird als lineare Exzentrizität bezeichnet. Die X-Punkte einer Ellipse lassen sich dann entsprechend über x = a*cos(α) und y = b*sin(α) berechnen. Um dies nun in Excel in einem Diagramm abbilden zu können, brauchen wir eine Liste der Winkel und dazu die passenden Berechnungen. In Spalte A ab Zeile 16 habe ich zunächst eine einfache Liste von Winkelwerten erstellen, die diese Werte pro Zeile um 1 Grad erhöht. In den nebenliegenden Spalten werden dann die X und Y Werte für die Ellipse berechnet. Dies sähe dann beispielsweise für einen Winkel von 10 Grad wie folgt aus:

A17 = 1               Wert des Winkels in Grad
B17 = BOGENMASS(A17)  Umgerechneter Grad Wert in Radiant
C17 = SIN(B17)*$C$7   wobei in $C$7 der Wert für „a“ steht
D17 = COS(B17)*$C$8   wobei in $C$8 der Wert für „b“ steht

Wenn ich nun ein XY-Punkdiagramm erstellen, erhalte ich folgendes Ergebnis:

Excel VBA Animator

Sieht schon ganz gut aus, hat jedoch den Nachteil, dass sich die Ellipse nicht drehen läst. Aber auch hier haben die Formeln bei www.excelformeln.de weitergeholfen. Es braucht nur ein Faktor eingeführt werden, der die Werte um diesen Faktor dreht. Wenn ich diesen Faktor als Wert in Grad in Zelle C9 ablege, kann die Drehung wie folgt durchgeführt werden:

E16 = C16*COS(BOGENMASS($C$9))-D16*SIN(BOGENMASS($C$9))
F16 = C16*SIN(BOGENMASS($C$9))+D16*COS(BOGENMASS($C$9))

Zu beachten ist, dass der Wert in C9 zuerst in Radiant umgerechnet werden muss. Wenn ich ich das Diagramm anpasse, erhalte ich folgendes Ergebnis:

Excel VBA Animator

In der Beispielmappe habe ich diese zwei Schritte in einem zusammengefasst. Die Berechnungen finden Sie in Spalte B, E und F ab der Zeile 16. Das Karussell soll später 4 Bilder rotieren. Dafür müssen Startposition der Bilder festgelegt werden. Optimal wäre es, wenn die Achsen der Ellipse auch automatisch berechnet werden können und später deren Schnittpunkte als Startposition für die Bilder verwendet werden könnten. Folgende Abbildung zeigt die zwei Achsen D1 und D2 an, hier jedoch zunächst manuell eingezeichnet:

Excel VBA Animator

Die Formeln hierzu sind recht einfach, es genügt den Sinus und Cosinus von „a“ und „b“ jeweils zu berechnen und dabei auch die Drehung zu berücksichtigen.

D1_1_X = $C$7*COS(BOGENMASS($C$9))
D1_1_Y = $C$7*SIN(BOGENMASS($C$9))

Der zweite Punkt der Achse D1 wäre entsprechend gespiegelt zu finden, also
D1_2_X = – D1_1_X und D1_2_Y = – D1_1_Y. Für die Achse D2 brauchen wir nur die gleicher Berechnung durchzuführen, jedoch um 90 Grad versetzt; es ergibt sich also:

D2_1_X = $C$8*COS(BOGENMASS(90+$C$9))
D2_1_Y = $C$8*SIN(BOGENMASS(90+$C$9))

Anschließend habe ich für die Achsen jeweils ein neues Punktdiagramme zu dem bestehenden Diagramm hinzugefügt. Folgende Abbildung zeigt, wie sich später die 4 Grafiken positionieren werden.

Excel VBA Animator

Die mit 1 bis 4 nummerierten Bilder sind hier einfache Rechtecke, die ich mit einer Hintergrundfarbe gefüllt habe. Um diese in VBA ansprechen zu können, habe ich diese im Namensfeld als „Image_1“, „Image_2“, „Image_3“ und „Image_4“ benannt.

Es wäre optimal gewesen, wenn man die Koordinaten der Punkte im Diagramm hätte direkt ansprechen können. Leider gibt es hierzu keine Methode im Objekt „Points“ des Objektes „SeriesCollection“. Jedoch kann aus Datenbeschriftungen über die Eigenschaften „Left“ und „Top“ die Position dieser ermittelt werden. Natürlich müssen die Datenbeschriftungen im Diagramm auch zuvor aktiviert worden sein. Damit die Werte der einzelen Datenpunkte jedoch nicht im Diagramm angezeigt werden, habe ich den Zahlenformaten das benutzerdefinierte Zahlenformat „•“ zugewiesen. Man kann auch die Hintergrundfarbe der Datenbeschriftungen auf die Hintergrundfarbe der Tabelle legen. Beispielhaft die Einstellungen zum Format in Excel 2010.

Excel VBA Animator

Hinter den Grafiken habe ich anschließend ein Rechteck gelegt, welches als Koordinatensystem für das Bilderkarussell dienen wird. Um den Code etwas optimaler zu gestalten sowie auch zu Überprüfungszwecken, habe ich zunächst eine Funktion in VBA geschrieben, die mir alle Koordinaten der Datenbeschriftungen in die Spalten „R“ und „S“ ab Zeile 16 bis Zeile 376 (=360 Elemente) schreibt. Im Code finden Sie diese Funktion als „Public Function mlfpAnimateCalculate() As Long“ abgelegt.

Anschließend konnte eine relativ einfach eine Funktion implementiert werden, die die abgelegten Werte wieder ausliest und zunächst erstmal ein Rechteck versetzt entlang der Ellipse lang laufen lässt. Zu beachten ist hierbei, dass die Koordinaten der Datenbeschriftungen relativ zum Diagrammobjekt sind. Durch Addieren dieser zur oberen Ecke des Rechtecks hinter den Bildern entsteht ein genaues Abbild der Ellipse. Hier ein Auszug des Codes:

Der Zoomfaktor ist in der Beispielmappe einstellbar und errechnet sich zudem auch anhand der Strecke zum oberen Rand des Hintergrundrechteckes.

Jetzt stellte sich das Problem, wie die Animation so verändert werden kann, dass alle 4 Bilder jeweils animiert werden und auch nur soweit bis die ehemalige Position des Folgebildes erreicht wird. Dafür müssen die Schnittpunkte der Achsen in den berechneten Werten in den Spalten „R“ und „S“ wiedergefunden werden. Hier stellte sich das Problem, dass Excel manche Werte so genau berechnete, dass beim Suchen der Positionen über einen SVERWEIS() Fehler entstanden. Zudem mussten Einstellungen von „a“ und „b“, die zu Nullwerten für die Achsen führen, abgefangen werden. Insofern habe ich zunächst die Formeln insoweit verändert, dass die Genauigkeit begrenzt wurde. So steht in beispielweise in E8 (Punkt D1_1_X) jetzt:

E8 = KÜRZEN($X$8*$C$7*COS(BOGENMASS($C$9));0)/$X$8	mit $X$8 = 10000

Anschließend lässt sich der Abschnitt der einzelnen Punkte prima bestimmen und die zugehörigen Abschnitte in den Spalten mit den Koordinaten per Excel Formel ermitteln.

Excel VBA Animator

Weitere Funktionen, wie das Merken und Ablegen, welches Bild sich gerade an welcher Position befindet oder das Erstellen von Steuerelementen zur Auswahl der Ellipsenparameter waren schnell erledigt. Zum Spass habe ich auch eine Userform erstellt, die dieselbe Animation abspielt.

Excel VBA Animator

Die Userform nutzt ebenfalls die per Formel errechneten Koordinaten. Schließlich blieb noch das Testen. Hier ist mir aufgefallen, dass Excel 2007 und Excel 2010 die Animation wesentlich langsamer abspielen. Interessant ist auch, dass Excel 2003 trotz Blattschutz die Animation durchführt, Excel 2007 und Excel 2010 nur dann, wenn die Bilder explizit nicht gesperrt wurden. Um die Animationen schneller durchzuführen, habe ich noch einen Geschwindigkeitsfaktor eingebaut, der in der Schleife zur Ainmation Werte überspringen lässt. Aber auch hier verhalten sich Excel 2007 und Excel 2010 unterschiedlich. Weitere Optimierungsmöglichkeiten ausser dem Einbau von DoEvents oder dem Abschalten der autmatischen Berechnung sind mir nicht bekannt. Übrigens, zuviele DoEvents wirken sich ebenfalls auf die Performance aus. Falls jemand von Ihnen eine Möglichkeit kennt, die Animation weiter für Excel 2010 zu optimieren, gerne freue ich mich über eine Nachricht. Abschließend der Link zum Download der Beispielmappe:

» Bilderkarussel mit Excel VBA

Beachten Sie bitte auch, dass natürlich keinerlei Haftung, Gewährleistung oder sonstige Ansprüche für die Beispielmappe gewährt werden noch in Anspruch genommen werden können. Vor dem Testen empfehle ich in jedem Fall, wichtige Dateien zu sichern bzw. andere Programme zu schließen. Folgend noch ein paar Links zu diesem Thema.

 
Comments
Andre Essen

Ich bekomme einen Hinweis zu meiner 64-Bit Version und ein Abbruch im VBA Projekt…. – hätte mir das gerne angeschaut

Hallo André,

sorry erstmal für die verspätete Freischaltung, aber der Blog hat keine E-Mail-Benachrichtigung gesendet. Zeitlich passt es zu den Angriff, den mein Server erleiden musste. Kann sein, dass der zuviel zu tun hatte.

Die Windows API-Funktionen, die in der Datei enthalten sind, dürften unter Windows 64 Bit bzw. Excel 64 Bit als Ursache in Frage kommen. Das Projekt ist schon ein bißchen etwas älter. Könntest die API-Funktionen alle auskommentieren. In der UserForm dann auch mlfpApiMenueRemove Me.Caption, True, True auskommentieren.

Gruß