エクセルでナンプレを簡単に解く!初心者向けステップバイステップガイド
はじめに
日常的に使うエクセル(Excel)は、表計算ソフトとしてだけでなく、数理的なパズルを解くための強力なツールでもあります。今回は、エクセルを使って一目で行き詰まりを回避でき、初心者でも短時間でナンプレ(数独)を解ける方法を紹介します。
「エクセルに数独を敷いたら、どうやって解くの?」という疑問に応え、設定から実装までをわかりやすくまとめました。
1. エクセルで数独を解くメリット
| メリット | 説明 |
|---|---|
| 自動化 | 条件付き書式や Solver でルールを自動チェック |
| 視覚化 | 色分けしてセルごとの状態を一目で把握 |
| 拡張性 | マクロで反復作業を高速化 |
| 実践的スキル | Excel の関数・VBA を使うことで、スプレッドシートのレベルアップ |
2. 必要なツールとセットアップ
- Microsoft Excel(バージョン 2016 以降推奨)
- Solver アドイン(標準インストールされていない場合は「ファイル → オプション → アドイン → Excel アドイン → Solver アドイン」にチェック)
-
VBA(マクロ)機能が有効なブックを作成する(
xlsmフォーマットで保存)
3. 3×3 ボックスを実際のセルにマッピング
+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| G | H | I |
+---+---+---+
- A1〜I1 が最初の 3×3 ボックス
- A4〜I4 が次のボックス
- … 直下に同様の構造で設置
手順
- A1 から I9 までを選択し、罫線を「太い線」で囲み、セル幅/高さを 2.5 cm に合わせる。
- それぞれの 3×3 ブロックに 3 px の太線を引くことでボックス境界が明確化。
4. 既存の数値を入力
- 手元にある数独の初期数値をセルに入力。
- ①セル(例:C2)に
1を入力すると、そのセルの値は固定。 - ① 固定セルを保護
- シート全体を選択 → 右クリック →
セルの書式設定→保護チェックを外す。 - 再度 ①セルを選び、保護にチェック。
-
校閲→シートを保護でパスワード不要でロック。
- シート全体を選択 → 右クリック →
5. 条件付き書式でルールを視覚化
5.1 2 つ以上の同じ数が行を横断している場合
- 行全体(例:B2:G2)を選択。
-
ホーム→条件付き書式→新しいルール→式を使用して設定する書式.
=COUNTIF($A$2:$I$2, A2)>1
- 書式で
塗りつぶしを薄い赤に設定。 - 同様に各列と 3×3 ボックスにもルールを設定(列は
$A2、ボックスはINDIRECT("A"&ROW(A2)-MOD(ROW(A2)-1,3)*3)等で相対参照)。
5.2 3×3 ボックス内で重複がある場合
- シート全体を選択。
-
新しいルール→式を使用
=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→制約条件-
A2:I9が整数 (整数) -
A2:I9の値 ≤ 9 -
A2:I9の値 ≥ 1 -
ROW_SUM(例:=SUM(A2:I2)) = 45 - 同上列・ボックス。
-
ポイント: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
使い方
-
Alt + F11で VBA エディタを開く。 -
挿入 → 標準モジュールを選択し、上記コードを貼り付け。 - Excel に戻り、候補を知りたいセル範囲を選択 (
A1:I9等)。 -
Alt + F8→ShowCandidates実行。 - 空セルにコメントが付くので、そこに表示された候補を見る。
8. よくあるトラブルと対策
| トラブル | 原因 | 対策 |
|---|---|---|
| Solver が進まず | 制約が重複している | 制約を簡略化し、重複箇所を削除 |
| コメントが残らない | セルに既にコメントが存在 | コメントをクリア (cell.Comment.Delete) |
| 行列合計が 45 にならない | 7,8,9 の入力漏れ | 直接入力で修正、または =SUM(A2:I2) で再計算 |
| シートがロックされない | 保護設定ミス | シートを再保護、校閲 → シートを保護 で確認 |
9. まとめ
- エクセルは、数独を解くために 条件付き書式、Solver, VBA を組み合わせることで「自動補完」「候補表示」などが実現できます。
- 初心者でも「セルに数値入力 → Solver で解決 → コメントで候補確認」の手順を踏めば、数独の理解も深まります。
- エクセルで数独を解く技術は、スプレッドシート業務における「ロジック表現」「制約処理」のスキルとしても活かせるため、ぜひ練習してみてください。
次回は「Excel の Power Query を使って複雑なパズルの入力データを自動生成する方法」を紹介予定。楽しみにしています。

コメント