Générer un puzzle Sudoku, Excel VBA
Voici un code détaillé en VBA pour générer un puzzle Sudoku dans Excel, avec une explication :
1. Préparation de la feuille Excel :
Avant de commencer avec le code VBA, vous devez préparer une grille dans Excel qui représente le plateau de Sudoku. Vous pouvez le faire en sélectionnant une plage de 9×9 cellules (par exemple, A1:I9).
2. Code VBA pour générer un puzzle Sudoku :
Option Explicit
Dim SudokuGrid(1 To 9, 1 To 9) As Integer
Dim SolvedGrid(1 To 9, 1 To 9) As Integer
Sub GenerateSudokuPuzzle()
Dim i As Integer, j As Integer
' Initialiser la grille Sudoku
Call GenerateSolution
' Retirer certains numéros pour créer le puzzle
Call RemoveNumbers
' Afficher le puzzle dans la feuille Excel
Call DisplayPuzzle
End Sub
Sub GenerateSolution()
' Remplir la grille avec une solution valide de Sudoku
Call FillGrid(1, 1)
End Sub
Function FillGrid(Row As Integer, Col As Integer) As Boolean
Dim num As Integer
If Row > 9 Then
FillGrid = True
Exit Function
End If
If Col > 9 Then
FillGrid = FillGrid(Row + 1, 1)
Exit Function
End If
If SudokuGrid(Row, Col) > 0 Then
FillGrid = FillGrid(Row, Col + 1)
Exit Function
End If
For num = 1 To 9
If IsSafeToPlace(Row, Col, num) Then
SudokuGrid(Row, Col) = num
If FillGrid(Row, Col + 1) Then
FillGrid = True
Exit Function
End If
SudokuGrid(Row, Col) = 0
End If
Next num
FillGrid = False
End Function
Function IsSafeToPlace(Row As Integer, Col As Integer, num As Integer) As Boolean
' Vérifier si le numéro peut être placé à la position spécifiée
Dim i As Integer, j As Integer
' Vérifier la ligne
For i = 1 To 9
If SudokuGrid(Row, i) = num Then
IsSafeToPlace = False
Exit Function
End If
Next i
' Vérifier la colonne
For i = 1 To 9
If SudokuGrid(i, Col) = num Then
IsSafeToPlace = False
Exit Function
End If
Next i
' Vérifier le carré 3x3
Dim startRow As Integer, startCol As Integer
startRow = (Row - 1) \ 3 * 3 + 1
startCol = (Col - 1) \ 3 * 3 + 1
For i = startRow To startRow + 2
For j = startCol To startCol + 2
If SudokuGrid(i, j) = num Then
IsSafeToPlace = False
Exit Function
End If
Next j
Next i
IsSafeToPlace = True
End Function
Sub RemoveNumbers()
Dim removed As Integer
removed = 0
Dim i As Integer, j As Integer
Dim index As Integer
Dim numbers(81) As Integer
For i = 1 To 81
numbers(i) = i
Next i
' Mélanger le tableau numbers
For i = 1 To 81
index = Int((81 - 1 + 1) * Rnd + 1)
Dim temp As Integer
temp = numbers(i)
numbers(i) = numbers(index)
numbers(index) = temp
Next i
' Retirer des numéros pour créer le puzzle
For i = 1 To 81
Dim row As Integer, col As Integer
row = (numbers(i) - 1) \ 9 + 1
col = (numbers(i) - 1) Mod 9 + 1
If SudokuGrid(row, col) <> 0 Then
SudokuGrid(row, col) = 0
removed = removed + 1
End If
If removed >= 40 Then Exit For
Next i
End Sub
Sub DisplayPuzzle()
Dim row As Integer, col As Integer
For row = 1 To 9
For col = 1 To 9
If SudokuGrid(row, col) > 0 Then
Cells(row, col).Value = SudokuGrid(row, col)
Else
Cells(row, col).Value = ""
End If
Next col
Next row
End Sub
Explication du code :
1. Tableaux globaux (SudokuGrid, SolvedGrid) :
SudokuGrid: Ce tableau contient l’état actuel du puzzle. Il sera rempli de nombres de 1 à 9 pour la solution, et certains nombres seront retirés pour créer le puzzle.SolvedGrid: Ce tableau contient la solution complète du Sudoku.
2. Sous-programme principal (GenerateSudokuPuzzle) :
- Il s’agit du sous-programme principal qui génère le puzzle Sudoku. Il commence par appeler
GenerateSolutionpour créer une solution valide, puis il appelleRemoveNumberspour retirer certains numéros du tableau et créer le puzzle, et enfin, il utiliseDisplayPuzzlepour afficher le puzzle dans la feuille Excel.
3. Génération de la solution (GenerateSolution) :
- Le sous-programme
GenerateSolutionappelle la fonctionFillGrid, qui est une fonction récursive qui tente de remplir la grille avec une solution valide.
4. Remplir la grille (FillGrid) :
- Cette fonction essaie de remplir la grille de Sudoku ligne par ligne, colonne par colonne, en utilisant une méthode de recherche avec retour arrière (backtracking). Si elle rencontre une situation où un nombre ne peut pas être placé, elle revient en arrière et essaie un autre nombre.
5. Vérification de sécurité (IsSafeToPlace) :
- Cette fonction vérifie si un numéro peut être placé dans une cellule donnée sans violer les règles du Sudoku. Elle vérifie la ligne, la colonne et le sous-carré 3×3 pour s’assurer que le numéro n’apparaît pas ailleurs.
6. Retirer des numéros (RemoveNumbers) :
- Une fois la grille remplie avec une solution valide, la sous-routine
RemoveNumbersretire aléatoirement des numéros du tableau pour créer le puzzle. Elle s’assure qu’il y a suffisamment de numéros retirés (environ 40 cellules) pour créer un puzzle résolvable.
7. Afficher le puzzle (DisplayPuzzle) :
- Cette sous-routine parcourt le tableau
SudokuGridet affiche les numéros dans les cellules correspondantes de la feuille Excel. Si une cellule contient un zéro, elle n’affiche rien.
Comment utiliser le code :
1. Ouvrez votre fichier Excel et appuyez sur ALT + F11 pour ouvrir l’éditeur VBA.
2. Insérez un nouveau module en cliquant sur Insertion > Module.
3. Collez le code complet dans le module.
4. Fermez l’éditeur VBA et revenez à votre feuille Excel.
5. Exécutez la macro GenerateSudokuPuzzle en appuyant sur ALT + F8, en sélectionnant GenerateSudokuPuzzle et en cliquant sur « Exécuter ».
Ce code générera un puzzle Sudoku aléatoire à chaque fois qu’il sera exécuté, avec certaines cellules remplies et d’autres laissées vides. Vous pouvez ajuster le nombre de cellules à retirer en modifiant la condition dans RemoveNumbers (actuellement, il est défini pour retirer 40 cellules).