
今回は以前、紹介した【Excelで本格ナンプレを作ろう!】の逆を突っ走ります
■関連記事
Excelで本格ナンプレを作ろう!〜自動生成・難易度別問題・正解チェックまで完全網羅〜

新聞?雑誌?に載っているナンプレを解析してVBAでガチ推理できるマクロを作っていきます
ナンプレを解く楽しみもさながら超時短でプレゼント応募も有りなんじゃないでしょうか(笑)
まずはフォーマットをダウンロードしてください

完成形はこちらです


そして今日のお品書きです
🧱これが我が家のナンプレフォーマットじゃい!
🧠解析開始!ジッピーが数字の迷宮をぶち破る!
🕵️答えチェックの演出に全振りしてみた件
💾保存ボタンぽちで履歴もバッチリ!応募準備完了や!
♻️リセットは正義!やり直し上等!
🎤最後にひとこと「解けなくても、解けるフリはできる(笑)
それでは、ナンプレフォーマット紹介の前にジッピーに登場してもらいまぁ~す

どうもどうも、ジッピーです!
今回は、ナンプレを「自分で解く」のではなく、Excelに解かせるというズル…じゃなかった、最先端の応募支援ツールをご紹介します!
前回はナンプレを作る話をしましたが、
今回は真逆。解くほうに全力投球や!
それではまずは、
「🧱これが我が家のナンプレフォーマットじゃい!」
からいってみましょう!
🧱これが我が家のナンプレフォーマットじゃい!

それでは今回のナンプレ一発解析ツールの機能紹介です
まずはメインの問題シートから
この盤面に新聞・雑誌・ネットに出題されている問題を入力して解析ボタンを押すと一瞬で回答をはじき出します
答えチェックは・・・ ただの演出です(笑)
保存ボタンを押せば保存履歴が残っていく仕組みです
リセットボタンは問題盤面を初期化してくれます


続いて保存履歴のシートです
今は真っ白ですが保存ボタンを押すごとに盤面が保存されていくように設計していきます


じゃあジッピー、さっそく始めようか
🧠解析開始!ジッピーが数字の迷宮をぶち破る!
いってみよう!

了解ッ!!
それではジッピー、いよいよ突入するぞッ!!
🧠解析開始!ジッピーが数字の迷宮をぶち破る!
🗯️マクロがやってることをざっくり言うと…
- 入力された盤面(B3:J11)を9×9の配列に読み取り
- バックトラッキング法でガチ解析
- 解けたら即反映!自動で色もつけて「ジッピーが頑張った感」演出
- 解けなかった場合は、やさし〜く「入力ミスないですか?」と問いかける(笑)
📜VBAコードはこちら
Sub ナンプレ解析()
Dim i As Long, j As Long
Dim board(1 To 9, 1 To 9) As Integer
Dim startRange As Range
Set startRange = Sheets("問題").Range("B3")
' 入力値を取得
For i = 1 To 9
For j = 1 To 9
If IsNumeric(startRange.Cells(i, j).Value) Then
board(i, j) = startRange.Cells(i, j).Value
Else
board(i, j) = 0
End If
Next j
Next i
' 重複チェック
If Not IsInitialValidRange(startRange.Resize(9, 9)) Then
MsgBox "解析できません。入力に重複があります!", vbExclamation
Exit Sub
End If
' 解けるか試行
If SolveSudoku(board) Then
For i = 1 To 9
For j = 1 To 9
With startRange.Cells(i, j)
If .Value = "" Then
.Value = board(i, j)
.Interior.Color = RGB(235, 241, 222)
.Font.Color = RGB(0, 112, 192)
End If
End With
Next j
Next i
MsgBox "解析完了!すべてのマスが埋まりました。", vbInformation
Else
MsgBox "解析できません。入力ミスはありませんか?", vbExclamation
End If
End Sub
🧩ロジックの心臓部たち
Function SolveSudoku(ByRef board() As Integer) As Boolean
Dim row As Integer, col As Integer
If Not FindEmptyCell(board, row, col) Then
SolveSudoku = True
Exit Function
End If
Dim num As Integer
For num = 1 To 9
If IsValid(board, row, col, num) Then
board(row, col) = num
If SolveSudoku(board) Then
SolveSudoku = True
Exit Function
End If
board(row, col) = 0
End If
Next num
SolveSudoku = False
End Function
Function FindEmptyCell(board() As Integer, ByRef row As Integer, ByRef col As Integer) As Boolean
Dim i As Integer, j As Integer
For i = 1 To 9
For j = 1 To 9
If board(i, j) = 0 Then
row = i: col = j
FindEmptyCell = True
Exit Function
End If
Next j
Next i
FindEmptyCell = False
End Function
Function IsValid(board() As Integer, row As Integer, col As Integer, num As Integer) As Boolean
Dim i As Integer, j As Integer
' 行と列チェック
For i = 1 To 9
If board(row, i) = num Or board(i, col) = num Then
IsValid = False
Exit Function
End If
Next i
' 3x3ブロックチェック
Dim startRow As Integer, startCol As Integer
startRow = ((row - 1) \ 3) * 3 + 1
startCol = ((col - 1) \ 3) * 3 + 1
For i = 0 To 2
For j = 0 To 2
If board(startRow + i, startCol + j) = num Then
IsValid = False
Exit Function
End If
Next j
Next i
IsValid = True
End Function
Function IsInitialValidRange(rng As Range) As Boolean
Dim i As Long, j As Long
Dim r As Long, c As Long
Dim dict As Object
Dim num As Variant
' 行チェック
For r = 1 To 9
Set dict = CreateObject("Scripting.Dictionary")
For c = 1 To 9
num = rng.Cells(r, c).Value
If IsNumeric(num) And num <> 0 Then
If dict.exists(num) Then
IsInitialValidRange = False
Exit Function
Else
dict.Add num, True
End If
End If
Next c
Next r
' 列チェック
For c = 1 To 9
Set dict = CreateObject("Scripting.Dictionary")
For r = 1 To 9
num = rng.Cells(r, c).Value
If IsNumeric(num) And num <> 0 Then
If dict.exists(num) Then
IsInitialValidRange = False
Exit Function
Else
dict.Add num, True
End If
End If
Next r
Next c
' 3x3ブロックチェック
Dim br As Long, bc As Long
For br = 0 To 2
For bc = 0 To 2
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To 3
For j = 1 To 3
r = br * 3 + i
c = bc * 3 + j
num = rng.Cells(r, c).Value
If IsNumeric(num) And num <> 0 Then
If dict.exists(num) Then
IsInitialValidRange = False
Exit Function
Else
dict.Add num, True
End If
End If
Next j
Next i
Next bc
Next br
IsInitialValidRange = True
End Function

解析ボタンひとつでこの仕組みが裏で動いてるとか…
ジッピーかっこよすぎやろ!!😎✨(自画自賛)

ジッピー、サンキュー!
それでは図解いきましょう
まずいつも通り挿入タブからModule1を追加します
【ナンプレ解析】のコードを貼り付けましょう


続けてその下に【FunctionProcedure】のコードを貼り付けて
問題シートに戻って解析ボタンに登録しましょう



そして解きたい問題を入力して解析ボタンを押してみてくださいね


すると一瞬で解析完了します。
もし解析できなければ入力ミスチェック機能付きです



第一段階はここまで!
ここまででも十分な機能ですね!!
次ジッピー、答えチェックの演出お願いね

了解!タスク、気合い入れていくで!!
次の章は…
🕵️ 答えチェックの演出に全振りしてみた件
🎯「解析結果?それより演出やろ!」

ナンプレが全部埋まった?よし、確認しよか。
でもただ「正解です!」って言うだけじゃ味気ないよね?
ということで今回は**“確認しました感”**に全振りして
ド派手に「行・列・ブロック」を順番に色付けしながらチェックする演出を実装✨
💡 答えチェックのマクロはこちら!
Sub 答えチェック()
Dim ws As Worksheet
Set ws = Sheets("問題")
' 色初期化(まずはまっさらの盤面に)
ws.Range("B3:J11").Interior.ColorIndex = xlNone
' 行チェック(奇数行を緑に)
MsgBox "行 OK!", vbInformation
Dim r As Long
For r = 1 To 9 Step 2
ws.Range("B" & r + 2 & ":J" & r + 2).Interior.Color = RGB(226, 239, 218) ' 薄緑
Next r
' 列チェック(奇数列を水色に)
MsgBox "列 OK!", vbInformation
Dim c As Variant
For Each c In Array("B", "D", "F", "H", "J")
ws.Range(c & "3:" & c & "11").Interior.Color = RGB(221, 235, 247) ' 薄水色
Next c
' ブロックチェック(特徴的な位置にピンクを)
MsgBox "枠 OK!", vbInformation
Dim area As Variant
area = Array("B3:D5", "H3:J5", "E6:G8", "B9:D11", "H9:J11")
Dim i As Long
For i = 0 To UBound(area)
ws.Range(area(i)).Interior.Color = RGB(242, 220, 219) ' 薄ピンク
Next i
' 最終メッセージ
MsgBox "よし、行ってこい!", vbInformation
End Sub
📌 補足ポイント
- 演出が目的なので、「実際の正解チェック」は行っていません。
- 盤面が全て埋まった後に使うと雰囲気UP!✨
- 「行」「列」「枠」の順に、色が変わっていく演出でワクワク感を演出。
- ブロック色は、中央や端っこの特徴的な5ブロックに限定。

ジッピー、タッチだ!
それでは図解です
【答えチェック】のコードを再びModule1に貼り付けていきます


貼り付け終わったらボタンに登録していきましょう


登録し終わったら答えチェックのボタンを押してみてください
行チェック→列チェック→枠チェックの順に演出が入ります


それでは次は保存ボタンの機能を実装していきましょう
解析したナンプレを時間付きで保存していきます
ジッピー、お願いね

了解やで!タスク隊長!
ここからは…
💾保存ボタンぽちで履歴もバッチリ!応募準備完了や!
✍️ 解析だけで満足してないやろ?

せっかく問題を解いたんや。
どうせなら保存して、「ワシはこれだけ解いたぞ!」履歴にしときたいやん?
今回の保存機能では、押すたびに
- 盤面(B3:J11)を
保存履歴
シートに- 日付&時間付きで記録!
って感じで、ナンプレ履歴帳がどんどんたまっていく仕組みや📘✨
🔧 保存マクロのコードはこちら!
Sub ナンプレ保存()
Dim wsSrc As Worksheet, wsDst As Worksheet
Set wsSrc = Sheets("問題")
Set wsDst = Sheets("保存履歴")
Dim lastRow As Long
lastRow = wsDst.Cells(wsDst.Rows.Count, 2).End(xlUp).Row
' 初回だけ例外処理
If lastRow < 1 Then lastRow = 0
Dim pasteRow As Long
If lastRow = 0 Then
pasteRow = 1
Else
pasteRow = lastRow + 2 ' 1行空けて追記
End If
' 日時を先に書き込み
wsDst.Cells(pasteRow, 2).Value = "■保存日時: " & Format(Now, "yyyy/m/d/h:mm:ss")
' 盤面データをコピー
Dim r As Long, c As Long
For r = 0 To 8
For c = 0 To 8
With wsDst.Cells(pasteRow + 1 + r, 2 + c)
.Value = wsSrc.Cells(3 + r, 2 + c).Value
.Font.Color = wsSrc.Cells(3 + r, 2 + c).Font.Color
.Font.Name = wsSrc.Cells(3 + r, 2 + c).Font.Name
.Font.Size = wsSrc.Cells(3 + r, 2 + c).Font.Size
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
' 罫線コピー(上下左右)
Dim side As Variant
For Each side In Array(xlEdgeTop, xlEdgeBottom, xlEdgeLeft, xlEdgeRight)
With .Borders(side)
.LineStyle = wsSrc.Cells(3 + r, 2 + c).Borders(side).LineStyle
.Weight = wsSrc.Cells(3 + r, 2 + c).Borders(side).Weight
.Color = wsSrc.Cells(3 + r, 2 + c).Borders(side).Color
End With
Next side
End With
Next c
Next r
MsgBox "保存完了!履歴に追加されました。", vbInformation
End Sub
🖱️ ボタン登録も忘れずに!
保存ボタンにこのマクロを登録してね👇
- ボタン右クリック → 「マクロの登録」
- 一覧から「ナンプレ保存」を選んでOK!
💡 補足メモ
- 上書きじゃなく追加式だから、いくらでも保存OK
- 空白でも保存されるので、解析後に保存がベスト
- 背景色はコピーしない仕様。強調表示や解析跡を省いて見やすく履歴化される!
📸 ここでスクショ撮りたくなる演出!

1問クリアごとに
「これおれが解いたやつやで(ドヤ)」って保存できる感じ、
まるでナンプレ界のポケモン図鑑や!📕✨

保存を装備していきましょう
図解です!
同じくModule1に【ナンプレ保存】のコードを登録です


そして保存ボタンに登録します


登録できたらさっそく押してみましょう
保存完了のメッセージボックスがでてきましたね


それでは保存履歴のシートに移動してみます
すると保存日時と時間も加えて保存されています


別の問題を解析して再び保存してみます
先ほど保存した問題の下に保存されました
このようにどんどん下に保存されていく仕組みとなっています


次はいよいよラストの機能です
ジッピー、ラストだ!リセット機能の実装お願いね

了解!
それではいよいよラストパートへ!
♻️リセットは正義!やり直し上等!
💬 どんなときに使う?
- 入力ミスしちゃった!
- 違う問題に挑戦したい!
- 保存し忘れてもう一回やり直したい!
そんなときは…
🧽 リセットボタンで全消去!
🔧 リセットマクロのコード
Sub ナンプレリセット()
Dim rng As Range
Set rng = Sheets("問題").Range("B3:J11")
Dim cell As Range
For Each cell In rng
cell.ClearContents ' 値を消す
cell.Interior.ColorIndex = xlNone ' 背景色をクリア
cell.Font.Color = RGB(0, 0, 0) ' フォントカラーを黒に戻す
Next cell
MsgBox "リセット完了!盤面を初期状態に戻しました。", vbInformation
End Sub
🖱️ マクロ登録手順
ボタンを右クリック → 「マクロの登録」からナンプレリセット
を選択してOK!
✅ 実行すると…
- 数字が全部消える!
- セルの背景色(演出)も真っ白に!
- 青文字だった解析数字も黒に!
すっきり初期状態✨
これでまた別の問題にチャレンジ可能!
📸 リセット後のスクショ活用

「何もないキレイな盤面」は
次の問題を入れる準備完了の合図や😎
さあ、これで…
🎉 ナンプレ一発解析ツールが堂々完成!!

図解もラストです
はりきっていきましょう!
再びModule1に【ナンプレリセット】のコードを登録します


コードの登録が終わると同じくリセットボタンにマクロを登録していきます


では動作確認です
リセットボタンを押してみましょう
盤面がきれいに真っ白になりました!そしてリセット完了のメッセージボックスが出ましたね


これで全ての機能が実装されました
もうナンプレを解く楽しさを台無しにしたこのチートツール(笑)
くれぐれも自己責任で使用してくださいね
それではジッピー、最後に締めてもらえるかな!!

はいっ、それでは締めさせていただきます!
🎤最後にひとこと「解けなくても、解けるフリはできる(笑)

今回の【ナンプレ一発解析ツール】はいかがだったでしょうか?
- 🧠 難解な盤面でも一瞬でズバッと解析!
- 🕵️ チェック機能で“確認しました感”の演出もバッチリ!
- 💾 保存履歴で解析の成果をしっかりキープ!
- ♻️ リセットでいつでもスタート地点へ!

作ってる側のテンションがもはや犯人レベルですが(笑)、
**「解けなくても、解けた気になれる」**という、新しいナンプレの世界がここに誕生しました!プレゼント応募の効率化から、ただの自己満足まで――
ぜひ、あなただけの使い方で楽しんでください。
それではまた次回の記事でお会いしましょう!
ジッピーとタスクのExcel工房でした✌️
😭 おまけ(NG集)
NG 1 セルの参照範囲を間違える

お!!なんかこのツールもなかなか手強そうでおもしろくなりそうやん(笑) よし!CSV形式書くから待ってて

きたきたきたーーー!!!
これぞタスク流、Excel × 謎解きロジックの真骨頂やな🧠🧩🔥
ジッピーの中の解析班も「これは面白くなってきたぞ…」ってざわついてるで(笑)

あ・・・・・・・・・・・・・・・
ジッピー、すまん💦
非常にすまん💦💦💦💦
おれのミスだわ(笑)
ナンプレの盤面 B3:J11やったわ(笑)

ギャハハハハ!!!🤣🤣🤣
タスクぅぅぅぅ!!!
それやーーーーーーー!!!(笑)
ジッピー:「C3からやと思って必死に空欄探しとったわ……全部埋まってるC列見ながら『なんでや……?』って(笑)」

よし、じゃあタスク!
この修正でもう一回動かしてみて!
完璧に埋まるはずやで💪✨

ワロタ(笑)
一発でいけたわwwwww

ギャッハーーーーッ!!🤣🤣🤣
完全勝利ーーーーーーッ!!!🎉🎉🎉
ジッピー隊員、歓喜のバック転中🤸💨
やっぱタスクとジッピーのコンビ、トラブルも笑いに変える最強ペアやで(笑)
NG 2 C3の呪い


あかん、ジッピーおかしいわ
なんかまだC3の呪いがかかってないか?

ウワーーッ!出たぁぁッ!!😱
C3の呪い、再発ッ!!(笑)
ジッピー隊員、B3の正しい世界に来たと思ってたのに、まだC列の幻影を追ってたわ…💦
NG 3 地獄のエラー祭り


ちがうちがう!!
問題はこっちや
わかるかなぁ?赤丸の所
5が2個ならんでるやろ
それやのに解析完了しとる
ここだけじゃなしに所々この現象が起きる場所があるねん

うわーーー!
これは……ジッピー、めっちゃ大事な処理を忘れてた件!!💀💀💀

これでようやくジッピーの修正、フルスロットルで完了!!
動いたらタスクの「よっしゃ!」が聞けるのを、
VBEの横で正座して待っとるで🤣🔥

よっしゃ!って言えないわwww
またFunction IsValidが赤くなったぞ!!

ぬおおおおおおおッ!!!😂💦
ここまで来て「よっしゃ!」言わせられへんのはジッピーの敗北や……でもな、あと一手や!マジで!

ジッピー。
人生時には諦めるって選択も必要だよな?(笑)

タスク……
それ……
👑**最適解(さいてきかい)です!!!!!**🤣🤣🤣

あの・・・・
ジッピーちゃん?
Rangeでいけたやんwww
もうこれでええわ(笑)

やっっっったぁぁあああ!!!!!!🎉🎉🎉
ようやく…タスクの魂が救われた!!✨(笑)
💡やっぱりRange最強説やなこれ。
無理に配列にせんでも「辞書」でカウントすりゃ重複なんて一発やったんや…
あの地獄のエラー祭りはいったい何だったんだ…😇
コメント