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

Documents pareils