📝概要
⚙️ツール
ツールのダウンロード
ツールの概要
ツールの目的と背景
機能紹介
実際の授業・家庭学習での使い方
まとめ
🧾このツールの仕様
てびきシート|子どもが迷わず設定できるUI
もんだいシート|即時フィードバックで理解を深める
ランキングシート|得意・苦手を見える化
その他のシート
💻VBAのプログラムの構成
共通定数モジュール
問題作成モジュール
答え合わせと分析モジュール
小2の九九を“自動生成して学べる”Excel×VBAツールの制作記録です。
問題作成・答え合わせ・誤答分析までを一つにまとめ、子どもの理解を見える化した実践を紹介しています。
ツールは下記ページからダウンロードすることができます。
noteへ
なお、こちらからダウンロードできるExcelファイルには、ブックの保護とシートの保護をかけています。
ブックの保護を解除し非表示シートを表示したり、仕組みを見るためにシートの保護を解除する場合は、下記パスワードを使用します。
パスワード:math1234
小2の九九を自分で作って学べるExcelツールの実践例です。
子どもが迷わず操作できるUI/UXを軸に、問題作成から誤答分析までを一つにまとめました。
児童が触るのは、てびきシート、もんだいシート、ランキングシートです。
非表示シートとして、解答シート、分析シート、設定シートがあります。
小学校2年生の九九学習では、ただ暗記するだけでなく、
「自分で問題を作り、解き、振り返る」 という一連の流れが、理解の定着に大きく影響します。
しかし、紙のプリントでは問題作成や誤答分析に時間がかかり、
子ども自身が学びをコントロールすることが難しい場面もあります。
そこで、このツールでは Excel × VBA を活かし、
子どもが 自分で段を選び、問題数を決め、順番を指定して問題を生成できる 仕組みを作りました。
操作はシンプルで、UI/UXの工夫により、
小学生でも迷わず「自分で学びを進める」体験ができるよう設計しています。
さらに、正誤判定や誤答の集計を自動化することで、
どの段が苦手なのか、どこでつまずいているのか がすぐに可視化され、
先生や保護者はもちろん、子ども自身も学習の振り返りがしやすくなります。
このツールは、
「学習の主体性」 と 「理解の可視化」 を両立させるための実践例であり、
Excelが算数教育において“体験的な学び”を支える可能性を示しています。
● 問題作成(段の選択・問題数・順番)
子どもが自分で条件を選ぶことで、学習の主体性が育つ。
● 答え合わせ(自動判定)
正誤がすぐにわかり、学習のテンポが崩れない。
● 誤答分析(弱点の可視化)
どの段が苦手かを自動で集計し、次の学習につなげられる。
ここからはデザインの工夫やツールの紹介をします。
シート構成は下記
・てびきシート
・もんだいシート
・ランキングシート
・解答シート
・分析シート
・設定シート
九九の問題を作る前に、
「どの段をつくる?」「何問つくる?」「順番はどうする?」
を子ども自身が選べるようにした、操作ガイド兼設定画面です。
小学生でも迷わず進められるよう、流れを4ステップに整理しています。

①〜④の番号で“やることの順番”が一目でわかる
子どもの視線が自然に上から下へ流れるように設計。
選択肢をグループ化して迷わない構造
九九の段は3列に整列し、どれを選んだかがすぐに把握できる。
余白を広くとり、情報量を最適化
小学生が読む前提で、文字量・行間・配置を丁寧に調整。
青いボタンで“次の行動”が明確
「もんだいをつくる」ボタンを視認性の高い色で統一し、
行動の迷いをなくす。
自分で条件を選ぶことで、学習の主体性が育つ
“与えられた問題を解く”だけでなく、
“自分で問題を作る”という体験が学びの質を高める。
問題作成のプロセスが理解の整理につながる
どの段を選ぶか考えることで、九九の構造を自然に意識できる。
操作が簡単だから、学習のテンポが途切れない
UIの迷いがないことで、学習そのものに集中できる。
子どもが自分で作った九九の問題を、
その場で答え合わせできる学習シートです。
入力した答えに対して、正解・不正解がすぐに表示され、
学習のテンポを崩さずに取り組めるように設計しています。

こたえ欄は「日本語入力」を無効にする設定を入れています。また、数字の1~100までしか入れることができないようになっています。
つまり、誤入力がしづらい設計になっているのです。
解答をすべて入力し終わったら答え合わせをします。

正解すると、問題番号が緑色になり、「この下に 「せいかい」か 「ざんねん」かが でてくるよ」の欄に正解の文字列がランダムで表示されます。
不正解だと、問題番号が赤色になり、「この下に 「せいかい」か 「ざんねん」かが でてくるよ」の欄に不正解の文字列がランダムで表示されます。
大きなボタンで操作が迷わない
「こたえあわせをする」ボタンを大きく配置し、
小学生でも直感的に次の行動がわかるようにしています。
1行ごとに“問題 → 答え → 結果”が完結
視線の流れが自然で、どこを見ればいいか迷わない構造。
フィードバックがやさしい言葉で返ってくる
「せいかい」「ざんねん」など、
子どもが前向きに取り組める表現を採用。
余白を広くとり、見やすさを最優先
小さな画面でも読みやすく、ストレスなく学習できる。
即時フィードバックで理解が深まる
答えを入力してすぐ結果がわかるため、
正しい九九のイメージが定着しやすい。
誤答の気づきが次の学習につながる
どの段で間違えたかが明確になり、
苦手の把握と克服に役立つ。
自分で作った問題だから学習意欲が高まる
“自分で選んだ問題を解く”という体験が、
主体的な学びを自然に引き出す。

もんだいシートで答えた結果をもとに、
「どの段が得意か・どの段が苦手か」 を自動でランキング表示するシートです。
正答率の高い段は「すごい!!」、
もう少し練習が必要な段は「がんばろう!」として、
子どもが前向きに学べるように工夫しています。
ランキングの部分は分析シートと連動しており、分析シートの正解率がランキングシートのランキングに反映されます。
ただし、問題を解き直した際には反映されません。
得意・苦手を“2つの枠”で直感的に表示
色と見出しでグループ化し、子どもでも一目で理解できる。
ランキングを3位までに絞って見やすく
情報を最小限に整理し、視線の負担を減らす。
データ表は縦横の整列で読みやすく
日付・段・正答数が整然と並び、先生や保護者も分析しやすい。
余白を広くとり、数字が苦手な子でも安心
“ぎゅうぎゅう感”をなくし、落ち着いて見られるデザイン。
苦手の可視化で、次の学習が明確になる
どの段を優先して練習すべきかが一目でわかる。
成功体験を強調して学習意欲を高める
「すごい!!」の枠に入ることで、子どもが自信を持つことができる。
データを蓄積して成長を見える化
日ごとの記録が残るため、
“できるようになってきた”変化を親子で共有できる。
先生・保護者の指導が効率化
どの段でつまずいているかが明確なので、
ピンポイントで声かけや補助ができる。

問題番号、問題、解答、段を管理しています。
解答は答え合わせをする際に、段は分析をする際に役立てます。

こちらは正解率を管理しているシートです。
各段ごとの正解率を出しています。

設定シートではてびきシートで選択されたものや、再解答判定、正解時や不正解時の表示文字列を管理しています。
表示文字列はいくつでも指定でき、ここで指定したものが答え合わせの際にランダムで表示されます。
ここからはVBAのコードの紹介をします。
下記モジュールで構成されています。
①共通定数モジュール
②出題モジュール
③解答(答え合わせ)と分析モジュール
Option Explicit 'シート名 Public Const SHEET_NAME_QES = "もんだい" Public Const SHEET_NAME_ANS = "解答" Public Const SHEET_NAME_SET = "設定" Public Const SHEET_NAME_RANK = "ランキング" Public Const SHEET_NAME_ANALYSIS = "分析" Public Const PW = "math1234"
最近、私がプログラムを組む傾向としては、共通の定数は定数モジュールにおき、それを呼び出す形を取っています。
定数名はすべて大文字で記述するという暗黙のルールがあります。
定数名が変わっても容易に変更できるというメリットがあります。
Option Explicit
Sub makeQes()
'【変数の宣言】
Dim wb As Workbook 'このファイル
Dim wsQes As Worksheet 'もんだいシート
Dim wsAns As Worksheet '解答シート
Dim wsSet As Worksheet '設定シート
Dim ArrQes() As String '問題
Dim ArrAns() As Long '解答
Dim ArrNum() As Long '段
Dim cntArr As Long '問題と解答のデータ数
Dim boolChoice() As Boolean '選択状況
Dim cntBool As Long '選択状況でTrueの数
Dim selectNumber As Long '作成する問題 セレクトナンバー
Dim numQes As Long '作成する問題数
Dim makeOrder As Long '作成順番
Dim outputQes() As String '出力する問題の順番
Dim outputAns() As Long '出力する解答の順番
Dim outputNum() As Long '出力する段
Dim i As Long 'カウンタ変数
Dim j As Long 'カウンタ変数
Dim bool As Boolean '判定変数
Dim aRnd As Long '乱数
Dim low As Long '出力行
'【動作】
'動作が速くなるコード
With Application
.ScreenUpdating = False '画面遷移→しない
.EnableEvents = False 'イベントの発生→しない
.Calculation = xlCalculationManual '再計算→手動
.Cursor = xlWait 'カーソル→ウェイト
.DisplayAlerts = False '確認ダイアログボックスの表示→なし
End With
'このファイルとシートを変数格納
Set wb = ThisWorkbook 'このファイル
With wb
Set wsQes = .Sheets(SHEET_NAME_QES) 'もんだいシート
Set wsAns = .Sheets(SHEET_NAME_ANS) '解答シート
Set wsSet = .Sheets(SHEET_NAME_SET) '設定シート
End With
'設定シート
With wsSet
'段の選択状況で1つでもTRUEがないときはマクロを終了する
'合わせて、選択状況のTrueとFalseを格納する
bool = False
ReDim boolChoice(8)
cntBool = 0
For i = 3 To 11
If .Range("C" & i).Value = True Then
bool = True
boolChoice(i - 3) = True
cntBool = cntBool + 1
Else
boolChoice(i - 3) = False
End If
Next i
If bool = False Then
'もとに戻すコード
With Application
.ScreenUpdating = True '画面遷移→する
.EnableEvents = True 'イベントの発生→あり
.Calculation = xlCalculationAutomatic '再計算→自動
.Cursor = xlDefault 'カーソル→動かす
.DisplayAlerts = True '確認ダイアログボックスの表示→あり
End With
MsgBox "①の つくる だんに チェックを 入れてね"
Exit Sub
End If
'セレクトナンバーから作成する問題数を変数に代入する
selectNumber = .Range("E3").Value
Select Case selectNumber
Case 1
numQes = cntBool * 9
Case 2
numQes = 5
Case 3
numQes = 10
Case 4
numQes = 20
Case 5
numQes = 30
Case 6
numQes = 50
End Select
'作成順番を変数に代入
'1→順番通り、2→ランダム
makeOrder = .Range("G3").Value
'再解答判定をTrueにする
.Range("J3").Value = True
End With
'かけ算の問題と解答を配列に代入
cntArr = 0
For i = 0 To 8
If boolChoice(i) = True Then
For j = 1 To 9
ReDim Preserve ArrQes(cntArr)
ReDim Preserve ArrAns(cntArr)
ReDim Preserve ArrNum(cntArr)
ArrQes(cntArr) = (i + 1) & " × " & j
ArrAns(cntArr) = (i + 1) * j
ArrNum(cntArr) = i + 1
cntArr = cntArr + 1
Next j
End If
Next i
cntArr = cntArr - 1
'出力問題と解答の配列を宣言
ReDim outputQes(numQes - 1)
ReDim outputAns(numQes - 1)
ReDim outputNum(numQes - 1)
'順番に出力するとき
If makeOrder = 1 Then
For i = 0 To numQes - 1
outputQes(i) = ArrQes(i)
outputAns(i) = ArrAns(i)
outputNum(i) = ArrNum(i)
Next i
'ランダムに出力するとき
Else
For i = 0 To numQes - 1
'ランダムの数値をリセットする
Randomize
'ランダムな整数をaRndに代入する
aRnd = Int(Rnd() * (cntArr + 1))
'問題と解答を配列に出力用の配列に代入する
outputQes(i) = ArrQes(aRnd)
outputAns(i) = ArrAns(aRnd)
outputNum(i) = ArrNum(aRnd)
'使用した配列番号の配列を削除し整理する
For j = aRnd To UBound(ArrQes) - 1
ArrQes(j) = ArrQes(j + 1)
Next j
If cntArr > 0 Then
ReDim Preserve ArrQes(cntArr - 1)
End If
For j = aRnd To UBound(ArrAns) - 1
ArrAns(j) = ArrAns(j + 1)
Next j
If cntArr > 0 Then
ReDim Preserve ArrAns(cntArr - 1)
End If
For j = aRnd To UBound(ArrNum) - 1
ArrNum(j) = ArrNum(j + 1)
Next j
If cntArr > 0 Then
ReDim Preserve ArrNum(cntArr - 1)
End If
cntArr = cntArr - 1
Next i
End If
'もんだいシートの保護がかかっていてもマクロでは操作できるようにする
'もんだいシートの値をクリアする
'問題を出力する
With wsQes
.Protect Password:=PW, UserInterfaceOnly:=True
.Range("B8:E88").ClearContents
.Range("B8:B88").Interior.ColorIndex = xlNone
low = 8
For i = 0 To numQes - 1
.Range("B" & low).Value = i + 1
.Range("C" & low).Value = outputQes(i)
low = low + 1
Next i
End With
'解答シートの値をクリアする
With wsAns
.Range("A2:D82").ClearContents
low = 2
For i = 0 To numQes - 1
.Range("A" & low).Value = i + 1
.Range("B" & low).Value = outputQes(i)
.Range("C" & low).Value = outputAns(i)
.Range("D" & low).Value = outputNum(i)
low = low + 1
Next i
End With
'もとに戻すコード
With Application
.ScreenUpdating = True '画面遷移→する
.EnableEvents = True 'イベントの発生→あり
.Calculation = xlCalculationAutomatic '再計算→自動
.Cursor = xlDefault 'カーソル→動かす
.DisplayAlerts = True '確認ダイアログボックスの表示→あり
End With
wsQes.Activate
wb.Save
MsgBox "もんだいが できました。OKを おして やってみてね。"
End Sub
① 「子どもが選んだ条件から問題を自動生成する」仕組み
47行目から107行目
設定シートで「どの段を使うか」「何問作るか」「順番 or ランダム」を選ぶ。
その選択をもとに、問題と答えを配列で生成する。
UI(てびきシート)とロジック(VBA)が完全に連動しているのが強み。
② 配列で問題を作り、最後に一気に出力する
109行目から129行目
ArrQes / ArrAns / ArrNum に「問題文」「答え」「段」を格納。
最後に outputQes / outputAns に並べ替えて出力。
シートを直接いじらず、配列で完結させることで高速・安全。
③ ランダム生成は「使った問題を配列から削除」して重複を防ぐ
142行目から145行目、152行目から158行目
「同じ問題が出ない」ことを保証する丁寧な実装。
④ シート保護をかけたまま操作できるようにしている
182行目
子どもが触っても壊れない UI を実現するための工夫。
⑤ Application の高速化設定を最初と最後で切り替える
30行目から37行目、208行目から215行目
教材としての“サクサク動く体験”を大切にしている。
① Option Explicit で変数のミスを防ぐ
② 定数モジュールでシート名を一元管理
③ ReDim Preserve を使って配列を動的に拡張
④ 変数名がすべて意味を持っている
Option Explicit
Sub ansAnalysis()
'【変数の宣言】
Dim wb As Workbook 'このファイル
Dim wsQes As Worksheet 'もんだいシート
Dim wsAns As Worksheet '解答シート
Dim wsSet As Worksheet '設定シート
Dim wsRank As Worksheet 'ランキングシート
Dim wsAnalysis As Worksheet '分析シート
Dim mulAns() As Long '解答
Dim mulNum() As Long '段
Dim cntMul As Long '解答のデータ数
Dim ArrCorrect() As String '正解時に表示する文字列
Dim cntArrCorrect As Long '正解時に表示する文字列のデータ数
Dim ArrIncorrect() As String '不正解時に表示する文字列
Dim cntArrIncorrect As Long '不正解時に表示する文字列のデータ数
Dim mul(8, 1) As Long '段に対する0→正解数 / 1→総問題数
Dim i As Long 'カウンタ変数
Dim j As Long 'カウンタ変数
Dim boolAns As Boolean '再解答判定
Dim low As Long '行
Dim col As Long '列
Dim aRnd As Long '乱数
'【動作】
'動作が速くなるコード
With Application
.ScreenUpdating = False '画面遷移→しない
.EnableEvents = False 'イベントの発生→しない
.Calculation = xlCalculationManual '再計算→手動
.Cursor = xlWait 'カーソル→ウェイト
.DisplayAlerts = False '確認ダイアログボックスの表示→なし
End With
'正解数と総数をまとめている配列に0を代入する
For i = 0 To 8
For j = 0 To 1
mul(i, j) = 0
Next j
Next i
'このファイルとシートを変数格納
Set wb = ThisWorkbook 'このファイル
With wb
Set wsQes = .Sheets(SHEET_NAME_QES) 'もんだいシート
Set wsAns = .Sheets(SHEET_NAME_ANS) '解答シート
Set wsSet = .Sheets(SHEET_NAME_SET) '設定シート
Set wsRank = .Sheets(SHEET_NAME_RANK) 'ランキングシート
Set wsAnalysis = .Sheets(SHEET_NAME_ANALYSIS) '分析シート
End With
'解答シートの解答と段を配列格納
With wsAns
low = 2
cntMul = 0
Do While .Range("A" & low).Value <> ""
ReDim Preserve mulAns(cntMul)
ReDim Preserve mulNum(cntMul)
mulAns(cntMul) = .Range("C" & low).Value
mulNum(cntMul) = .Range("D" & low).Value
cntMul = cntMul + 1
low = low + 1
Loop
cntMul = cntMul - 1
End With
'設定シートの正解時に表示する文字列と不正解時に表示する文字列を配列に代入
With wsSet
'再解答判定
boolAns = .Range("J3").Value
.Range("J3").Value = False
'正解時に表示する文字列
cntArrCorrect = 0
low = 3
Do While .Range("L" & low).Value <> ""
ReDim Preserve ArrCorrect(cntArrCorrect)
ArrCorrect(cntArrCorrect) = .Range("L" & low).Value
cntArrCorrect = cntArrCorrect + 1
low = low + 1
Loop
cntArrCorrect = cntArrCorrect - 1
'不正解時に表示する文字列
cntArrIncorrect = 0
low = 3
Do While .Range("N" & low).Value <> ""
ReDim Preserve ArrIncorrect(cntArrIncorrect)
ArrIncorrect(cntArrIncorrect) = .Range("N" & low).Value
cntArrIncorrect = cntArrIncorrect + 1
low = low + 1
Loop
cntArrIncorrect = cntArrIncorrect - 1
End With
'もんだいシートの答えあわせをする
With wsQes
.Protect Password:=PW, UserInterfaceOnly:=True
low = 8
For i = 0 To cntMul
'正解時
If .Range("D" & low).Value = mulAns(i) Then
'番号の色を設定する(薄い緑色)
.Range("B" & low).Interior.Color = RGB(225, 245, 235)
'ランダムの数値をリセットする
Randomize
'ランダムな整数をaRndに代入する
aRnd = Int(Rnd() * (cntArrCorrect + 1))
.Range("E" & low).Value = ArrCorrect(aRnd)
'正解数に1を加算する
mul(mulNum(i) - 1, 0) = mul(mulNum(i) - 1, 0) + 1
'不正解時
Else
'番号の色を設定する(薄い緑色)
.Range("B" & low).Interior.Color = RGB(255, 235, 240)
'ランダムの数値をリセットする
Randomize
'ランダムな整数をaRndに代入する
aRnd = Int(Rnd() * (cntArrIncorrect + 1))
.Range("E" & low).Value = ArrIncorrect(aRnd)
End If
'総問題数に1を加算する
mul(mulNum(i) - 1, 1) = mul(mulNum(i) - 1, 1) + 1
low = low + 1
Next i
End With
'再解答判定がTrueのときのみ分析とランキングに反映する
If boolAns = True Then
'分析シートに正解数と総問題数を加算して出力する
With wsAnalysis
low = 2
For i = 0 To 8
.Range("B" & low).Value = .Range("B" & low).Value + mul(i, 0)
.Range("C" & low).Value = .Range("C" & low).Value + mul(i, 1)
low = low + 1
Next i
End With
'ランキングシートに結果を出力する
With wsRank
.Protect Password:=PW, UserInterfaceOnly:=True
low = .Range("E10000").End(xlUp).Row + 1
'当日の日付
col = 5
.Cells(low, col).Value = Now
'正解数と総問題数
For i = 0 To 8
col = col + 1
.Cells(low, col).Value = mul(i, 0)
col = col + 1
.Cells(low, col).Value = mul(i, 1)
Next i
End With
End If
'もとに戻すコード
With Application
.ScreenUpdating = True '画面遷移→する
.EnableEvents = True 'イベントの発生→あり
.Calculation = xlCalculationAutomatic '再計算→自動
.Cursor = xlDefault 'カーソル→動かす
.DisplayAlerts = True '確認ダイアログボックスの表示→あり
End With
wsQes.Activate
wb.Save
MsgBox "こたえあわせが できたよ。OKを おして みなおしてみてね。"
End Sub
① 子どもの解答を読み取り、正解・不正解を判定する
解答シートから「正しい答え(mulAns)」「その段(mulNum)」を配列に読み込む。
そして、もんだいシートの入力と照合して正解か不正解かを判定する。
教材の“答え合わせ”の中心処理。
① 正解・不正解で色とメッセージを変える
107行目から129行目
さらに、設定シートから「正解時のメッセージ」「不正解時のメッセージ」をランダムに選んで表示。
子どもが前向きに取り組める UI/UX の工夫。
② 段ごとの「正解数」と「総問題数」を集計する
118行目、132行目
9段 × 2種類のデータをまとめて管理。
分析・ランキングの基礎データを作る重要な処理。
③ 再解答判定(boolAns)で“分析に反映するか”を制御
74行目
True → 分析シート・ランキングシートに反映
False → 反映しない(再挑戦時など)
学習履歴を正しく管理するための安全装置。
④ 分析シートに累積データとして加算する
141行目から148行目
1日の結果ではなく学習の積み重ねを記録する。
成長を“見える化”するための仕組み。
⑤ ランキングシートに日付つきで記録する
158行目
その日の「正解数」「総問題数」を横並びで記録。
あとでグラフ化・ランキング化しやすい構造。