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
GenerateSolution
pour créer une solution valide, puis il appelleRemoveNumbers
pour retirer certains numéros du tableau et créer le puzzle, et enfin, il utiliseDisplayPuzzle
pour afficher le puzzle dans la feuille Excel.
3. Génération de la solution (GenerateSolution
) :
- Le sous-programme
GenerateSolution
appelle 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
RemoveNumbers
retire 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
SudokuGrid
et 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).