Ces pages n'ont pas pour objet de présenter toutes les techniques de résolution des grilles Sudoku, ni de réaliser un classeur Excel capable de cela.
Le but est plus simplement d'afficher dans une grille de Sudoku tous les chiffres qui n'appartiennent ni à la ligne, ni à la colonne, ni au bloc (3x3 cases) de chacune des cellules, étape quasi-obligatoire pour les grilles complexes, dont chaque joueur de Sudoku aimerait se passer.
Dans l'image ci-dessous les cases jaunes sont déjà renseignées.
Dans les cases blanches, on veut afficher les chiffres de 1 à 9, mais seulement ceux qui ne sont pas déjà présents dans la même ligne ni la même colonne ni le même bloc, ainsi que le veut la règle du Sudoku.
Par exemple, la case B2 est située en ligne B, en colonne 2 et dans le premier bloc (supérieur gauche). On veut afficher (dans les cases blanches) tous les chiffres de 1 à 9 SAUF ceux qui existent déjà soit dans la ligne B (3 9 1 5 7), soit dans la colonne 2 (7 3 2 5), soit enfin dans le premier bloc (3 1 7 5). Il faut donc éliminer les chiffres 1 2 3 5 7 9, et donc n'afficher que 4 6 8.
grid=Feuil1!$C$3:$K$11
(renvoie la totalité de la grille - rappel : le sommet supérieur gauche de la grille est la cellule C3 de la feuille Feuil1, condition nécessaire pour que les noms créés ci-après soient valides)Inser
. Validez chaque nom par le bouton "Ajouter" plutôt que par "Fermer".li=Feuil1!3:3 grid
(intersection de la grille grid et de la ligne courante, autrement dit ligne de la case courante)co=Feuil1!C:C grid
(colonne de la case courante)bl=DECALER(Feuil1!C3;-MOD(LIGNE(Feuil1!3:3);3);-MOD(COLONNE(Feuil1!C:C);3);3;3)
(le bloc de 3x3 cases auquel appartient la case courante)zz1=SI(NB.SI(co;1)+NB.SI(li;1)+NB.SI(bl;1)=0;" 1 ";" ")
(renvoie le chiffre 1 entouré de deux espaces si le chiffre 1 existe soit dans la ligne courante, soit dans la colonne courante, soit dans le bloc courant, et renvoie une chaîne de 4 blancs - afin d'occuper le même espace que " 1 "
avec la police choisie - si le chiffre 1 est absent de ces 3 régions)zz2=SI(NB.SI(co;2)+NB.SI(li;2)+NB.SI(bl;2)=0;" 2 ";" ")
(Rappel : utilisez F2
, Inser
et Ajouter
)
zz9
zz=zz1&zz2&zz3&CAR(160)&CAR(10)&zz4&zz5&zz6&CAR(160)&CAR(10)&zz7&zz8&zz9&CAR(160)
(renvoie la concaténation des chiffres voulus, séparés par CAR(160) qui permet d'aligner correctement le résultat et par CAR(10) qui permet de passer à la ligne, à condition que dans le format alignement des cellules la case "Renvoyer à la ligne automatiquement" soit cochée)=zz
dans l'ensemble des cases de la grille. Le plus simple est de sélectionner la grille (par exemple par F5, puis choisir grid) et de saisir =zz
en validant par Ctrl-Entrée.Private Sub Worksheet_Change(ByVal Target As Range) Set i = Nothing On Error Resume Next Set i = Intersect(Range("grid"), Target) On Error GoTo 0 If Not (i Is Nothing) Then For Each c In Range("grid").Cells c.Font.Size = 8 If WorksheetFunction.IsNumber(c) Then c.Font.Size = 20 Next c End If End SubCette procédure applique les 2 tailles dès que la valeur d'une cellule est modifiée, typiquement lorsque vous entrez les chiffres initiaux.
commentr
ci-dessous dans un module VBA associé au classeur.Function commentr(Target As Range) Application.Volatile commentr = "" On Error Resume Next commentr = Target.Comment.Text On Error GoTo 0 End FunctionCette fonction renvoie le commentaire (l'annotation) de la cellule courante.
zz1=SI(ET(NB.SI(co;1)+NB.SI(li;1)+NB.SI(bl;1)=0;ESTERR(CHERCHE("1";commentr(Feuil1!C3))));" 1 ";" ")
zz2=SI(ET(NB.SI(co;2)+NB.SI(li;2)+NB.SI(bl;2)=0;ESTERR(CHERCHE("2";commentr(Feuil1!C3))));" 2 ";" ")
zz9