1 Visual Basic for Application mit Excel (VBA)
Transcription
1 Visual Basic for Application mit Excel (VBA)
Informatikfreikurs WS 2008/2009 1 1.1 1 Visual Basic for Application mit Excel (VBA) Mosaik Puzzle Das untenstehende Zahlenschema ist ein sogenanntes Mosaik Puzzle. Jede Zahl zeigt an, wie viele der (höchstens 8) angrenzenden Quadrate auszufüllen sind. Dabei ist das Zahlenkästchens selbst stets miteinzubeziehen. Beispiel: Die Zahl 0 bedeutet, dass weder das Kästchen noch eines der angrenzenden Quadrate ausgefüllt ist. Die Zahl 9 bedeutet, dass sowohl das Kästchen als auch die 8 benachbarten Kästchen ausgemalt werden müssen. Die Zahl 5 bedeutet, dass fünf der neun möglichen Kästchen ausgemalt sind. Dabei gibt es von vornherein mehrere Möglichkeiten. Welche die richtige ist, ist auf Grund der restlichen Zahlen Schritt für Schritt herauszufinden. Ein erster Versuch Finde bei den folgenden zwei Rätseln das Muster B. Ruh Informatikfreikurs WS 2008/2009 2 Wir versuchen nun, solche Rätsel mit Excel zu lösen. Dazu reichen die normalen Formeln, die Excel zur Verfügung stellt, natürlich nicht aus. Wir müssen die Zellen programmieren. In Excel schreibt man Programme in der Sprache VBA (Visual Basic for Application) 1.2 Das erste VBA Programm VBA Programme werden in der Excel-Entwicklungsumgebung geschrieben. Man geht wie folgt vor: 1. Starte die Entwicklungsumgebung mit Extra|Makro|VisualBasic-Editor (Alt+F11) 2. Schaffe falls nötig Übersicht mit Ansicht|Projekt-Explorer 3. Kreuze falls nötig unter Extras|Optionen das Kästchen Variablendeklaration erforderlich an. Damit wird sicher gestellt, dass wie bei Compas die Variablen deklariert werden müssen. 4. Füge einen leeren Modul ein, in das die Programme geschrieben werden: Einfügen|Modul 5. Tippe folgendes Program ein Sub MeinErstes() cells(5,2)=10 End Sub 6. Zurück zu Excel mit Ansicht|Microsoft Excel (Alt+F11) 7. Starten des Programms mit Extras|Makro|Makros|Ausführen Durch das Einfügen eines Buttons (Schaltfläche) kann das Programm bequemer gestartet werden. 1. Ansicht|Symbolleisten|Formular 2. Button Schaltfläche drücken 3. Mit der Maus irgendwo im Tabellenblatt die Schaltfläche ziehen 4. Makro zuweisen 5. Schaltfläche formatieren Mittels einer zweiten Schaltfläche soll die Zelle B5 wieder gelöscht werden können. Da wir den Befehl für das Löschen eines Zelleninhalts nicht kennen, tun wir dies von Hand, nachdem wir aber mit Extras|Makro|Makros|Aufzeichnen EXCEL veranlasst haben, alle von Hand durchgeführten Operationen in VBA aufzuzeichnen. Also: 1. Extras|Makro|Makros|Aufzeichnen und OK-Drücken. Es erscheint eine kleine Symbolleiste. 2. Zelle B5 anklicken und die DEL-Taste drücken 3. In der kleinen Symbolleiste das schwarze Quadrat anklicken. Damit wird die Aufzeichnung beendet. B. Ruh Informatikfreikurs WS 2008/2009 3 4. Alt+F11. Im Modul2 (Doppelklicken) stehen die Befehle Range("B5").Select Selection.ClearContents Daraus lernt man folgendes: a) Die Zelle B5 kann statt mit der Koordinatenschreibweise cells(5,2) auch mit der Namenschreibweise {Range("B5") angesprochen werden. b) Der Inhalt eines ausgewählten Bereiches kann mitSelection.ClearContents gelöscht werden. Diese Befehle können direkt in eine eigenes Makro übernommen werden. Man sieht aber schnell, dass es kürzer geht mit Cells(5,2).ClearContents ’oder Range("B5").ClearContents 5. In Modul1 schreibt man also Sub InhaltLöschen Cells(5,2).ClearContents End Sub 6. Einer Schaltfläche weist man dieses Makro zu. Nun soll mittels einer for-Schlaufe in der zweiten Kolonne die 2-er Reihe zu stehen kommen: Sub MeinErstes() Dim i As Integer For i = 1 To 10 Cells(i, 2) = 2 * i Next i End Sub Übungen 1. Ändere das Makro Löschen so, dass alle 10 Zahlen in der B-Kolonne gelöscht werden (verwende falls nötig Extras|Makro|Makros|Aufzeichnen). 2. Ergänze die Programm so, dass in der A-Kolonne die Einerreihe und in der C-Kolonne die Dreierreihe erscheinen bzw. gelöscht werden. 3. Nun soll auf Tastendruck das ganze Einmaleins erscheinen bzw. gelöscht werden. Versuche dies mit einer doppelten for-Schlaufe. B. Ruh Informatikfreikurs WS 2008/2009 4 4. In VBA generiert Rnd ein zufällige Dezimalzahl zwischen 0 und 1. Eine Zufallszahl zwischen 1 und 6 ergibt Int((6 * Rnd) + 1). Der Befehl cells(1,1).interior.colorindex=Int((12 * Rnd) + 1) füllt die Zelle A1 mit einer zufälligen Farbe der Nummern 1 bis 12 Der Zufallsgenerator wird wie in Compas mit randomize gestartet. a) Das betätigen einer Schaltfläche soll die Zelle A1 mit einer zufälligen Farbe füllen. b) Die ersten 8 Zellen der 1. Kolonne sollen zufällig gefärbt werden. c) Ein 8 × 8 Quadrat soll zufällig gefärbt werden. d) Ein Schachbrett mit zwei Farben soll entstehen (wählbar oder zufällig) e) 100 zufällige Schachbretter sollen blinken. 5. a) Zeichne das untenstehende Mosaikrätsel mit den Schaltflächen. Um das Rätsel ist ein Rahmen mit leeren(blassblauen, colorindex=37) Zellen gelegt. b) Fülle nun die Schaltflächen mit Leben! B. Ruh Informatikfreikurs WS 2008/2009 1.3 5 Die Lösung einfacher Rätsel Wir vergrössern das Feld auf 15 × 15 und passen die Makros an. Nun lösen wir die beiden Rätsel auf der ersten Seite und dieses beiden hier: 1.4 Die Lösung schwieriger Rätsel Wie das zweite Beispiel zeigt, gibt es schwierigere Rätsel, die unser Program (noch?) nicht lösen kann. Folgende Überlegungen helfen: Oben links finden sich die Zahlen 4 und 7 untereinander. Wegen der 4 sind in den grau hinterlegten Felder höchstens 4 Felder markiert. Die 7 bekommt also von diesen Feldern höchstens 4 volle Felder. Das geht aber nur, wenn es wirklich 4 sind und die 3 Felder unterhalb der 7 voll sind. Weiter folgt, dass die 3 Felder oberhalb der 4 leer sein müssen. Diese Überlegung hilft bei den Paaren (8,5), (7,4), (6,3), (5,2) und (4,1) (natürlich auch, wenn sie nebeneinander liegen). Über die Diagonale hilft eine Differenz von 5, also z.B. (6,1). Da die 1 in den grauen Felder nur ein volles liefert, müssen die 5 anderen um die 6 herumliegenden Felder voll sein. Entsprechend findet man viele leere Felder um die 1 herum. Sind schon einige Felder markiert, so kommt man mit ähnlichen Überlegungen weiter. Im nebenstehenden Fall bekommt die 7 von der 5 nur noch vier markierte Felder, woraus sich die markierten und leeren Felder ergeben. Wie lautet die allgemeine Regel? B. Ruh Informatikfreikurs WS 2008/2009 1.5 1.5.1 6 Ein einfacher Sudoku Solver Vorbereitungen • In Excel lässt sich auch Text addieren, dazu wird nicht das gewöhnliche Pluszeichen (+) verwendet, sondern das kaufmännische Und (&). Beispiel: Steht in Zelle A1 der Vorname und in der Zelle A2 der Nachname, so so kann man mittels =A1&" "&A2 die Beiden - getrennt durch einen Leerschlag - in ein Feld bringen. • Neben integer, float und string gibt es noch den Datentyp boolean. Variablen von diesem Typ können nur den Wert ’true’ oder ’false’ annehmen. • Die von Excel vorgegebene Variable Cells ist ein sogenanntes zweidimensionales Feld, da sie mit Hilfe zweier Indices ( z.B. Cells(5,3)) Zugriff auf viele Variablen hat. Man kann auch eigene Felder definieren. So liefert Dim n(9) as integer ein eindimensionales Feld mit den Variabeln n(1),n(2),..., n(9). In jeder dieser Variablen kann eine ganze Zahl gespeichert werden. 1.5.2 Eindeutige Felder Auf Knopfdruck sollen in den leeren Felder eines Sudoku’s die möglichen Zahlen angezeigt werden. Damit diese Zahlen in die Zelle passt, setzen wir unter Format-Zellen-Ausrichtung die Marke An Zellgrösse anpassen. Wir defineren die Dim f(9) as boolean und setzen alle Werte auf false. Für eine leere Zelle prüfen wir nun zeilenweise, spaltenweise und quadratweise, welche Zahlen vorkommen. Sobald eine Zahl gefunden ist, setzen wir entsprechenden Wert auf true. Am Schluss zeigt uns die Variable f, welche Zahlen in dem entsprechenden Feld möglich sind. Diese Verknüpfen wir mit & und geben sie aus. Damit man die Zahlen von den gegebene Zahlen unterschieden kann, färben wir die neuen Zahlen ein. B. Ruh Informatikfreikurs WS 2008/2009 7 Dies machen wir für jede Zelle, wobei man aufpassen muss, dass man die gegebenen Zahlen nicht überschreibt. Die eindeutigen Zahlen werden gesetzt und dann findet man bei den einfachen Sudukos die Lösung durch Wiederholen. 1.5.3 Eindeutige Zahlen Bei schwierigeren Sudokus gibt es keine eindeutigen Felder. Hingegen kann in einer Zeile, einer Spalte oder einem Quadrat eine bestimmte Zahl nur an einer Stelle stehen. Im obigen Bild sieht man, dass die Zahl 2 in der ersten Zeile nur einmal vorkommt, dort also stehen muss. In der Spalte 2 kann die 5 nur zuoberst stehen und im Quadrat unten rechts hat die 3 nur ein mögliches Feld. Die Strategie besteht also darin, zeilenweise, spaltenweise und quadratweise diese Zahlen zu suchen und zu setzen. Man kann so alle Sudokus, welche nicht durch Probieren gelöst werden müssen, d.h. alle aus Zeitungen und Zeitschriften lösen. B. Ruh