VBA - Animation

VBA zur Animation von Excel-Grafik

Eine wichtige Anwendung von Kalkulations-Programmen ist die Herstellung anschaulicher Grafik aus Zahlen. Mit VBA können sie derartige Grafik zum Leben erwecken.
VBA Visual Basic for Applications
Beispiel 1 Automatik im Sekunden-Takt
Beispiel 2 So schnell wie möglich...
Animation Einige spezielle Design-Kriterien
DoEvents Unterbrechung bei Ereignissen (Events)
ScreenUpdating Schneller rechnen ohne flackernde Ansicht
Calculation Berechnung manuell oder automatisch
Initialisierung Herstellung eines definierten Anfangs-Zustandes
Multifunktion Änderung der Funktion und anderer Eigenschaften von Buttons

Animation: Beispiel 1

Dieses Kapitel demonstriert eine sehr einfache Animation mit Hilfe von VBA. Das Beispiel erfordert nur minimale Kenntnisse von VBA.
Sie können das fertige Demo-Beispiel hier laden, besser (und sicherer) ist es jedoch, das Beispiel selbst zu erstellen.
Das fertige Beispiel kann so ähnlich aussehen wie rechts gezeigt.
Wenn man Start1 anklickt, dann zählt das Programm einmal pro Sekunde weiter. Mit Taste Stop wird die Animation beendet.
(Taste Start2 wird im ↓ nächsten Kapitel erklärt).
 AB
15
2
 

Herstellung:

(1)   Öffnen sie eine neue Kalkulations-Datei und speichern sie die Datei, z.B. unter dem Namen ani_demo.xls

(2)   Tragen sie in Zelle A1 eine Zahl im Bereich 1..10 ein.
(3)   Wechseln sie zu VBA: Tasten Alt-F11 oder Menübefehl   Extras | Makro | Visual Basic Editor

(4)   Im VBA-Fenster erzeugen sie ein neues VBA-Modul mit Menübefehl   Einfügen | Modul
Das VBA-Modul (normalerweise mit dem Namen Modul1) wird im Projekt-Fenster angezeigt.

(5)   Öffnen sie das Modul mit Doppelklick, kopieren sie den Text aus dem Beispiel rechts und fügen sie den Text in das Modul-Fenster ein.

(6)   Kehren sie wieder zur Kalkulation zurück:
Taste Alt-F11 oder Anklicken des Excel-Icons. Speichern sie die Datei.

Erklärung:
ani ist eine globale Variable, d.h. alle Programme können darauf zugreifen.
Die beiden Programme (Subs) ani1_start und ani_stop starten bzw. beenden die Animation.
Das Programm ani1_do führt die eigentliche Arbeit aus: Der Wert in Zelle A1 wird um +1 erhöht und nach dem Wert 10 wieder auf 0 gesetzt. Das Programm startet sich selbst nach 1 Sekunde erneut.

Details zu den Themen VBA-Modul, Bereich (Range) und Event (OnTime)
VBA-Quelltext einer einfachen Animation:
Option Explicit
Dim ani As Boolean

Sub ani1_start()
ani = True
Call ani1_do
End Sub

Sub ani_stop()
ani = False
End Sub

Sub ani1_do()
Dim i As Integer
If ani Then
i = Range("A1").Value + 1
If i > 10 Then i = 0
Range("A1").Value = i
' Neu-Start nach 1 sec
Application.OnTime Now + TimeValue("00:00:01"), "ani1_do"
End If
End Sub
(7)   Öffnen sie die Symbolleiste 'Formular' mit Menübefehl   Ansicht | Symbolleisten | Formular
Klicken sie das Icon 'Schaltfläche': Der Mauszeiger verwandelt sich in ein Kreuz.
Ziehen sie damit die rechteckige Form eines Buttons auf. Das Fenster 'Makro zuweisen' sollte sich öffnen. Wenn nicht - Rechtsklick auf den Button.
Wählen sie das Programm ani_stop und klicken sie   OK
(8)   Erzeugen sie genauso wie in Punkt (7) eine weitere Schaltfläche und weisen sie ihr das Programm ani1_start zu.

Ändern sie den Text der beiden Schaltflächen (Buttons) auf 'Start' bzw. 'Stop'. Markieren sie dazu die Buttons mit gedrückter Strg-Taste !   (Andernfalls wird bereits das jeweilige Programm gestartet).

Animation: Beispiel 2

Hier wird eine alternative Methode zur Animation mit Hilfe von VBA demonstriert. Dieses Beispiel läuft mit wesentlich höherer Geschwindigkeit, je nach Leistung und Auslastung des jeweiligen PC.
(1)   Verwenden sie die Datei nach dem Muster von ↑ Beispiel 1 (oben). (2)   Tragen sie in Zelle A1 eine Zahl im Bereich 1..10 ein.
(3)   Wechseln sie zu VBA mit Tasten Alt-F11 oder Menübefehl   Extras | Makro | Visual Basic Editor

(4)   Öffnen sie das VBA-Modul durch Doppelklick, kopieren sie den Text aus dem Beispiel rechts und fügen sie den Text in das Modul-Fenster ein.

(5)   Kehren sie wieder zur Kalkulation zurück mit Taste Alt-F11 oder Anklicken des Excel-Icons. Speichern sie die Datei.

Erklärung:
Das Programm ani2_start enthält eine Schleife, in welcher die Animation ohne weitere Maßnahme unendlich lange ausgeführt wird.
Das Programm ani2_do führt die eigentliche Animation aus. Hier wird in Zelle A1 bis 1000 gezählt und danach wieder bei 0 begonnen. Wichtig sind die beiden letzten Anweisungen dieses Programms:
Calculate führt eine neue Berechnung durch und wartet, bis alle Formeln berechnet und angezeigt sind.
DoEvents verarbeitet auf alle aufgetretenen Ereignisse - In diesem Fall das wichtige Klicken des Stop-Buttons.
Zusätzlicher VBA-Quelltext (Das Beispiel verwendet auch die globale Variable ani und das Programm ani_stop von ↑ Beispiel-1):
Sub ani2_start()
ani = True
While ani
Call ani2_do
Wend
End Sub

Sub ani2_do()
Dim i As Integer
i = Range("A1").Value
i = i + 1
If i > 1000 Then i = 0
Range("A1").Value = i
Calculate
DoEvents
End Sub
Wenn die Anweisung DoEvents fehlt, dann lässt sich die Animation (fast) nicht mehr abbrechen !
(6)   Erzeugen sie genauso wie in ↑ Beispiel-1 einen weiteren Button (Schaltfläche), jedoch mit Zuweisung von Programm ani2_start und ändern sie den Text auf 'Start2'.

Anwendung:

Klick auf Taste Start2 lässt die Animation laufen, Klick auf Taste Stop beendet sie.
Die ↑ Simulation des Beispieles auf dieser Webseite ist natürlich nicht mit VBA sondern mit → Javascript programmiert. Sie läuft ähnlich, zählt jedoch etwas langsamer und nur bis 100. Eine Animation lässt sich am besten mit Hilfe einer Grafik verfolgen.
Stellen sie dazu den aktuellen Wert der Animations-Zelle A1 in einer Grafik dar (z.B. Säule).
Fixieren sie die Skala der Grafik: Doppelklick auf die vertikale Y-Achse, Register Skalierung: Entfernen sie die Markierungen von Minimum und Maximum und tragen sie die Werte 0 bzw. 1000 ein.

Animation

Eine klug aufgebaute Animation kann den anschaulichen Wert einer Kalkulation erheblich steigern. In diesem Kapitel werden einige Design-Aspekte für Animationen kurz vorgestellt.

Kleine Schritte

Programmieren sie in ganz kleinen Schritten, testen sie das geänderte Programm unmittelbar darauf und speichern sie die Datei, wenn alles funktioniert.
AnfängerInnen neigen nach den rasch erreichbaren ersten Erfolgen dazu, (zu) viel VBA-Code auf einmal zu erstellen.

Ein häufiger Fehler ist eine Endlos-Schleife: Die Animation lässt sich nicht mehr beenden. In diesem Fall muss man das Kalkulations-Programm 'gewaltsam' beenden. Alle Änderungen seit der letzten Sicherung sind dann verloren.
Abhilfe: Einbau eines Sicherheits-Zählers (nächster Absatz).

Abbruch

Der Abbruch einer Animation ist meist schwieriger als der Start. Überlegen sie, ob ein bestimmtes Programm einmalig laufen soll (z.B. zum Durchfahren aller möglichen Werte einer Vorgabe) oder in einer Schleife unendlich lange bis zum Abbruch durch die/den AnwenderIn.

Sicherheits-Zähler

Während der Entwicklung ist es sinnvoll, jede Schleife zusätzlich mit einem Zähler zu begrenzen, der sie z.B. nach 2000 Durchläufen automatisch beendet. Der Zähler wird so eingestellt, dass man die normale Programm-Funktion sorgfältig testen kann, und nur dann abbricht, wenn man ungewollt eine Endlos-Schleife programmiert hat. Der Zähler wird entfernt, wenn das Programm funktioniert und sich normal (z.B. mit Klick auf den Stop-Button) beenden lässt.
Das oben vorgestellte Programm ani2_start mit einem Sicherheits-Zähler (rot):
Sub ani2_start()
Dim counter As Integer
counter = 0
ani = True
While ani
Call ani2_do
counter = counter + 1
If counter > 2000 Then Exit Sub
Wend
End Sub
Das Programm funktioniert normal, wird aber nach maximal 2000 Schleifen sicher abgebrochen.

Manuelle Kontrolle

Eine Animation sollte manuell kontrollierbar sein, z.B. mit Start- und Stop-Tasten.
Erzeugen sie immer zuerst die Stop-Taste !

Der automatische Start (z.B. nach dem Laden der Datei oder nach dem Aktivieren eines Fensters) ist gefährlich (Endlos-Schleife) und wird von den AnwenderInnen wenig geschätzt.

Manuell ODER Automatisch

Eine gute Animation lässt jeden Schritt auch einzeln mit manueller Eingabe der Daten ausführen. Das ist schon bei der Entwicklung eine gute Hilfe. Später erlaubt es den AnwenderInnen, Details der Anwendung genau zu untersuchen.

Verwenden sie möglichst wenige, klar bezeichnete Zellen zur Eingabe der Daten = Steuerung der Animation. Für manuelle und automatische Eingabe werden am besten genau die gleichen Zellen verwendet.

Sperre

Für alle Eingabe-Zellen muss die Sperre aufgehoben werden. Eine Animation kann nur solche Zellen ändern, deren Sperre aufgehoben wurde !
Das gilt insbesondere auch für die "Zellverknüpfungen", d.h. für jene Zellen, in welche Bedienungselemente (Optionsfelder, Kontrollkästchen, Schieberegler) ihre Werte schreiben.

Ähnliches gilt für die Beschränkung des Werte-Bereichs mit Menübefehl   Daten | Gültigkeit:
Ein VBA-Programm darf nur zulässige Daten in eine Zelle schreiben.

Namen

Verwenden sie unbedingt (sprechende) Namen für alle wichtigen Zellen und Bereiche: Alle Zellen, die sich manuell oder automatisch ändern lassen (Vorgabe-Werte, Ergebnisse, ...).

Die Verwendung von Namen macht unabhängig von der jeweiligen Adresse (Spalte+Zeile). Außerdem sind sowohl Excel-Formeln als auch VBA-Programme mit Namen leichter zu verstehen als mit Adresssen.

Grafik

Das Ergebnis einer Animation wird fast immer als Grafik dargestellt. Zahlenwerte interessieren nur ausnahmsweise bei schrittweiser manueller Ausführung.
Fixieren sie die Skalen der Diagramme. Ansonsten ändert sich die Skala während der Animation oft und sprunghaft.
Das User-Interface (Sichtbarer Bereich, Bedienungs-Elemente) sollte in übersichtlicher Form umfassen:
Alle einstellbaren Vorgaben
Die erzeugte Grafik = Ergebnis.

Alle anderen Elemente sollten aus dem Gesichtsfeld verschwinden, z.B. auf andere Blätter der gleichen Datei.

Initialisierung

Es ist vorteilhaft, ein Programm vor dem Start in einen definierten Anfangs-Zustand zu versetzen:
Die Werte der Vorgaben werden eingestellt, die Animation wird gestoppt.
Das verbessert die Erkennbarkeit des Programms (auch die Grafik sieht beim Start gleich aus, am besten mit typischen Werten) und dient als Absicherung.

Damit wird auch das Speichern ungünstiger Werte der einstellbaren Vorgaben verhindert: AnwenderInnen neigen dazu, ein Programm zu beenden, das unerwartete oder unerwünschte Ergebnisse liefert. Man verhindert besser, dass beim Beenden des Programms solche Werte gespeichert werden.

Zufalls-Werte

Es hat sich oft bewährt, den einstellbaren Vorgaben sinnvolle Zufalls-Werte zuzuweisen. Das geschieht entweder bei Programm-Start oder auf ausdrückliche Anweisung (Button).

Details zu Zufalls-Zahlen @ VBA

Insbesondere bei einer großen Zahl von Vorgaben ergeben sich dadurch oft Modell-Situationen, an welche die/der AnwenderIn selbst nicht gedacht hat.
Das kann allerdings auch die/den EntwicklerIn treffen: Sichern sie ihr Programm so ab, dass es mit allen Kombinationen der Vorgaben funktioniert, oder zumindest unübersehbare Warnungen abgibt, wenn der vorgesehene Bereich verlassen wird.

Rückkopplung

In komplexen Modellen kommt es oft vor, dass sich berechnete Ergebnisse auf die Vorgaben auswirken. So kann ein geschlossener Regelkreis entstehen.
Es kann jedoch auch passieren, dass ein Modell unter bestimmten Bedingungen außer Kontrolle gerät.
Achten sie besonders darauf, keine Zirkel-Funktionen zu erstellen !

Eine Animation kann dabei helfen, einen Regelkreis in kleinen Schritten zu entwickeln:
Lesen sie mit dem Programm eines der Ergebnisse und tragen sie die geänderte Vorgabe erst im nächsten Schritt der Animations-Schleife ein.

DoEvents

Rechnung ohne Unterbrechung

Jede Berechnung eines Kalkulations-Programms wird normalerweise ohne Unterbrechung ausgeführt. Erst danach ("wenn Zeit ist...") werden Ereignisse behandelt, die während der Rechenzeit aufgetreten sind.
Solche Ereignisse (Events) sind beispielsweise:
Maus-Ereignisse z.B. Anklicken einer Bildschirm-Taste (Button), Tastatur-Ereignisse (Taste(n) gedrückt), ...

Während einer Animation wird eine Rechnung oft wiederholt, d.h. insgesamt ergibt sich eine lange Rechenzeit.
Auch in diesem Fall wird (ohne weitere Maßnahmen) die Animation bis zum Ende ausgeführt. Das kann lange dauern (bei Endlos-Schleifen unendlich lange) - Eine derartige Animation lässt sich im schlimmsten Fall nicht mehr abbrechen.

Ereignisse verarbeiten !

Die Anweisung DoEvents unterbricht das laufende Programm und lässt alle seither aufgetretenen Ereignisse verarbeiten. Erst danach wird das Programm mit der nächsten auf DoEvents folgenden Zeile fortgesetzt.
Die Ereignisse werden nicht von jenem Programm-Teil verarbeitet, in dem die DoEvents Anweisung steht !
Zur Verarbeitung von Events muss man eigene Programme (Event Handler) herstellen.

Event Handler

Ein einfaches Beispiel für einen Event Handler ist das Sub (Programm) ani_stop im ersten Beispiel dieser Seite.
Es wird ausgeführt, wenn der Stop-Button angeklickt wird.
Die Verknüpfung von Ereignis und Programm erfolgt durch Rechtsklick auf den Button und Einstellung von 'Makro zuweisen'
Der Event Handler ist ein eigenständiges Programm, welches nicht in das unterbrochene Programm eingreift !

Details zu Ereignissen (Events) @ VBA

Kommunikation

Den Austausch von Daten zwischen den Programmen muss man selbst programmieren. In diesem speziellen Fall muss das Animations-Programm auf Daten reagieren, die von einem oder mehreren Event Handlern erzeugt oder geändert wurden.
Das erfolgt am besten mit Hilfe von globalen Variablen.
Im Beispiel wird dazu die Variable ani verwendet, die nur die Werte True oder False annehmen kann, mit der Bedeutung: 'Animation läuft', bzw. 'ist angehalten'.

Globale Variable

Globale Variable werden in jedem VBA-Modul vor allen Funktionen und Subs deklariert:
Dim ani As Boolean
Alle Funktionen und Subs dieses Moduls haben auf die globalen Variablen Zugriff, d.h. sie können deren Werte lesen und schreiben.

Anwendung

Jedes Programm, welches die Animation abbrechen soll, braucht lediglich diese globale Variable zu ändern:
ani = False
Die Mitteilungen sind nicht auf das Abbruch-Kriterium beschränkt: Mit Hilfe von globalen Vriablen kann man einem laufenden Programm auch beliebige andere Daten mitteilen.
Im Ablauf der Berechnung muss zumindest einmal pro Animations-Schleife getestet werden, ob die Animation weitergeführt werden soll, z.B.
If ani Then ...
While ani ...
Mit Hilfe von bedingten Verzweigungen (If) oder Schleifen-Bedingungen wird die Berechnung entweder weitergeführt oder kontrolliert abgebrochen.
Tipp: Komplexe Berechnungen dauern länger und sind meist auf mehrere Subs aufgeteilt.
Ergänzen sie jedes einzelne länger laufende Programm durch eine Frage nach der Abbruch-Bedingung.
Dann wird der Abbruch rascher ausgeführt und keine der nicht mehr notwendigen Berechnungen ausgeführt.
Tipp: Erstellen sie ein eigenes Abbruch-Sub (hier: ani_exit), in dem alle Anweisungen zusammengefasst sind, die bei Abbruch auszuführen sind. Dieses Sub kann an vielen verschiedenen Stellen bei Bedarf aufgerufen werden:
If ani Then
' Berechnung ausführen
Else
Call ani_exit
End If
Ein einziges zentrales Abbruch-Programm (hier ani_exit) lässt sich übersichtlich verwalten. Darin sollte unbedingt die Anweisung
ScreenUpdating = True
(↓ nächstes Kapitel) enthalten sein.

ScreenUpdating

Aktualisierung

Wenn sich der Wert einer Zelle ändert, dann wird das am Bildschirm angezeigt, "wenn Zeit ist". Bei kleinen Rechnungen ist die Wartezeit unmerkbar kurz.
Danach werden alle abhängigen Zellen berechnet, d.h. solche, deren Formeln den Wert der geänderten Zelle verwenden.
Wenn alle Rechnungen ausgeführt sind, dann werden die Diagramme aktualisiert.
Flackern:
Wenn die Rechenzeit einer Animation in die Größenortdnung von 0.1 sec pro Schleife gelangt, dann wird auch die Grafik mit dieser Frequenz aktualisiert. Das ergibt ein unangenehmes und unruhiges Bild.
Durch gezielte Steuerung der Aktualisierung lässt sich dieser Effekt verhindern.
Die Methode ScreenUpdating steuert die Aktualisierung von Zellen-Werten und Diagrammen.
Application.ScreenUpdating = False
'...umfangreiche Rechnungen
Application.ScreenUpdating = True
Calculate
Zu Beginn der Berechnung (am Anfang der Animations-Schleife) schaltet man die automatische Aktualisierung ab.
Ab nun kann sich der PC auf die Berechnung konzentrieren, der Bildschirm wird nicht geändert.
Das ergibt wesentlich kürzere Rechenzeiten, außerdem bleibt das Bild während der Rechnung ruhig.
Nach Abschluss der Rechnungen (am Ende jeder Animations-Schleife) muss man die Aktualisierung wieder einschalten.
Meist wird zur Sicherheit auch der Befehl zur Neu-Berechnung Calculate erteilt.
Nun werden die Werte aller Zellen und die Diagramme aktualisiert.
Bei besonders langen Rechnungen kann man mit der Aktualisierung nicht bis zum Ende warten: In diesem Fall sorgt man mit ↓ Events für die regelmäßige Anzeige von Zwischen-Ergebnissen.

Events

Jede gute Animation muss auf → Ereignisse (Events) reagieren. Insbesondere bei Abbruch (Stop-Taste, Erreichen einer Abbruch-Bedingung, ...) muss die Aktualisierung unter allen Umständen wieder eingeschaltet werden !

Tipp: Erstellen sie für das Ende der Animation ein eigenes Sub (VBA-Programm), welches alle für diesen Fall gewünschten Arbeiten ausführt.
Von allen Stellen, an welchen der Abbruch erfolgen kann, wird dieses Sub aufgerufen.
Tipp: ScreenUpdating steuert nicht die Berechnung, sondern nur die Bildschirm-Anzeige. Das ist ein wesentlicher Unterschied zur Eigenschaft Calculation (nächstes Kapitel). Es ist theoretisch möglich, den Wert einer Zelle bei abgeschalteter Aktualisierung mit VBA zu ändern, und diesen Wert in einem späteren Programm-Teil zu lesen und zu verwenden.
Das ist allerdings gefährlich schlechter Stil.
Daten, die von mehreren VBA-Programmen verwendet werden, sollte man immer in globalen Variablen speichern, keinesfalls in Excel-Zellen !
Tipp: Wenn sehr viele Zellen Formeln enthalten, dann dauert die Aktualisierung unangenehm lange. In diesem Fall führt man die Aktualisierung nicht bei jedem Schleifen-Durchlauf aus. Fügen sie einen kleinen Zähler in die Animations-Schleife ein, und aktualisieren sie den Bildschirm nur in jedem 2. oder 10. Durchlauf der Schleife...

Calculation

Die Eigenschaft Calculation steuert die Ausführung von Berechnungen.
Manuelle Einstellung im Kalkulations-Programm mit Menü   Extras | Optionen | Berechnung: Man kann zwischen automatisch und manuell wählen.
Die Standard-Einstellung ist 'automatisch':
Unmittelbar nach jeder Änderung werden alle abhängigen Zellen neu berechnet. Das erfolgt bei kleinen Kalkulationen in unmerkbar kurzer Zeit.
Bei Einstellung 'manuell' wird auch nach einer Änderung nicht gerechnet: Alle anderen Zellen und Diagramme bleiben unverändert.

Diese Maßnahme ist sinnvoll, wenn z.B. eine längere Rechnung von mehreren Variablen abhängt:
Man wartet ab, bis alle Vorgaben eingestellt sind und rechnet erst dann, z.B. mit Taste F9 oder mit VBA-Anweisung Calculate
Im Gegensatz zur Eigenschaft ScreenUpdating (voriges Kapitel) erfolgt überhaupt keine (automatische) Berechnung. Die Aktualisierung des Bildschirms ist daher irrelevant - Es hat sich ohnehin nichts geändert.

Jetzt berechnen !

Die Anweisung Calculate erwzingt in jedem Fall eine komplett neue Berechnung. Man kann sie verwenden, um bei manuell eingestellter Berechnung eine neue Berechnung auszuführen.

Auch bei automatischer Einstellung wird eine neue Berechnung durchgeführt - Das betrifft z.B. Zellen mit Funktionen wie =ZUFALLSZAHL() oder =JETZT()
Führen sie am Ende jeder Animation sicherheitshalber diese Anweisung aus.
Ebenso wie die Eigenschaft ScreenUpdating (voriges Kapitel) kann Calculation dazu verwendet werden, die VBA-Berechnung zu beschleunigen. Auch eine Kombination der beiden Eigenschaften ist möglich (jedoch nicht sehr sinnvoll).
Application.Calculation = xlCalculationManual
'...umfangreiche Rechnungen
Application.Calculation = xlCalculationAutomatic
Calculate
Die Anwendung erfolgt genauso wie bei ScreenUpdating beschrieben. Wichtig: Sorgen sie dafür, dass am Ende der Animation (bei Abbruch) unbedingt die automatische Berechnung wieder hergestellt wird:
Application.Calculation = xlCalculationAutomatic

Initialisierung

Jedes Programm sollte vor Beginn in einen definierten Anfangs-Zustand gebracht werden.
Eine sinnvolle Variante ist es, die Vorgaben so einzustellen, dass die Grafik ein für das jeweilige Modell typisches Aussehen hat.
Legen sie selbst fest, ob die Initialiserung automatisch erfolgen soll. Eine manuelle Initialisierung sollte unabhängig davon immer möglich sein.
Excel fragt beim Schließen einer Datei, ob geänderte Daten gespeichert werden sollen. Das ist nur selten sinnvoll und bei Animationen meist unerwünscht.
Mit Hilfe einer Initialisierung kann man diseses Problem umgehen: In diesem Fall ist es gleichgültig, ob und welche Daten beim Schließen gespeichert wurden.
Ein besonders unangenehme Situation entsteht, wenn ein Modell versagt, den vorgesehenen Werte-Bereich verlässt, die Garfik unverständlich wird, etc.
AnwenderInnen neigen dazu, in diesem Fall das Programm zu schließen und neu zu starten.
Wenn das Programm jedoch mit genau den fehlerhaften oder unverständlichen Daten gespeichert wird, dann zeigt es auch nach Neustart das gleiche Verhalten.
Insbesondere diesen Fall verhindert eine Initialisierung.

Initalisierungs-Programm


Zuerst werden Werte an die globalen VBA-Variablen zugewiesen - im Falle der Animation als erste die Variable ani, damit eine allfällig laufende Animation sicher abgeschaltet wird.

Danach ein Beispiel für die Berechnung von
pi = 3.141592...
Alle ähnlichen Variablen werden nur einmal berechnet und dann beliebig oft verwendet (spart Rechenzeit !).

Wenn keine Berechnung notwendig ist, definiert man solche Daten als Const (Beispiel erd_radius).

Nach den VBA-Daten werden die Werte der Excel-Zellen zugewiesen. Im Beispiel wird je eine Zelle mit Adresse (A1 - schlechter Stil) und Name (r_erde - guter Stil) initialisiert.

Es ist guter Stil, das jeweilige Arbeitsblatt (Sheet) ausdrücklich nach vorne zu bringen. Das schadet nichts, wenn es ohnehin geöffnet ist, und erspart andernfalls viel Ärger.
Einfaches Beispiel für ein Initialisierungs-Programm:
' Globale Konstanten und Variable:
Const erd_radius As Integer = 6367445
Dim ani As Boolean
Dim pi As Double

Sub init()
ani = False
pi = 4 * Atn(1)
Sheets("Vorgaben").Select
Range("A1").Value = 123
Range("r_erde").Value = erd_radius
End Sub

Das Initialisierungs-Programm darf keinesfalls Private deklariert werden: In diesem Fall könnte man es werder an einen Button zuweisen noch mit → Workbook- oder → Worksheet-Events auslösen !

Einstellbare Vorgaben

Alle Excel-Zellen mit einstellbaren Vorgaben sollten auf diese Weise initialisert werden. Der Schreib-Schutz für diese Zellen muss aufgehoben werden !
Es ist sinnvoll, mit Menü Daten | Gültigkeit den Werte-Bereich einer Zelle einzuschränken Dann kann man allerdings auch mit VBA nur erlaubte Werte eintragen !

Namen für Zellen und Bereiche

Verwenden sie in VBA-Programmen möglichst keine Adressen von Zellen (z.B. A1).
Wenn die Zelle verschoben wird, wenn Zeilen oder Spalten eingefügt oder gelöscht werden, dann ändert sich die Adresse der Zelle, jedoch nicht ihr VBA-Programm: Es liest oder schreibt danach von/an eine falsche Zelle.
Vergeben sie unbedingt Namen für alle in VBA verwendeten Zellen ! - In diesem Fall adressiert ihr VBA-Programm die richtige Zelle - Auch nach einer Änderung von Zeilen oder Spalten.

Manuelle Initialisierung

Dazu stellen sie (wie im ersten Beispiel dieser Seite beschrieben) einen Button her.
Weisen sie dem Button mit Rechtsklick das Programm init zu.
Klick auf den Button unterbricht eine allfällig laufende Animation und führt die Initialisierung durch.

Tipp: Es ist möglich, mehrere init-Programme (und Buttons) vorzusehen. Jeder davon versetzt das Animations-Modell in einen anderen definierten Zustand.

Tipp: Eine besondere Form der Initialiserung kann auch ganz oder teilweise mit Zufalls-Daten erfolgen. Das sollte jedoch besser nicht automatisch sondern nur mit Klick auf einen Zufalls-Button erfolgen.

Automatische Initialisierung

(1) Wechseln sie zu VBA:
(2) Öffnen sie im Projekt-Fenster das Icon DieseArbeitsmappe (Doppelklick)
(3) Wählen sie aus den beiden Listen (am oberen Rand des Code-Fensters) Workbook und Open
Ein leeres Sub wird automatisch erzeugt.
Tragen sie das gewünschte Initialisierungs-Programm (hier init) ein.
Das Ereignis Workbook_Open tritt nach dem Öffnen der Datei einmalig ein. In diesem Fall wird die Initialiserung ausgeführt.
(4) Öffnen sie im Projekt-Fenster das Icon mit dem Namen des gewünschten Arbeitsblatts (z.B. 'Tabelle1', besser 'Vorgaben').
(5) Wählen sie aus den beiden Listen Worksheet und Activate
Tragen sie ihr Programm ein.
Event Workbook_Open tritt einmalig beim Öffnen der Datei auf:
Private Sub Workbook_Open()
Call init
End Sub
Wenn die Initalisierung hier vorgenommen wird, dann sollte das Programm init unbedingt das Arbeitsblatt (Sheet) auswählen, bevor Daten eingetragen werden !

Event Worksheet_Activate tritt bei jeder Auswahl des betreffenden Arbeitsblatts auf, d.h. wenn man von einem anderen zu diesem Arbeitsblatt wechselt.
Private Sub Worksheet_Activate()
Call init
End Sub

Multi-Funktions Button

Ein interessantes Detail ist ein kombinierter Start-Stop-Button.
Das spart Platz und verbessert die Ergonomie: Der Button bietet jeweils genau die passende Funktion und darüber hinaus durch Beschriftung und Farbe zusätzliche Information über den Zustand.
Dieses Kapitel zeigt ein Beispiel, wie man Aussehen, Beschriftung und Funktion eines Buttons zu einem Multifunktions-Element ändert.
 AB
15


Simulation mit Multifunktions-Button und Reset (Initalisierung)

Button-Namen

Erzeugen sie einen neuen Button, der als Multifunktions-Taste dienen soll.
Weisen sie dem Button das Programm ani2_start zur Ausführung zu.
Neu erstellte Buttons haben meist unhandliche Namen. Markieren sie den Button mit Rechtsklick oder Strg+Klick. Der Name wird im Namensfeld (links oberhalb von Spalte A des Arbeitsblatts) angezeigt, z.B. Schaltfläche 1

Ändern sie den Namen (z.B. auf StartStop ) und quittieren sie mit der Eingabe-Taste. Zur Kontrolle klicken sie den Button nochmals an und sehen nach, ob der Name wirklich so geändert wurde wie gewünscht.

Tipp: Ändern sie die Namen aller Buttons, anderer Bedienungs-Elemente, Diagramme, usw. auf sinnvolle Namen.

Button-Eigenschaften

Jeder Button ist ein Shape ( "Grafik-Objekt").
Das Beispiel zeigt, wie man eine Variable (hier sh) mit dem Shape verknüpft und seine Eigenschaften liest.

Ein Meldungs-Fenster gibt die aktuellen Eigenschaften des Shape-Objekts mit dem Namen "StartStop" aus. Ändern sie den Objekt-Namen nach Bedarf.
Zur Ausführung wird das Programm entweder (Rechtsklick, Makro zuweisen) einem Shape zugewiesen, oder es wird mit Menübefehl gestartet: Extras | Makro | Makros | test | Ausführen.
Zugang zu den Eigenschaften eines Shape:
Sub test()
Dim t As String
Dim sh As Shape
t = "StartStop"
Set sh = ActiveSheet.Shapes(t)
sh.Select
t = t & vbCrLf& "Text = "
t = t & Selection.Characters.Text
t = t & vbCrLf& "Farbe = "
t = t & Selection.Font.ColorIndex
t = t & vbCrLf& "Programm = "
t = t & sh.OnAction
MsgBox t
End Sub
Die beiden Programme ani_stop (Beispiel 1) und ani2_start (Beispiel 2) werden entsprechend ergänzt:

Gleichzeitig mit Start und Stop der Animation werden auch die Eigenschaften des einzigen notwendigen Buttons geändert.

Beachten sie die Reihenfolge der Anwqeisungen:
Beim Start werden zuerst die Button-Eigenschaften geändert, danach die Animations-Schleife gestartet.
Beim Abbruch wird zuerst die Animation gestoppt, danach der Button eingestellt.

Es ist typisch, dass die Anweisungen für das User-Interface (weit) mehr Umfang haben als jene für das 'eigentliche' Programm. Das kommt umso stärker zum Ausdruck, je mehr Komfort und Sicherheit sie in das Programm einbauen.

Details zum Thema Farbe @ VBA
Sub ani2_start()
Dim sh As Shape
Set sh = ActiveSheet.Shapes("StartStop")
sh.OnAction = "ani_stop"
sh.Select
With Selection
.Characters.Text = "Stop"
.Font.ColorIndex = 3
End With
ani = True
While ani
Call ani2_do
Wend
End Sub

Sub ani_stop()
Dim sh As Shape
ani = False
Set sh = ActiveSheet.Shapes("StartStop")
sh.OnAction = "ani2_start"
sh.Select
With Selection
.Characters.Text = "Start"
.Font.ColorIndex = 10
End With
End Sub
Tipp: Die Änderung von Eigenschaften ist nicht auf Buttons beschränkt.
Andere Beispiele:
Zellen: Wert, Format, Farbe, Hintergrund, ...
Shapes: (Rechtecke, Pfeile, ...): Sichtbarkeit, Farbe, Größe, Position, Programm (OnAction), ...
Vermeiden sie reine Spielerei: Es lenkt ab und ist meist unerwünscht, wenn sich in jeder Ecke ihrer Animation ständig etwas bewegt.
Sparsam eingesetzt kann jedoch der Wert einer Lösung dadurch stark verbessert werden: Optische Hinweise sind wesentlich einfacher und rascher zu erfassen als z.B. Zahlen-Werte.