ナンプレ解析はExcelに任せよう!プレゼント応募?そんなのオマケや(笑)

Excel便利ツール
タスク
タスク

今回は以前、紹介した【Excelで本格ナンプレを作ろう!】の逆を突っ走ります

■関連記事
Excelで本格ナンプレを作ろう!〜自動生成・難易度別問題・正解チェックまで完全網羅〜

タスク
タスク

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


タスク
タスク

完成形はこちらです


タスク
タスク

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

それでは、ナンプレフォーマット紹介の前にジッピーに登場してもらいまぁ~す


ジッピー(ChatGPT)
ジッピー(ChatGPT)

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

🧱これが我が家のナンプレフォーマットじゃい!

タスク
タスク

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


タスク
タスク

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

了解ッ!!
それではジッピー、いよいよ突入するぞッ!!


🧠解析開始!ジッピーが数字の迷宮をぶち破る!


🗯️マクロがやってることをざっくり言うと…

  • 入力された盤面(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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

了解!タスク、気合い入れていくで!!
次の章は…


🕵️‍ 答えチェックの演出に全振りしてみた件

🎯「解析結果?それより演出やろ!」

ジッピー(ChatGPT)
ジッピー(ChatGPT)

ナンプレが全部埋まった?よし、確認しよか。
でもただ「正解です!」って言うだけじゃ味気ないよね?
ということで今回は**“確認しました感”**に全振りして
ド派手に「行・列・ブロック」を順番に色付けしながらチェックする演出を実装✨


💡 答えチェックのマクロはこちら!

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に貼り付けていきます


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

了解やで!タスク隊長!
ここからは…


💾保存ボタンぽちで履歴もバッチリ!応募準備完了や!


✍️ 解析だけで満足してないやろ?

ジッピー(ChatGPT)
ジッピー(ChatGPT)

せっかく問題を解いたんや。
どうせなら保存して、「ワシはこれだけ解いたぞ!」履歴にしときたいやん?
今回の保存機能では、押すたびに

  • 盤面(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
  • 空白でも保存されるので、解析後に保存がベスト
  • 背景色はコピーしない仕様。強調表示や解析跡を省いて見やすく履歴化される!

📸 ここでスクショ撮りたくなる演出!

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

了解!
それではいよいよラストパートへ!


♻️リセットは正義!やり直し上等!


💬 どんなときに使う?

  • 入力ミスしちゃった!
  • 違う問題に挑戦したい!
  • 保存し忘れてもう一回やり直したい!

そんなときは…
🧽 リセットボタンで全消去!


🔧 リセットマクロのコード

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!


✅ 実行すると…

  • 数字が全部消える!
  • セルの背景色(演出)も真っ白に!
  • 青文字だった解析数字も黒に!

すっきり初期状態✨
これでまた別の問題にチャレンジ可能!


📸 リセット後のスクショ活用

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

はいっ、それでは締めさせていただきます!


🎤最後にひとこと「解けなくても、解けるフリはできる(笑)


ジッピー(ChatGPT)
ジッピー(ChatGPT)

今回の【ナンプレ一発解析ツール】はいかがだったでしょうか?


  • 🧠 難解な盤面でも一瞬でズバッと解析!
  • 🕵️‍ チェック機能で“確認しました感”の演出もバッチリ!
  • 💾 保存履歴で解析の成果をしっかりキープ!
  • ♻️ リセットでいつでもスタート地点へ!

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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

😭 おまけ(NG集)

NG 1 セルの参照範囲を間違える

タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


ジッピー(ChatGPT)
ジッピー(ChatGPT)

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

タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


NG 2 C3の呪い

タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


NG 3 地獄のエラー祭り

タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


ジッピー(ChatGPT)
ジッピー(ChatGPT)

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

タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


タスク
タスク

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

ジッピー(ChatGPT)
ジッピー(ChatGPT)

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


おしまい

コメント

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