FOS 12 T 1 Informationstechnik 2 Einführung in VBA Seite 1 Einführungsbeispiel: Click dein Glück Mit Hilfe eines Formulars in MS-Access soll ein Glücksspiel aufgebaut werden. Nach Drücken der Taste "Start" wird eine dreistellige Zufallszahl erzeugt. Stimmen zwei Zahlen überein gewinnt man einen kleinen Preis, stimmen alle drei Zahlen überein, gewinnt man den Hauptpreis. (Natürlich handelt es sich nur um virtuelle Preise!) 1.1 Funktionsweise Das Drücken der Taste Start ("Befehlsschaltfläche") startet den hinterlegten VBA-Code, der drei Zufallszahlen erzeugt und in die Textfelder schreibt. Die Zahlen werden auf Gleichheit geprüft und je nach Ausgang der Prüfung erfolgt als Output eine entsprechende Rückmeldung. In unserem Fall sollen die Gewinnzahlen farbig hinterlegt werden (zwei gleiche Zahlen: grün, drei gleiche Zahlen: rot). 1.2 Ein – Ausgabegestaltung und Formularerstellung Es ist sehr vorteilhaft für die Ein- und Ausgabe ein Formular zu verwenden, da man hierdurch sehr schnell und einfach eine ansprechende Programmoberfläche mit ihren Objekten (in einem Access- Formular werden sie als Steuerelemente bezeichnet) zur Verfügung hat. Die Gestaltung des dem jeweiligen Programm zugehörigen Formulars soll im folgenden anhand einiger typischer Beispiele dargestellt werden. 1.2.1 Zugehöriges Formular erstellen Access wird geöffnet und man wechselt in das Objektfenster für Formulare. Um ein neues Formular zu erstellen wählt man die Option „neu“. Verschiedene Möglichkeiten zur Erstellung eines Formulars FOS 12 T Informationstechnik 2 Einführung in VBA Seite 2 Bei der nächsten Frage des Assistenten wählt man die voreingestellte Option „Entwurfsansicht“. So erhält man eine leere Seite für ein Formular. Nun geht man in den Vollbildmodus und stellt die Breite und Höhe des Formulars (mit Hilfe der Lineale) auf die gewünschten Werte (z. B. Breite 15 cm, Höhe 10 cm ein. Eine genauere Einstellung kann später noch vorgenommen werden , insbesondere mit Hilfe des Eigenschaftsfensters für das gesamte Formular. Nun wählt man aus dem Hauptmenü die Option Ansicht und hier den Unterpunkt Formularkopf/fuß, um den Formularkopf und Fuß anzuzeigen. Da der Formularfuß nicht benötigt wird, stellt man dessen Höhe auf 0 cm ein; anschließend wird der Formularkopf auf eine Höhe von 1,2 cm eingestellt. Um dies genau vornehmen zu können, benutzt man das Eigenschaftsfenster für den Formularkopf. Man öffnet dieses Fenster am besten, indem man einen Doppelklick auf die Leiste für den Formularkopf ausführt. Nun erscheint das Eigenschaftsfenster des Formularkopfes, in dessen Kopfzeile steht der Name des Objekts, dessen Eigenschaften angezeigt werden (in diesem Fall: Bereich Formularkopf). Nun stellt man die Eigenschaft Höhe auf den gewünschten Wert (1,2 cm) ein Man darf sich nicht wundern, dass bei bestimmten Werten (wie hier 1,2) eine ganz exakte Einstellung nicht möglich ist. Es werden nur 1,199 cm angezeigt. Bei gewissen Werten ist die Einstellung nur auf 0,001 cm möglich (dies liegt wohl am ursprünglich verwendeten amerikanischen Maßsystem). Alternativ dazu kann man auch den Detailbereich-Balken bei gedrückter linker Maustaste nach unten ziehen. FOS 12 T Informationstechnik 2 Einführung in VBA Seite 3 Nun werden mit Hilfe der Toolbox einige Objekte im Formularkopf konstruiert: Als ersten erstellen wir eine Schaltfläche mit deren Hilfe man das Formular schließen kann. Die Toolbox mit einschalten und den Steuerelementassistenten aktivieren. 1. Befehlsschalfläche mit der Maustaste Anklicken. 2. Mit dem Mauszeiger im Formularkopf an die Position gehen, an der die Befehlsschaltfläche gewünscht wird. 3. Mit gedrückter Maustaste die Größe der Schaltfläche erstellen. 4. Maustaste loslassen. Es meldet sich der Assistent für die Befehlsschaltfläche. Steuerelementassistenten eingeschaltet (Zauberstab) Textfeld Bezeichnungsfeld Kombinationsfeld Toolbox mit Anleitung für Erstellen einer Befehlsschaltfläche Aus dem Menü des Assistenten werden die Optionen „Formularoperationen“ und „Formular schließen“ ausgewählt. Im nächsten Menüpunkt wird die vorgeschlagene Option (Symbol einer sich schließenden Türe) übernommen und der Button „Weiter“ gedrückt. Bei der letzten Frage des Assistenten wird die Option „Fertig stellen“ gewählt. Nun erhält man die Schaltfläche mit der gewünschten Eigenschaft. Speichert man das Formular ab und geht aus der Entwurfsansicht in die Formularansicht, kann man die Funktion des Schalters gleich austesten. FOS 12 T Informationstechnik 2 Einführung in VBA Seite 4 Um die Schaltfläche optisch im Formular an die exakte Stelle zu setzen, kann man sie bei gedrückter linker Maustaste verschieben bzw. auch in der Größe verändern. Anschließend erstellen wir noch eine Überschrift in unserem Formular Bezeichnungsfeld Dies geschieht wiederum mit Hilfe der Toolbox. Diesmal wählen wir das Symbol für ein Bezeichnungsfeld (Seite 3). Wir ziehen dieses Symbol an die gewünschte Position und erstellen ein Rechteck in der vorgesehenen Größe. Anschließend wird der Text in dieses Rechteck eingefügt und formatiert (z. B. Schriftart und Schriftgröße). 1.2.2 Programmobjekte in das Formular einbauen Nun werden die für das Programm notwendigen Objekte (Steuerelemente) in das Formular eingebaut. Dies geschieht wieder mit Hilfe der Toolbox. In der Regel sind die im Formular verwendeten Objekte (Steuerelemente) Größen, die in irgendeiner Form (z. B. als Variable) im Programmcode angesprochen und als Eingabe- oder Ausgabegrößen verwendet und häufig auch verändert werden. Textfelder ohne Bezeichnung (hier für die Ausgabe der Glückszahlen verwendet) FOS 12 T Informationstechnik 2 Einführung in VBA Seite 5 Beim Erzeugen eines Steuerelementes wird diesem vom System automatisch ein Name zugewiesen (z. B. Text6 für ein Textfeld, Bezeichnungsfeld7 für ein Bezeichnungsfeld). Diese Namen sind im Normalfall nicht sehr aussagekräftig und für die weitere Verwendung ungeeignet. Deshalb ist an dieser Stelle eine sinnvolle Namensvergabe angebracht. Wir vergeben für das Textfeld für die Glückszahl 1 den Namen „txt_zahl1“ und für die weiteren Ausgabefelder txt_zahl2 und txt_zahl3. Diese Bezeichnungen werden im Eigenschaften-Fenster eingetragen. Nun wird die Befehlsschaltfläche mit der Beschriftung "Start" eingebaut. Brechen Sie den Steuerelementassistenten ab und nehmen Sie alle Eintragungen direkt im Eigenschaftenfenster vor (Beschriftung "Start" mit Schriftgrad 20, Name: butt_start, Beim Klicken: Ereignisprzedur) 1.2.3 Erstellen des Programmcodes Der Programmcode soll ausgeführt werden, wenn die Befehlsschaltfläche "Start" gedrückt wird. Die Befehlsschaltfläche erhält den Namen „butt_start“ und im Eigenschaftsfenster wird dieser Schaltfläche bei dem Ereignis „Beim Klicken“ der zugehörige Code hinterlegt. Dies geschieht folgendermaßen: Die Schaltfläche „butt_start“ wird markiert und im zugehörigen Eigenschaftsfenster wird der Cursor in die Zeile mit dem Ereignis „beim Klicken“ gesetzt. Auf der rechten Seite des Eigenschaftsfensters erscheint ein Klapppfeil. Beim Öffnen werden zwei Möglichkeiten angezeigt. Wir wählen die Option „[Ereignisprozedur]“. Anschließend drücken wir die 3 Punkte neben dem Klapppfeil und wechseln dadurch in den VBA-Editor zur Erstellung des Programmcodes. Man befindet sich automatisch im Rumpf der Prozedur, die durch das Ereignis (in unserem Beispiel „beim Klicken“) ausgelöst wird. Private Sub butt_start_Click() Prozedurrumpf Hier wird der VBA-Code eingegeben! End Sub FOS 12 T Informationstechnik 2 Einführung in VBA Seite 6 Die Prozedur beginnt mit Sub (Abkürzung für Subroutine - Unterprogramm) und endet mit End Sub. Dazwischen liegt der Prozedurrumpf (hier werden Deklarationen vorgenommen bzw. wird der Programmcode eingetragen). Ist eine Prozedur / Funktion nur lokal gültig (z. B. nur für ein bestimmtes Formular oder ein bestimmtes Modul), steht vor dem Schlüsselwort Sub das Schlüsselwort Private. Dies hat u. a. den Vorteil, dass die gleichen Namen für verschiedene Prozeduren in unterschiedlichen Formularen / Modulen verwendet werden können. Will man die Prozedur für mehrere Formulare oder Module verwenden, aber nur einmal schreiben, so stellt man das Schlüsselwort Public voran. Beachten Sie bereits hier die Umschaltmöglichkeiten zwischen Formularbereich und dem VBA-Monitor mit Hilfe der Hot-Keys [Alt]+[F11] und [Alt]+[Q] !! Zwischen Private.... und End wird nun der Prozedurrumpf entworfen. 1.3 Erstellung des VBA-Programmcodes 1.3.1 Lineare Sequenz Im ersten Schritt wird eine kleine lineare Sequenz programmiert, in der drei Zufallszahlen zwischen 0 und 9 erzeugt und in den drei Fenstern ausgegeben werden. Private Sub butt_start_Click() Randomize txt_zahl1 = Int(10 * Rnd() ) txt_zahl2 = Int(10 * Rnd() ) txt_zahl3 = Int(10 * Rnd() ) End Sub Benötigte Befehle und Anweisungen: Randomize initialisiert den Zufallsgenerator Rnd() liefert eine Zufallszahl mit Dezimalstellen zwischen 0 und 1 Int( ) gibt den Vorkommawert einer Zahl zurück Testen Sie die Funktion dieses VBA-Codes! FOS 12 T Informationstechnik 2 Einführung in VBA Seite 7 1.3.2 Verzweigungsstruktur Im zweiten Schritt sollen die erzeugten Zufallszahlen auf Gleichheit geprüft werden und das Ergebnis farbig dargestellt werden (zwei gleiche Zahlen grün, drei gleiche Zahlen rot). Da die durch die Fenster zugeordneten Variablen im Programmcode mehrfach verwendet werden, ist es sinnvoll, für diese neu definierte Kurzbezeichnungen einzuführen. Für die Programmierung in VBA sind folgende Datentypen möglich: (aus Bernd Held, VBA mit Access, Verlag Markt + Technik) Programmablaufplan: Benötigte Befehle und Anweisungen: - Variablen für die Zufallszahlen deklarieren Dim ermöglicht die Deklaration von selbst erstellten Variablen - Farben Schwarz, Rot, Grün definieren RGB(r,g,b) mischt die Farbe aus den drei Komponenten rot, grün und blau. Dabei sind für r,g,b Werte von 0 bis 255 zulässig. - den Fenstern Farbe Schwarz zuweisen - drei Zufallszahlen erzeugen, in Variablen speichern und in Fenstern ausgeben - Zahlen auf Gleichheit prüfen und Farbe zuordnen ForeColor definiert über RGB die Farbe des Textes. Die Syntax für die Mehrfachverzweigung lautet: If Kriterium 1 Then Anweisungen ElseIf Kriterium 2 Then Anweisungen End If FOS 12 T Informationstechnik 2 Einführung in VBA Seite 8 Ändern Sie den in der Schaltfläche Start hinterlegten Programmcode wie folgt ab und ergänzen Sie die fehlenden Programmteile. Kopieren Sie Ihr fertiges Programm in WORD und drucken Sie es von dort aus. Private Sub butt_start_Click() Dim a As Byte Dim b As Byte Dim c As Byte schwarz = RGB(0,0,0) grün = RGB(0,255,0) rot = RGB(255,0,0) txt_Zahl1.ForeColor = schwarz txt_Zahl2.ForeColor = schwarz txt_Zahl3.ForeColor = schwarz Randomize a = Int(10 * Rnd() ) txt_Zahl1 =a b = Int(10 * Rnd() ) txt_Zahl2 = b c = Int(10 * Rnd() ) txt_Zahl3 = c If a=b And b<>c Then txt_Zahl1.ForeColor = grün txt_Zahl2:ForeColor = grün ElseIf …….. End If End Sub Speichern Sie Ihr Programm ab und testen Sie die Funktion dieses VBA-Codes. (Falls Sie keine drei gleichen Zahlen erhalten, reduzieren Sie die Erzeugung der Zufallszahlen auf 0 bis 3) FOS 12 T 4. Informationstechnik 2 Einführung in VBA Seite 9 Projekt Spielautomat In mehreren Schritten soll ein Spielautomat mit folgender Funktion programmiert werden: Durch Drücken der Start-Taste setzen sich die drei Zahlenräder in Bewegung und erzeugen jeweils die Ziffern von 0 bis 9 solange, bis durch Drücken der Stop-Tasten von links nach rechts die Räder angehalten werden. 4.1 Zählergesteuerte Schleifen Bei zählergesteuerten Schleifen wird ein Programmcode so oft wiederholt, bis die Zählervariable den Endwert erreicht hat. Dann wird die auf die Schleife folgende Anweisung ausgeführt. Kopieren Sie zunächst das Formular vba-1 und geben Sie der Kopie den Titel automat-1. Der hinter dem Schalter Start abgelegte Programmcode wird jetzt durch eine Zählschleife so abgeändert, dass die drei Fenster als Zahlenräder die Ziffern von 0 bis 9 durchlaufen. Dazu müssen die Fensterinhalte vor jeder Änderung durch die Anweisung Me.Repaint zurückgesetzt werden. Durch eine zweite Schleife, die von 1 bis 10000000 zählt, kann die Geschwindigkeit der Zahlenräder herabgesetzt werden. Erstellen Sie zunächst folgenden VBACode: Private Sub butt_start_Click() Dim i As Byte Dim k As Long For i = 0 To 9 Me.Repaint txt_zahl1 = i txt_zahl2 = i txt_zahl3 = i For k = 1 To 10000000 k = k+1 Next Next Testen Sie die Funktion dieses VBACodes. Benötigte Befehle und Anweisungen: For zähler=Anfang To Ende Anweisung 1 Anweisung 2 usw. Next Anfang legt den Startwert des Zählers fest, Ende gibt den Endwert an. Nach Durchlaufen der Zählschleife wird die auf Next folgende Anweisung ausgeführt. Das Schlüsselwort Me erlaubt den Zugriff auf alle Steuerelemente des aktiven Formulars. Das Steuerelement Repaint setzt die Variablen zurück. FOS 12 T Informationstechnik 2 Einführung in VBA Seite 10 Erweitern Sie den Programmcode so, dass die Zahlenräder zehn mal die Werte von 0 bis 9 durchlaufen. 4.2 Sub-Prozeduren Durch Prozeduren kann ein Programm in kleine logische Einheiten unterteilt werden. Der Aufruf einer Sub-Prozedur aus einem Programm erfolgt durch Call prozedurname. Beispiel: Kopieren Sie das Formular automat-1 und nennen Sie es automat-2. Erstellen Sie für die Pausenschleife in automat-2 folgende Prozedur: Private Sub pause Dim k As Long For k = 1 To 10000000 k = k+1 Next End Sub Ändern Sie jetzt den Programmcode von butt_start so ab, dass die Prozedur aufgerufen werden kann und testen Sie das Programm. 4.3 Fußgesteuerte und kopfgesteuerte Schleifen Die fußgesteuerte Schleife wiederholt einen Block mit Anweisungen, solange eine Abbruchbedingung den Wert True erhält. Die Bedingung wird jeweils am Ende der Schleife geprüft, d.h. der Anweisungsblock wird mindestens einmal durchlaufen. Die kopfgesteuerte Schleife prüft die Abbruchbedingung am Anfang der Schleife, d.h. der Anweisungsblock wird möglicherweise übersprungen. fußgesteuerte Schleife kopfgesteuerte Schleife Syntax: Syntax: Do Anweisung 1 Anweisung 2 usw. Loop Until Bedingung Do While Bedingung Anweisung 1 Anweisung 2 usw. Loop Ist die Abbruchbedingung erfüllt, wird die nach Loop folgende Anweisung ausgeführt. Wenn die Bedingung nicht erfüllt ist, wird die nach Loop folgende Anweisung ausgeführt. Aufgabe: FOS 12 T Informationstechnik 2 Einführung in VBA Seite 11 Erzeugen Sie das Formular automat-3 und ändern Sie dort den Programmcode so ab, dass der zehnmalige Durchlauf der Zahlenräder fußgesteuert erfolgt. 4.4 Programmstop durch Tastendruck In einem Formular automat-4 wird nun der Programm-Code so abgeändert, dass durch Drücken von Stopp-Tasten die Zahlenräder nacheinander gestoppt werden können. Da das Drücken der Stopp-Tasten als neue, von außen erfolgende Aktivität innerhalb der von der Start-Taste ausgelösten Prozedur wirkt, muss durch einen geeigneten Befehl die Prozedur kurz angehalten und geprüft werden, ob weitere Ereignisse vorliegen. Der dafür verantwortliche Befehl lautet: DoEvents Um zu prüfen, ob zum Beispiel die Taste stopp1 gedrückt ist oder nicht, muss dafür eine Variable stopp1_gedrückt festgelegt werden, die nur zwei Zustände annehmen kann: stopp1_gedrückt = false (Taste nicht gedrückt) stopp1_gedrückt = true (Taste gedrückt) Solche Variablen sind vom Typ Boolean Aufgabe: Erzeugen Sie zunächst drei Befehlsschaltflächen butt_stopp1, butt_stopp2 und butt_stopp3 mit der Beschriftung Stopp wie im Bild auf Seite 10 und wählen Sie im Register Ereignis die Einstellung beim Klicken – Ereignisprozedur . Definieren Sie zunächst vor dem ersten VBA-Code für jeden Schalter eine Boolsche Varable wie oben beschrieben. Dadurch kann auf diese Variablen von mehreren Unterprogrammen zugegriffen werden. Setzen Sie jetzt im VBA-Code von Start die drei Variablen auf „nicht gedrückt“ und ersetzen Sie den Programmcode durch folgende Anweisungen: i=0 Do Me.Repaint txt_zahl1 = i txt_zahl2 = i txt_zahl3 = i Call pause i=i+1 If i = 10 Then i=0 End If DoEvents Loop Until stopp1_gedrückt = True End Sub Schreiben Sie jetzt in den VBA-Code von butt_stopp1 die Anweisung: stopp1_gedrückt=true Speichern Sie das gesamte Programm und testen Sie die Funktionsweise. FOS 12 T Informationstechnik 2 Einführung in VBA Seite 12 Durch Ändern des Endwerts in der Sub-Prozedur pause kann die Drehgeschwindigkeit der Zahlenräder erhöht werden. Wählen Sie z.B. den Wert 5000000. Erweitern Sie jetzt den VBA-Code so, dass nach Drücken der stopp1-Taste nur noch die Zahlenräder 2 und 3 weiterlaufen, dann nach Drücken der stopp2-Taste lediglich das rechte Rad sich dreht und dieses schließlich durch Drücken der stopp3-Taste angehalten wird. 4.5 Ein- und Ausblenden von Steuerelementen Ein Blick auf das Eigenschaftsfenster der Steuerelemente zeigt, dass das Merkmal „sichtbar“ mit ja bzw. nein gekennzeichnet werden kann, d.h. es handelt sich hier um eine Boolsche Variable. Der VBA-Code dazu heißt variable.Visible=true bzw. variable.Visible=false. Aufgabe: Setzen Sie in einem neuen Formular automat-5 beim Programmstart die Schalter Stopp2 und Stopp3 auf „unsichtbar“ und lassen Sie den Schalter erst dann sichtbar werden, wenn er für das Stoppen des jeweiligen Zahlenrades benötigt wird. Zusatzaufgabe: Je nach Ausgang des Spiels soll nach Anhalten des dritten Zahlenrades eine Auswertung des Ergebnisses mit Einblendung eines Kommentars erfolgen, z,B. 3 gleiche Ziffern 2 gleiche Ziffern 3 verschiedene Ziffern „VOLLTREFFER“ „FAST GETROFFEN“ „SCHADE“ Erstellen Sie dazu ein Textfeld für die Ausgabe und ändern Sie den Code so, dass je nach Ausgang des Spiels der zugehörige Text erscheint.