エクセルでナンプレを簡単に解く!初心者向けステップバイステップガイド

エクセルでナンプレを簡単に解く!初心者向けステップバイステップガイド


はじめに

日常的に使うエクセル(Excel)は、表計算ソフトとしてだけでなく、数理的なパズルを解くための強力なツールでもあります。今回は、エクセルを使って一目で行き詰まりを回避でき、初心者でも短時間でナンプレ(数独)を解ける方法を紹介します。
「エクセルに数独を敷いたら、どうやって解くの?」という疑問に応え、設定から実装までをわかりやすくまとめました。


1. エクセルで数独を解くメリット

メリット 説明
自動化 条件付き書式や Solver でルールを自動チェック
視覚化 色分けしてセルごとの状態を一目で把握
拡張性 マクロで反復作業を高速化
実践的スキル Excel の関数・VBA を使うことで、スプレッドシートのレベルアップ

2. 必要なツールとセットアップ

  1. Microsoft Excel(バージョン 2016 以降推奨)
  2. Solver アドイン(標準インストールされていない場合は「ファイル → オプション → アドイン → Excel アドイン → Solver アドイン」にチェック)
  3. VBA(マクロ)機能が有効なブックを作成する(xlsmフォーマットで保存)

3. 3×3 ボックスを実際のセルにマッピング

+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| G | H | I |
+---+---+---+
  • A1〜I1 が最初の 3×3 ボックス
  • A4〜I4 が次のボックス
  • … 直下に同様の構造で設置

手順

  1. A1 から I9 までを選択し、罫線を「太い線」で囲み、セル幅/高さを 2.5 cm に合わせる。
  2. それぞれの 3×3 ブロックに 3 px の太線を引くことでボックス境界が明確化。

4. 既存の数値を入力

  • 手元にある数独の初期数値をセルに入力。
  • ①セル(例:C2)に 1 を入力すると、そのセルの値は固定。
  • 固定セルを保護
    • シート全体を選択 → 右クリック → セルの書式設定保護 チェックを外す。
    • 再度 ①セルを選び、保護にチェック。
    • 校閲シートを保護 でパスワード不要でロック。

5. 条件付き書式でルールを視覚化

5.1 2 つ以上の同じ数が行を横断している場合

  1. 行全体(例:B2:G2)を選択。
  2. ホーム条件付き書式新しいルール式を使用して設定する書式.
=COUNTIF($A$2:$I$2, A2)>1
  • 書式で 塗りつぶし を薄い赤に設定。
  • 同様に各列と 3×3 ボックスにもルールを設定(列は $A2、ボックスは INDIRECT("A"&ROW(A2)-MOD(ROW(A2)-1,3)*3) 等で相対参照)。

5.2 3×3 ボックス内で重複がある場合

  1. シート全体を選択。
  2. 新しいルール式を使用
=COUNTIF(INDIRECT("$A"&INT((ROW()-1)/3)*3+1&":$I"&INT((ROW()-1)/3)*3+3),A1)>1
  • これで同じ 3×3 ブロック内での重複が薄い黄色に表示。

6. Solver で数独の候補を自動生成

Solver は“最適化”ツールですが、数独は“制約”問題として解くことが可能です。

6.1 Solver 設定

パラメータ 内容
対象セル (Set Objective) 0 のセルを 0 に設定(最小化)
変更セル (By Changing Variable Cells) 0 で埋めるセル全て(A2:I9)
制約 1) 各セルは 1〜9 の整数
2) 各行・列・ボックスの合計は 45 (1+2+…+9)

制約の入力例

  • 変数セルを選択 → Solver制約条件
    1. A2:I9 が整数 (整数)
    2. A2:I9 の値 ≤ 9
    3. A2:I9 の値 ≥ 1
    4. ROW_SUM (例: =SUM(A2:I2)) = 45
    5. 同上列・ボックス。

ポイント:Solver は複数解を返す可能性がありますので、最小値 方式で動作させ、一度に解が一つだけ出るようにします(最小化 として 0 を設定)。

6.2 実行

  • Solver解決 を押すと、まだ埋められたセルが 0 であれば Solver が自動的に値を入れてくれます。

7. VBA でより簡易化(ヒント生成)

初心者でも簡易マクロを使えば「このセルに入れられる候補」が列挙されます。

Option Explicit

Sub ShowCandidates()
    Dim rng As Range, cell As Range
    Dim rowNum As Integer, colNum As Integer, boxNum As Integer
    Dim candidates As Collection
    Dim i As Integer

    Set rng = Selection
    For Each cell In rng
        If cell.Value = "" Then
            Set candidates = New Collection
            For i = 1 To 9
                If Not IsInRow(cell, i) And Not IsInColumn(cell, i) And Not IsInBox(cell, i) Then
                    candidates.Add i
                End If
            Next i
            cell.Interior.Color = RGB(255, 255, 153) ' light yellow highlight
            cell.Comment.Delete
            Dim cmt As Comment
            Set cmt = cell.AddComment
            cmt.Text Text:=Join(CollectionToArray(candidates), ", ")
        Else
            cell.Interior.ColorIndex = xlNone
            If Not cell.Comment Is Nothing Then cell.Comment.Delete
        End If
    Next cell
End Sub

Function IsInRow(cell As Range, num As Integer) As Boolean
    IsInRow = (Application.CountIf(cell.EntireRow, num) > 0)
End Function

Function IsInColumn(cell As Range, num As Integer) As Boolean
    IsInColumn = (Application.CountIf(cell.EntireColumn, num) > 0)
End Function

Function IsInBox(cell As Range, num As Integer) As Boolean
    Dim rStart As Long, cStart As Long
    rStart = (Int((cell.Row - 1) / 3) * 3) + 1
    cStart = (Int((cell.Column - 1) / 3) * 3) + 1
    IsInBox = (Application.CountIf(Cells(rStart, cStart).Resize(3, 3), num) > 0)
End Function

Function CollectionToArray(col As Collection) As Variant
    Dim a() As Variant, i As Long
    ReDim a(1 To col.Count)
    For i = 1 To col.Count
        a(i) = col(i)
    Next i
    CollectionToArray = a
End Function

使い方

  1. Alt + F11 で VBA エディタを開く。
  2. 挿入 → 標準モジュール を選択し、上記コードを貼り付け。
  3. Excel に戻り、候補を知りたいセル範囲を選択 (A1:I9 等)。
  4. Alt + F8ShowCandidates 実行。
  5. 空セルにコメントが付くので、そこに表示された候補を見る。

8. よくあるトラブルと対策

トラブル 原因 対策
Solver が進まず 制約が重複している 制約を簡略化し、重複箇所を削除
コメントが残らない セルに既にコメントが存在 コメントをクリア (cell.Comment.Delete)
行列合計が 45 にならない 7,8,9 の入力漏れ 直接入力で修正、または =SUM(A2:I2) で再計算
シートがロックされない 保護設定ミス シートを再保護、校閲 → シートを保護 で確認

9. まとめ

  • エクセルは、数独を解くために 条件付き書式Solver, VBA を組み合わせることで「自動補完」「候補表示」などが実現できます。
  • 初心者でも「セルに数値入力 → Solver で解決 → コメントで候補確認」の手順を踏めば、数独の理解も深まります。
  • エクセルで数独を解く技術は、スプレッドシート業務における「ロジック表現」「制約処理」のスキルとしても活かせるため、ぜひ練習してみてください。

次回は「Excel の Power Query を使って複雑なパズルの入力データを自動生成する方法」を紹介予定。楽しみにしています。

コメント

タイトルとURLをコピーしました