Relancer macro après une boucle infinie
Bonjour,
je tente de créer un générateur de Sudoku sur Excel VBA.
L'idée est de d'abord remplir une grille complète, pour ensuite retirer certains nombres en fonction de la difficulté voulue.
J'ai donc créé une boucle qui inscrit un nombre aléatoire entre 1 et 9 dans chacune des 81 cases du tableau (9x9) et qui recommence la boucle tant que ce nombre se trouve soit dans la même ligne, soit dans la même colonne, soit dans le même carré de 3x3.
Sub alea()
Do
[Case11].Value = Int((9 - 1 + 1) * Rnd + 1)
Loop While _
[Case11].Value = [Case12].Value Or _
[Case11].Value = [Case13].Value Or _
[Case11].Value = [Case14].Value Or _
[Case11].Value = [Case15].Value Or _
[Case11].Value = [Case16].Value Or _
[Case11].Value = [Case17].Value Or _
[Case11].Value = [Case18].Value Or _
[Case11].Value = [Case19].Value Or _
[Case11].Value = [Case21].Value Or _
[Case11].Value = [Case31].Value Or _
[Case11].Value = [Case41].Value Or _
[Case11].Value = [Case51].Value Or _
[Case11].Value = [Case61].Value Or _
[Case11].Value = [Case71].Value Or _
[Case11].Value = [Case81].Value Or _
[Case11].Value = [Case91].Value Or _
[Case11].Value = [Case22].Value Or _
[Case11].Value = [Case23].Value Or _
[Case11].Value = [Case32].Value Or _
[Case11].Value = [Case33].Value
End Sub(ce code est ensuite répété pour chacune des 81 cases (nommées de Case11 à Case99)
Jusqu'ici aucun problème, la macro fonctionne parfaitement (même si un peu trop longue peut-être).
L'ennui c'est qu'il arrive que les nombres choisis aléatoirement empêchent la suite de la grille de se remplir, ce qui créé une boucle infinie.
Exemple des 5 premières lignes du tableau:
1 6 2 9 4 3 8 7 5
7 5 3 1 8 6 9 4 2
4 9 8 7 5 2 3 6 1
8 7 6 2 1 5 4 9 3
2 1 4 3 7 8 5 X
Dans cet exemple, arrivé à la ligne 5, il ne reste plus que le 6 et le 9 de disponible.
Or, il est impossible de les placer puisqu'ils se trouvent déjà dans la même colonne.
Les nombres qu'Excel a choisi aléatoirement sont justes mais la séquence est impossible à terminer et engendre donc une boucle infinie là où j'ai inscrit le "X".
Ma question est donc la suivante:
Est-il possible, en codage VBA, de stopper la macro et de la relancer tant que celle-ci engendre une boucle infinie ?
Je me rend compte qu'un générateur de Sudoku est bien plus compliqué que de simplement envoyer des nombres aléatoires dans des cases et dans ce cas, auriez-vous une autre piste à me donner afin d'y arriver si ma méthode n'est pas la bonne ?
J'espère avoir été clair
Merci beaucoup
Bonjour,
une exemple de génération d'un tableau de sudoku
Sub aargh()
Sheets(1).Activate
'génère une grille
For i = 1 To 9
If i = 1 Then
Cells(i, 1) = 1
ElseIf i Mod 3 = 1 Then
Cells(i, 1) = Cells(i - 3, 1) + 1
Else
Cells(i, 1) = Cells(i - 1, 1) + 3
End If
For j = 2 To 9
Cells(i, j) = (Cells(i, j - 1) Mod 9) + 1
Next j
Next i
'mélange la grille
q = Application.RandBetween(8, 20)
For i = 1 To q
ty = Application.RandBetween(1, 2)
Select Case Application.RandBetween(1, 2)
Case 1
Range(Cells(1, 1), Cells(3, 9)).Cut
Cells(ty * 3 + 4, 1).Insert Shift:=xlDown
Range(Cells(1, 1), Cells(1, 9)).Cut
Cells(ty + 2, 1).Insert Shift:=xlDown
Case 2
Range(Cells(1, 1), Cells(9, 3)).Cut
Cells(1, ty * 3 + 4).Insert Shift:=xlToRight
Range(Cells(1, 1), Cells(9, 1)).Cut
Cells(1, ty + 2).Insert Shift:=xlToRight
End Select
Next i
'mélange les chiffres
Dim a(9)
For i = 1 To 9
a(i) = i
Range("A1:i9").Replace i, Chr$(i + 64)
Next i
For i = 1 To 9
q = Application.RandBetween(1, 10 - i)
Range("A1:I9").Replace Chr$(a(q) + 64), i
a(q) = a(10 - i)
Next i
End SubMerci beaucoup pour cette réponse très complète.
Je vais analyser ce code de plus près pour mieux le comprendre et je vous retiens au courant...
Bonne soirée