Une aide à la résolution de grilles Sudoku

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.

Préparation de la grille

Emplacement : pour que les formules utilisées ne provoquent pas d'erreur, il faut que le sommet supérieur gauche de la grille soit la cellule C3.
A partir de C3, créez un quadrillage de 9x9 cellules carrées, et donnez-leur les formats suivants :
Taille des cellules : attribuez-leur une largeur de 45 pixels (5,71) et une hauteur de 45 pixels (33,75).
Bordures : entourez la grille ainsi que chacun des blocs de 3x3 d'une bordure épaisse. Enfin appliquez un quadrillage intérieur fin à chacun des blocs.
Police : appliquez la police Arial Gras de taille 8 dans toute la grille.
Alignement : il doit être centré verticalement et horizontalement. Cochez la case "Renvoyer à la ligne automatiquement".
Format conditionnel : si la valeur de la cellule est comprise entre 0 et 10 alors appliquer un motif de couleur jaune.


L'utilisation des noms dans les formules

Positionnez-vous en C3 de la feuille nommée Feuil1, et de là créez les noms suivants :
  • 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)


    N'oubliez pas que pour modifier confortablement le champ "Fait référence à", il est utile de taper F2, et si vous voulez remplacer des caractères au lieu d'en insérer, tapez la touche 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)
  • et ainsi de suite jusqu'à zz9
    et enfin
  • 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)

    Il suffit désormais d'entrer la formule =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.


    Derniers réglages avant de commencer la grille : puisque chaque cellule appartient à son propre bloc/ligne/colonne, il y aura erreur de référence circulaire. Pour éviter cela, cochez la case "Itération" (menu Outils Options onglet Calcul) et donnez-lui 1 comme valeur maximale. Enfin, mettez le classeur en mode de calcul automatique.

    Choisissez une grille dans une revue quelconque afin qu'elle ait une solution unique, et saisissez les chiffres connus.
    Ceux-ci s'affichent sur fond jaune, du fait du format conditionnel.
    Les chiffres candidats doivent être mis à jour automatiquement.

    Un peu de VBA pour obtenir deux tailles différentes

    Avec ces seules contraintes, toutes les cellules ont la même taille de caractère. Malheureusement le format conditionnel ne permet pas de modifier la taille des caractères. Pour obtenir deux tailles (20 pour les cases jaunes, 8 pour les blanches), il faut appliquer la procédure événementielle ci-dessous à la feuille Feuil1.

    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 Sub
    
    Cette procédure applique les 2 tailles dès que la valeur d'une cellule est modifiée, typiquement lorsque vous entrez les chiffres initiaux.

    Un pas de plus vers la résolution : le masquage de chiffres impossibles

    Le casse-tête Sudoku n'en serait pas un s'il suffisait d'éliminer les chiffres présents dans les mêmes ligne/colonne/bloc.
    La preuve : il reste plusieurs chiffres possibles après cette élimination. Les chiffres affichés en petit caractère sont simplement des candidats possibles, comme on le dit dans le jargon Sudoku.
    Pour trouver la solution (normalement unique) il faut ensuite utiliser plusieurs raisonnements plus ou moins complexes.
    Une partie de ces raisonnements vous amènent à la conclusion que certains des chiffres qui restent affichés (les candidats en taille 8) ne peuvent pas être retenus.
    Il conviendra donc de les masquer. La liste des candidats possibles se réduira ainsi peu à peu jusqu'à ce que, après parfois de multiples raisonnements, un seul chiffre apparaisse, devenant alors la solution unique pour cette case.


    Comment masquer certains chiffres ?

    Un peu de code VBA est ici nécessaire. Créez la fonction complémentaire 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 Function
    
    Cette fonction renvoie le commentaire (l'annotation) de la cellule courante.

    Positionnez le curseur en C3 et modifiez maintenant les noms zz1, zz2... zz9 ainsi :
  • 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 ";"    ")
    et ainsi de suite jusqu'à zz9

    Désormais, si vous entrez "24" en commentaire de la cellule C3 (sommet de la grille), les chiffres 2 et 4 disparaîtront. Selon les versions d'Excel et le mode de calcul (automatique ou sur ordre), il vous faudra peut-être appuyer sur la touche F9 pour déclencher le recalcul et ainsi faire disparaître les chiffres non désirés.

    Retour à la page d'accueil