Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sudoku-Lösung in VBA

Forumthread: Sudoku-Lösung in VBA

Sudoku-Lösung in VBA
01.11.2006 20:51:15
PeterG
Liebe VBA-Spezies,
ich wende mich an alle, die sich sowohl für VBA als auch Sudoku interessieren. Dazu hat jetzt ja gerade HWH ein VBA-Programm veröffentlicht, das sich ganz genial die Aufgaben gleich mit Lösung aus dem Internet lädt (m.E. VBA-Lehrcode der besonderen Art). Meine diesbezüglichen Versuche sind bisher gescheitert. Ich hatte allerdings auch den Anspruch, die Lösung in VBA zu errechnen. Das war wahrscheinlich etwas blauäugig. Der Versuch wie beim Schach rekursiv zu Ergebnissen zu kommen, scheiterte nach Sekunden mit der Meldung "zu wenig Stapelspeicherplatz". Aber möglicherweise war da schon jemand erfolgreicher oder hat den einen oder anderen Tipp. Danke für jede Antwort.
Viele Grüße
PeterG
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sudoku-Lösung in VBA
01.11.2006 22:56:59
Reinhard
Hi Peter,
was issen HWH? an dem Runterladcode wäre ich interessiert, jetzt nicht wegen Sudoku, sondern wegen den Codeteilen fürs Auslesen.
Nachstehenden Code, ist ein Posting was ich hier absetzte, habe ich mal gebastelt, vielleicht nützt er dir was. Andrerseits hat doch Hans hier, irgendwo oben links, was von Sudoku stehen gehabt, da konnte man sich eine datei runterladen die Sudokus löst usw. Die war viel besser als mein Gestümpere. Bei Interesse schau ich aml ob ich sie finde.
Gruß
Reinhard
Hallo,
wenn man Sudokus löst und auf einmal festhängt kann es ja hilfreich sein, die bisherigen gefundenen Zahlen anhand der Lösung zu prüfen ob denn da nicht schon ein Fehler ist und das ggfs. korigieren.
Ich habe das Makro an ca. 30 Sudokus getestet und es funktionierte perfekt, was natürlich kein Beweis ist dass es alle Sudokus lösen kann und mir ist auch sehr unklar geblieben ob es für ein Sudoku mehrere Lösungen geben könnte.
Das Makro erwartet die Sudoku Zahlen in Tabelle1 im Bereich "A1:I9" und präsentiert die Lösung in Tabelle2 "A1:I9".
Gruß
Reinhard

Option Explicit
Sub sudo()
Dim ws1 As Worksheet, z As Byte, s As Byte, m(9, 9) As String, n As Byte
Dim zq As Byte, sq As Byte, Zelle, Wert As String, neu As Boolean
On Error Resume Next 'wegen Fehler bei CountIf wenn nichts gefunden wird
Set ws1 = Worksheets("Tabelle1")
With Worksheets("Tabelle2")
ws1.Range("A1:I9").Copy Destination:=.Range("A1")
For z = 1 To 9
For s = 1 To 9
If .Cells(z, s) = "" Then
m(z, s) = "123456789"
Else
m(z, s) = .Cells(z, s)
End If
Next s
Next z
End With
nochmal:
With Worksheets("Tabelle2")
For z = 1 To 9 'waagrechte Prüfung
For s = 1 To 9
If Len(.Cells(z, s)) <> 1 Then
For n = 1 To 9
If Application.WorksheetFunction.CountIf(.Range(.Cells(z, 1), .Cells(z, 9)), CStr(n)) > 0 Then
m(z, s) = Replace(m(z, s), CStr(n), "")
If Len(m(z, s)) = 1 Then
.Cells(z, s) = m(z, s)
GoTo nochmal
End If
End If
Next n
End If
Next s
Next z
For s = 1 To 9 'senkrechte Prüfung
For z = 1 To 9
If Len(m(z, s)) > 1 Then
For n = 1 To 9
If Application.WorksheetFunction.CountIf(.Range(.Cells(1, s), .Cells(9, s)), CStr(n)) > 0 Then
m(z, s) = Replace(m(z, s), CStr(n), "")
If Len(m(z, s)) = 1 Then
.Cells(z, s) = m(z, s)
GoTo nochmal
End If
End If
Next n
Else
m(z, s) = .Cells(z, s)
End If
Next z
Next s
For z = 1 To 9 'quadratische Prüfung
For s = 1 To 9
zq = Int((z - 1) / 3) * 3 + 1
sq = Int((s - 1) / 3) * 3 + 1
If Len(m(z, s)) > 1 Then
For n = 1 To 9
If Application.WorksheetFunction.CountIf(.Range(.Cells(zq, sq), .Cells(zq, sq).Offset(2, 2)), CStr(n)) > 0 Then
m(z, s) = Replace(m(z, s), CStr(n), "")
If Len(m(z, s)) = 1 Then
.Cells(z, s) = m(z, s)
GoTo nochmal
End If
End If
Next n
End If
Next s
Next z
For z = 1 To 9
For s = 1 To 9
.Cells(z, s) = m(z, s)
Next s
Next z
For z = 1 To 9 Step 3 'quadratische Prüfung auf einmalige Ziffer
For s = 1 To 9 Step 3
Wert = ""
For Each Zelle In .Range(.Cells(z, s), .Cells(z, s).Offset(2, 2))
Wert = Wert & CStr(Zelle.Value)
Next Zelle
For Each Zelle In .Range(.Cells(z, s), .Cells(z, s).Offset(2, 2))
If Len(Zelle) > 1 Then
For n = 1 To Len(Zelle)
If InStr(InStr(Wert, Mid(Zelle, n, 1)) + 1, Wert, Mid(Zelle, n, 1)) = 0 Then
Zelle.Value = Mid(Zelle, n, 1)
m(Zelle.Row, Zelle.Column) = Zelle.Value
neu = True
GoTo weiter
End If
Next n
End If
Next Zelle
weiter:
Next s
Next z
If neu = True Then
neu = False
For Each Zelle In .Range("A1:I9")
If Len(Zelle) > 1 Then Zelle.Value = ""
Next Zelle
GoTo nochmal
End If
ws1.Range("A1:I9").Copy Destination:=.Range("A11")
.Activate
End With
End Sub
Function doppelt(ByVal Wert)
Dim n
With Worksheets("Tabelle2")
doppelt = False
For n = 1 To Len(Wert)
If InStr(InStr(Wert, n) + 1, Wert, n) <> 0 Then
doppelt = True
Exit For
End If
Next n
End With
End Function

Anzeige
HWH = Hans W. Herber ...
01.11.2006 23:03:14
da
axo :-) sorry, das W kannte ich nicht o.w.T.
01.11.2006 23:14:21
Reinhard

Gruß Reinhard ps: Ich freue mich über eine Rückmeldung ob diese Antwort hilfreich war oder nicht..
AW: HWH = Hans W. Herber ...
01.11.2006 23:41:45
PeterG
Hallo Reinhard,
danke für deine Antwort. Deinen Code habe ich jetzt noch nicht getestet, kommt aber. Den Sudoku-Code von Hans W. Herber kannst du auf der Forum-Seite oben links unter "New ..." downloaden. Es lohnt sich!
Gruß
PeterG
Anzeige
AW: HWH = Hans W. Herber ...
02.11.2006 00:07:23
Reinhard
Moin Peter,
vergiss meinen Code :-)
Den von Hans hab ich nur kurz getestet und überflogen, war jetzt vba-technisch nix unbekanntes dabei. Aber die wahre Seele ist die dahintersteckende Logik wie man so ein Rätsel angeht. Das muss ich noch eruieren um zu lernen, ist ja letztlich die Problematik aus zig Kombinationsmöglichkeiten sehr schnell die richtigen zu finden und diese auszuwerten.
Gruß
Reinhard
Anzeige
AW: HWH = Hans W. Herber ...
02.11.2006 06:23:10
Luschi
Hallo Reinhard,
habe mir den Vba-Code und die Tabellen [besonders die versteckte Tabelle ("Aufgaben")] mal genauer angesehen.
Der Witz dabei ist, daß in den Sudoku-Aufgaben bereits alle Zahlen vorhanden sind.
Es sind aber alle Zahlen, die zu erraten sein sollen, mit dem Zahlenformat unsichtbar (";;;") formatiert.
Mit dem Drücken des Buttons "Alle prüfen" wird also nicht die Zahl berechnet, sondern nur mit der bereits vorhandenen Zahl in der Tabelle "Aufgaben" verglichen.
Etwas interessanter ist da schon der Vba-Code beim Drücken der rechten Maustaste auf ein Zahlenfeld, um die Zahlen anzuzeigen, die für dieses Feld noch in Frage kommen.
Insgesamt ist dieses Programm aber nicht geeignet, Sudoku-Aufgaben aus Zeitungen etc. zu lösen, da die Logik fehlt, fehlende Zahlen zu berechnen.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: HWH = Hans W. Herber ...
01.11.2006 23:42:10
PeterG
Hallo Reinhard,
danke für deine Antwort. Deinen Code habe ich jetzt noch nicht getestet, kommt aber. Den Sudoku-Code von Hans W. Herber kannst du auf der Forum-Seite oben links unter "New ..." downloaden. Es lohnt sich!
Gruß
PeterG
AW: HWH = Hans W. Herber ...
01.11.2006 23:42:58
PeterG
Hallo Reinhard,
danke für deine Antwort. Deinen Code habe ich jetzt noch nicht getestet, kommt aber. Den Sudoku-Code von Hans W. Herber kannst du auf der Forum-Seite oben links unter "New ..." downloaden. Es lohnt sich!
Gruß
PeterG
Anzeige
AW: HWH = Hans W. Herber ...
01.11.2006 23:43:10
PeterG
Hallo Reinhard,
danke für deine Antwort. Deinen Code habe ich jetzt noch nicht getestet, kommt aber. Den Sudoku-Code von Hans W. Herber kannst du auf der Forum-Seite oben links unter "New ..." downloaden. Es lohnt sich!
Gruß
PeterG
AW: Sudoku-Lösung in VBA
02.11.2006 09:11:32
Rudi
Hallo,
vielleicht hilft dir das http://www.andypope.info/fun/sudoku.htm weiter.
Gruß
Rudi
Anzeige
Herzlichen Dank
02.11.2006 10:19:51
PeterG
Hallo Rudi,
genau das war's. Die Workbook von Andy Pope löst nicht nur Sudoku's. Sie generiert auch neue. Das ist VBA vom Feinsten. Herzlichen Dank für diesen Tipp.
PeterG
;
Anzeige

Infobox / Tutorial

Sudoku-Lösung mit VBA in Excel


Schritt-für-Schritt-Anleitung

Um ein Excel-Sudoku zu lösen, kannst Du ein VBA-Makro verwenden. Hier ist eine Schritt-für-Schritt-Anleitung zur Implementierung eines Excel Sudoku Löser:

  1. Öffne Excel und erstelle eine neue Arbeitsmappe.

  2. Aktiviere die Entwicklertools:

    • Gehe zu „Datei“ > „Optionen“ > „Menüband anpassen“ und aktiviere die Entwicklertools.
  3. Füge ein neues Modul hinzu:

    • Klicke auf „Entwicklertools“ > „Visual Basic“.
    • Wähle „Einfügen“ > „Modul“.
  4. Füge den folgenden VBA-Code ein:

    Option Explicit
    Sub sudokuSolver()
       ' Dein Sudoku-Lösungs-Code hier
       ' Dieser Code sollte die Sudoku-Lösung Schritt für Schritt ermitteln.
    End Sub
  5. Kopiere den vorliegenden Code aus dem Forum und füge ihn in das Modul ein. Der Code von Reinhard ist ein guter Startpunkt.

  6. Gib die Sudoku-Zahlen in das Arbeitsblatt „Tabelle1“ im Bereich „A1:I9“ ein.

  7. Führe das Makro aus:

    • Gehe zurück zu Excel und klicke auf „Entwicklertools“ > „Makros“.
    • Wähle das Makro „sudokuSolver“ und klicke auf „Ausführen“.
  8. Sieh dir die Lösung in „Tabelle2“ an.


Häufige Fehler und Lösungen

  • Fehler bei der Berechnung: Wenn Du die Meldung „zu wenig Stapelspeicherplatz“ erhältst, könnte das an einer zu komplexen Sudoku-Konfiguration liegen. Überprüfe die Eingabewerte auf Richtigkeit.

  • Unvollständige Lösungen: Manchmal lösen Makros nicht alle Sudokus. Stelle sicher, dass das Sudoku gültig ist und nur eine Lösung hat. Denn kann es bei Sudoku mehrere Lösungen geben? Ja, wenn das Puzzle nicht korrekt ist.

  • Falsche Platzierung der Zahlen: Achte darauf, dass die Zahlen im richtigen Format eingegeben werden (1-9) und keine doppelten Werte in Zeilen, Spalten oder Quadranten vorhanden sind.


Alternative Methoden

  • Excel Sudoku Generator: Du kannst auch ein Sudoku-Generator-Makro verwenden, um eigene Sudokus zu erstellen. Das Sudoku Excel Generator-Tool von Andy Pope kann dafür nützlich sein.

  • Online Sudoku-Löser: Es gibt zahlreiche Webseiten, die Sudokus lösen können. Diese sind oft einfacher zu verwenden, wenn Du nur gelegentlich ein Sudoku lösen möchtest.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du ein Sudoku in Excel eingeben kannst:

A B C D E F G H I
1 5 3 7
2 6 1 9 5
3 9 8 6
4 8 6 3
5 4 8 3 1
6 7 2 6
7 6 2 8
8 4 1 9 5
9 8 7 9

Fülle die leeren Zellen mit Zahlen und führe dann das Makro aus, um die Lösung zu finden.


Tipps für Profis

  • Optimierung des Codes: Wenn Du das VBA-Skript anpasst, versuche, die Schleifen zu optimieren, um die Ausführungszeit zu reduzieren. Überlege, wie Du die lösungsstrategien für Sudoku effizient implementieren kannst.

  • Debugging: Wenn Du auf Probleme stößt, nutze den Debugger in Excel VBA, um Fehler im Code leichter zu finden.

  • Erweiterungen: Du kannst den VBA-Code erweitern, um auch Sudoku mit Lösungen zu generieren oder die Lösung im Format von sudoku excel vorlage zu speichern.


FAQ: Häufige Fragen

1. Wie löst man ein Sudoku? Um ein Sudoku zu lösen, musst Du sicherstellen, dass jede Zahl von 1 bis 9 in jeder Zeile, Spalte und jedem 3x3 Quadrat nur einmal vorkommt. Verwende Logik und Ausschlussverfahren.

2. Kann ich mehrere Lösungen für ein Sudoku haben? Ja, wenn das Puzzle nicht korrekt ist, kann es mehrere Lösungen geben. Ein korrektes Sudoku sollte nur eine eindeutige Lösung haben.

3. Wie kann ich ein Sudoku in Excel selbst erstellen? Du kannst ein leeres Raster in Excel erstellen und dann einige Zahlen einfügen, die Du gemäß den Sudoku-Regeln anordnest. Anschließend kannst Du ein Makro verwenden, um das Sudoku zu lösen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige