Projekt Sudoku 1. Teil Case Select Wir wollen eine unterstützende Software erstellen, die nicht komplette Berechnung selbständig vornimmt, sondern nur dem Spieler Hilfen beim Ausfüllen gibt. So sollen die möglichen Zahlen, die in ein Feld eingesetzt werden können, angezeigt werden. Besonders wichtig für das Ausfüllen sind dann die eindeutigen Felder! Ein einfaches Sudoku, das wir in A1:I9 platzieren: Wenn wir eine leere Zelle anklicken, soll ein noch zu schreibendes Makro herausfinden, welche Zahlen in der betreffenden Spalte belegt sind und welche fehlen. Dazu notieren wir im Bereich A12:I12 die Zahlen 1 bis 9. Wenn nun eine Zahl in der Spalte vorkommt, soll in der Zeile darunter (A13:I13) an der entsprechenden Stelle eine 1 notiert werden. Kommt die Zahl nicht vor, notieren wir eine 0. Für die Zelle A8 ergibt sich dann folgendes Bild: Man sieht : 1, 2, 3, 4 und 6 sind belegt! Wie schreibt man nun ein solches Makro?
Kommentar zur Beschreibung ist sehr wichtig! Mit der Variablen i wollen wir durch die zu besichtigenden Bereiche spazieren. Die Variable inhalt soll den jeweiligen Zelleninhalt übernehmen und auf die Variable spalte wird mit dem schon bekannten ActiveCell.Column die Spaltennummer der angeklickten Zelle ausgelesen. Mit diesen Vorbereitungen geht es fast von selbst: Unbedingt wichtig ist es, den Bereich vor dem Neubeschreiben zu löschen!! Bei dem Setzen der Einsen ist es sehr praktisch, dass die Spaltenzahl genau dem Inhalt entspricht. Das Makro zeilenzahlen( ) wird völlig analog dazu geschrieben. Die Werte werden in A17:I17 notiert. Man erkennt, dass nur noch 7 und 8 als mögliche Einsetzungen übrigbleiben.
Etwas schwieriger ist die Erfassung des 3x3 Feldes. Weil es 9 solche Blöcke gibt, geben wir ihnen den schönen Namen Nonant. Um so einen Nonant zu besichtigen, müssen wir die linke obere Ecke haben und können dann die 3 Felder nach rechts und nach unten überprüfen. Dazu führen wir die folgende Nummerierung der Nonanten ein : Wir schauen uns den Beginn des Makros Namens nonantzahlen an: Wichtig ist zunächst der Kommentar, in dem noch einmal die Nummerierung der Nonanten aufgeschrieben wird. Die Variablen haben folgende Bedeutung: startz soll die Startzeile des Nonanten angeben (also z.b. bei Nonant 8 ist startz=7 ) starts soll die Startspalte des Nonanten angeben (also z.b. bei Nonant 8 ist starts=4 ) Die Zeile der angeklickten Zelle wird mit ActiveCell.Row und die Spalte mit ActiveCell.Column ausgelesen. Wir benötigen zum Durchqueren des Nonants die Startadressen. Die bestimmen wir am bequemsten mit der Case Select Anweisung. Allgemein sieht das so aus: Select Case <hier steht ein Ausdruck, dessen verschiedene Werte, die Fälle bestimmen> Case < Wert1, Wert2,... > < hier steht das, was dann passieren soll> End select
Im Makro wird das so ausgeführt: Zeilen 1,2,3 gehören zur oberen Reihe Zeilen 4,5,6 gehören zur mittleren Reihe Zeilen 7,8,9 gehören zur unteren Reihe Spalten 1,2,3 gehören zu einem linken N. Spalten 4,5,6 gehören zu einem mittleren N. Spalten 7,8,9 gehören zu einem rechten N. Hat man erst einmal die Startadressen, ist es einfach, den Nonant abzusuchen: Auch hier darf nicht vergessen werden, vorher alle Werte auf Null zu setzen. Jetzt ist die Zeile, die Spalte und der Nonant abgesucht und vorkommende Zahlen mit 1 notiert.
Wenn wir also die Summen bilden, kommen genau die Zahlen mit Summe 0 nicht vor. Dazu brauchen wir kein Makro, das geht direkt im Tabellenblatt: Hier wäre also 2, 6 und 7 eine mögliche Einsetzung. Das müssen wir jetzt noch zusammenschreiben! Eine Technik dazu sind Strings (=Texte).
Die Fallunterscheidung mit If Then Else lässt sich als leichte Übung auch mit Case Select formulieren! Es fehlt jetzt noch der Doppelklick: das geht mit einem vordefinierten Makro Worksheet_BeforeDoubleClick: Damit funktioniert jetzt der Doppelklick auf leere Zellen. Anmerkung: Falls dein Excel Probleme mit Application.Run hat, schreibe für Application.Run zeilenzahlen() mal Call zeilenzahlen. Einige wichtige Bemerkungen zum Schluss: Wenn man sich z.b. beim Namen einer Variablen verschreibt, gibt der VB Compiler von sich aus keinen Hinweis, sondern benutzt irgendeinen Wert für die neue Variable. Ein solcher Fehler hat mich bei der Programmentwicklung mehr als einen Tag Arbeit gekostet. Stellt aber als erste Zeile über alle Makros Option Explicit, dann werden solche Fehler bemerkt und nur noch deklarierte Variable zugelassen. Man sollte sich also dieses Option explicit unbedingt angewöhnen. Leider ist die Syntax von OpenOfficeBasic nicht kompatibel mit MS VisualBasic!! Immerhin gibt es Converter im Internet, die den VB Text in OOB übertragen. Eine Adresse ist z.b. www.business-spreadsheets.com/vba2oo.asp