【中学英語】実力テストの英単語対策!AIでランダム単語テストを作ってみた

【PR】当サイトは広告プロモーションが含まれています

中3の娘、実力テストで英語の点数が思うように取れなくなってきました。

しかも、よく見ると簡単な英単語のスペルミスまで……。

これはまずい!と、受験に向けて英単語を基礎からやり直すことにしました。

ところが、順番に覚えていくだけでは「本当に覚えているのか分からない」という問題が!!!

そこで、間違えた単語をランダムに出題できる英単語テストをExcelで作ることにしました。

とはいえ、VBAなんて20年近く前に仕事で使ったきり。

そこで今回は、AIにVBAを作ってもらって、家庭学習用の英単語テストを作ってみました。

間違いやすい単語をチェックして優先に出してもらう等々、具体的な指示の出し方はもちろん実際に作ったプログラムも貼り付けているのでオリジナル単語テストを作りたい!という方はぜひ参考にしてみてください♪

※実力テスト(入試問題)の類題をAIに作ってもらう方法もこちらで紹介しています
👉中学実力テストの過去問がない?AIで類題を作って英作文対策!

実力テストで英語が散々……簡単な英単語まで書けていなかった

中3になってから実力テストの点数が思ったより取れなくなった娘。えぇ、右肩下がりです...

小春
小春

中でも英語が悪い!!悪すぎる!!!!

英語に関しては類題をAIに作ってもらって対策をしているのですが(👉中学実力テストの過去問がない?AIで類題を作って英作文対策!

単語のスペルミスも何問かあったので受験までは英単語を徹底的に覚えることを目標にしました。

まずは家にあった「ターゲット1200」をやらせてみることにしたけど...

カバー取ってます...。息子が中3の時に配られたターゲット1200が転がっていたので、ターゲット1200をさせることに。

ただ、ここでつまずきました。

「200までは順調だったのにそこから覚えるのにめちゃくちゃ時間がかかる!!!!」

実はターゲット1200の構成は

  • 1~200:中学校で習った200語
  • 251~550:基礎を固める300語
  • 611~1110:テーマで身に付ける500語
  • 1171~1370:語法で覚える200語
  • 1431~1630:入試によく出る200語

と分かれていて、200以降でつまずいたのはまぁ単語が苦手な娘にとっては当たり前と言いますか...早すぎました(笑)

そこで中学の単語をしっかり固めることを優先にしました。

ちなみに息子校の場合は定期的に広範囲の単語テストがあり娘の時程単語が覚えられないーーーと焦った記憶がありません。

娘校の場合はその単元の単語テストはあるみたいですが、まとめて複数範囲からの単語テストはないので...もし同じような状況の方は早めに単語対策必要かもしれません!

まずは基礎をしっかり固めるために『出る順パス単3級』に切り替え

そこで選んだ単語帳が英検®3級でる順パス単。

旺文社
¥1,212 (2026/09/09 11:53時点 | Amazon調べ)

昨年受けた英検®3級の対策時に購入したものです。我が家にはターゲット1200以外に息子が受けた英検®準2級のもパス単、中学版システム英単語もあったのですが3級のでる順を選んだ理由は

  • 英検®3級は中学卒業程度の英単語+熟語が収録されていて中学単語が網羅できる
  • 英検®3級は取得済みだがでる順Aをパラパラ見た程度
  • 音声が収録されているので発音練習ができる
  • 1問1答をまずは定着させたかった

中学版システム英単語はキーセンテンスが書いてあって便利なのですが受験まで時間がない我が家はとにかく基礎から!1問1答の方が先かなと思いでる順を選びました。

「でる順パス単3級」の単語を1日100語!

英検®3級にギリギリ合格したことで娘はもちろん親の私も今までそこまで英語が悪かったことがなかったので完全に油断しており、ヤバいと思ったのが中3の2学期に入ってから。

部活は引退していたのでスケジュール的には

  • 1日目:1~100語
  • 2日目:101~200語
  • 3日目:201~300語
  • 4日目:301~400語
  • 5日目:1~400復習
  • 6日目:1~400復習
  • 7日目:テスト

このペースで進めて行きました。このやり方は息子が高校生になって通った塾のやり方です。

1日100語って多くなーい?と私は息子がしているのを見ながら思ったのですが、1日10個を見るよりも1日100個を覚えてそれを何周もすることで英単語を見る機会が増えるのが良いのだそう。

ただし、今日は帰宅時間が遅くなったとか、別の課題が出ている場合は1日50語に減らすなどその辺はその日の娘の状況に合わせて単語学習を進めました。

単語表を作成

単語帳を見ながら勉強でも良かったのですがこれも息子が通う塾のフォーマットに合わせて単語表を作る事にしました。

間違えたらAにチェック、2回目も間違えたらBにチェック・・・することで苦手な単語が一目でわかります。

息子の「順番で覚えても意味ないよ」の一言

怪しいなとは思ってたんです。毎日その日の単語で書けなかった所をチェックしているのですが

ゆめ
ゆめ

その次の単語いつも覚えられないのー。次の次の単語も~

と娘が言っていて、これ並び順で覚えてるんじゃないか?と・・・すると息子が

つばさ
つばさ

順番に覚えても意味ないよ

と・・・。息子の塾の様子と塾のテストを見せてもらったところランダムに問題が提示されておりました。

そこで、7日目のテストはランダムに提示することにしました。

昔使っていたVBAでランダムテストを作ろうと思ったけど……

エクセルで単語表を作ったので単語は一覧にしてました。

画像の感じで番号と英単語、日本語訳(1問1答なので日本語訳は1つだけ)です。

これをランダムに100問提示するには・・・あ、会社員時代に使っていたマクロ組もうかと考えました。

小春
小春

20年近く前の話。もちろん、ほとんど覚えてない!!

一から調べるのも超面倒だし時間もかかる。そんな時、私の相棒(笑)AIが作ってくれるじゃないかと思い立ちました。

VBAを書くのは面倒…そこでAIにプログラム(マクロ)を作ってもらった

私のような初心者だとめちゃくちゃ時間がかかる作業でも、AIに作ってもらえばコードを書く時間を大幅に減らせます。

同じように単語テストを作りたい方がいたらぜひ参考にしてみてください。

今回使ったのはGemini(ジェミニ)。

英語7割日本語3割のボタンを押すと

出題範囲を指定するボックスが出てきます。

すると、指定した範囲からランダムに100問を選んで、単語テストを作ってくれます。

さらに、同じ問題に対応した解答リストも作成。

最初は単語リストだけ作るようにしていたのですが、実際に使ってみると、丸付けのときに「解答が別にあったほうが便利!」となったので、解答リストも作ってもらいました。

また、単純にランダムに出題するだけではなく、これまでの間違いの記録を利用して、間違いが多い単語ほど出題されやすくなるようにもしました。

AIに単語テストを作ってもらう具体的な指示内容

では実際どのような指示を出して作ってもらったのかを紹介します。

【指示文】

Excelに「単語一覧」というシートがあります。

単語一覧は以下の形式です。

・A列:番号
・B列:英単語
・C列:日本語訳
・D列:間違いの記録

この単語一覧を使って、100問の英単語テストを作成するVBAを作ってください。

【基本仕様】

・データは2行目から始まり、1行目はヘッダーです。A列の最終行まで読み込む
・出題範囲を「1-500」「150-300」のように指定できるようにする
・指定した範囲内から100問をランダムに選ぶ
・同じ単語を1回のテストで重複して出題しない
・毎回同じ順番にならないようにする
・間違えた回数のチェック欄の数字が多いものほど、出題されやすくする

【問題の種類】

①「日本語→英語70%、英語→日本語30%」の混合テスト
・日本語→英語:70問
・英語→日本語:30問
・70問と30問は、テスト内でランダムに混ぜる

②「全問日本語→英語」のテスト
・100問すべて日本語を見て英単語を書く形式

③「全問英語→日本語」のテスト
・100問すべて英単語を見て日本語訳を書く形式

【出力】

・「テスト出力」というシートを作成する
・「解答シート」というシートを作成する
・問題と解答が同じ順番で対応するようにする
・問題には単語番号も表示する
・100問を50問ずつ左右2列に分けて表示する
・出題範囲、目標時間、解答時間、得点を記入できる欄を作る

【その他】
・既に「テスト出力」「解答シート」がある場合は、内容を消去して新しいテストを作成する
・指定された範囲内にデータが100問未満しかない場合や、入力欄でキャンセルが押された場合はメッセージを表示して安全に処理を中断する。

上記の条件をすべて満たすVBAコードを作成してください。

コピペOK!実際にAIが作ったVBAを公開

もし「自分で指示を出してもうまく作れない…」という方がいたら、以下のVBAコードをそのままコピペして使ってみてください!

※使用するExcelファイルは、あらかじめ次のように作成しておいてください。

  • シート名:単語一覧
  • 1行目:見出し行(「番号」「英単語」など)
  • A列:単語番号(例: 1, 2, 3...)
  • B列:英単語
  • C列:日本語訳
  • D列:間違えた時のチェック欄に数字で入力(入力があると自動で出題率が上がります)
' =========================================================================
' メイン1:全問スペル記述テスト(日本語 ➔ 英語 100問)【おすすめ!】
' =========================================================================
Sub CreateTest_AllJapaneseToEnglish_FromList()
    CreateTestCore 3 ' モード3: 全問(訳→英)
End Sub

' =========================================================================
' メイン2:7割/3割 混合テスト(70問:訳→英 / 30問:英→訳)
' =========================================================================
Sub CreateTest_7to3_FromList()
    CreateTestCore 1 ' モード1: 7割(訳→英) / 3割(英→訳)
End Sub

' =========================================================================
' メイン3:全問和訳テスト(英語 ➔ 日本語 100問)
' =========================================================================
Sub CreateTest_AllEnglish_FromList()
    CreateTestCore 2 ' モード2: 全問(英→訳)
End Sub


' -------------------------------------------------------------------------
' 共通コア処理
' -------------------------------------------------------------------------
Private Sub CreateTestCore(testMode As Long)
    Dim startNo As Long, endNo As Long
    Dim inputStr As String
    Dim modeTitle As String
    
    Select Case testMode
        Case 1
            modeTitle = "7割:訳→英 / 3割:英→訳"
        Case 2
            modeTitle = "全問:英→訳(和訳)"
        Case 3
            modeTitle = "全問:訳→英(スペル記述)"
    End Select
    
    ' ユーザー入力
    inputStr = InputBox("出題範囲の単語番号を入力してください。" & vbCrLf & _
                        "(モード: " & modeTitle & ")", "出題範囲指定", "1-500")
    If inputStr = "" Then Exit Sub
    
    Dim parts() As String
    parts = Split(inputStr, "-")
    If UBound(parts) <> 1 Or Not IsNumeric(parts(0)) Or Not IsNumeric(parts(1)) Then
        MsgBox "範囲は「1-500」のように入力してください。", vbExclamation
        Exit Sub
    End If
    
    startNo = CLng(Trim(parts(0)))
    endNo = CLng(Trim(parts(1)))
    
    If startNo <= 0 Or endNo <= 0 Or startNo > endNo Then
        MsgBox "範囲の数値が正しくありません。", vbExclamation
        Exit Sub
    End If
    
    ' 高速化
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    ' 1. 「単語一覧」シートからデータを取得
    Dim allWords As Collection
    Set allWords = CollectWordsFromListSheet(startNo, endNo)
    
    If allWords.Count < 100 Then
        MsgBox "指定範囲内の単語が100問未満です(該当: " & allWords.Count & "問)。" & vbCrLf & _
               "範囲を広げるか、入力した番号をご確認ください。", vbExclamation
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Exit Sub
    End If
    
    ' 2. 重み付けで100問ピックアップ
    Dim selectedWords As Collection
    Set selectedWords = Pick100WordsWeighted(allWords)
    
    ' 3. 出題タイプの決定
    ' 1: 日本語➔英語(スペル書かせる) / 2: 英語➔日本語(和訳)
    Dim qTypes() As Long
    Dim k As Long
    
    If testMode = 1 Then
        qTypes = GetShuffledQuestionTypes(70, 30) ' 70問:訳→英, 30問:英→訳
    ElseIf testMode = 2 Then
        ReDim qTypes(1 To 100)
        For k = 1 To 100: qTypes(k) = 2: Next k ' 全問:英→訳
    ElseIf testMode = 3 Then
        ReDim qTypes(1 To 100)
        For k = 1 To 100: qTypes(k) = 1: Next k ' 全問:訳→英
    End If
    
    ' 4. シート準備
    Dim wsOut As Worksheet, wsAns As Worksheet
    Set wsOut = GetOrCreateSheet("テスト出力")
    Set wsAns = GetOrCreateSheet("解答シート")
    wsOut.Cells.Clear
    wsAns.Cells.Clear
    
    SetupTestSheetLayout wsOut, inputStr, "英単語テスト (" & modeTitle & ")"
    SetupTestSheetLayout wsAns, inputStr, "英単語テスト【解答】"
    
    ' 5. データの流し込み
    Dim i As Long, targetRow As Long
    Dim wordItem As Variant, numVal As Long, engWord As String, jpnWord As String
    Dim qText As String, aText As String
    
    For i = 1 To 100
        wordItem = selectedWords(i)
        numVal = wordItem(0)
        engWord = wordItem(1)
        jpnWord = wordItem(2)
        
        If qTypes(i) = 1 Then
            qText = jpnWord: aText = engWord ' 問題=日本語 / 解答=英語スペル
        Else
            qText = engWord: aText = jpnWord ' 問題=英語 / 解答=日本語訳
        End If
        
        If i <= 50 Then
            targetRow = i + 4
            wsOut.Cells(targetRow, 1).Value = numVal
            wsOut.Cells(targetRow, 2).Value = qText
            
            wsAns.Cells(targetRow, 1).Value = numVal
            wsAns.Cells(targetRow, 2).Value = qText
            wsAns.Cells(targetRow, 3).Value = aText
            wsAns.Cells(targetRow, 3).Font.Color = RGB(200, 0, 0)
        Else
            targetRow = (i - 50) + 4
            wsOut.Cells(targetRow, 5).Value = numVal
            wsOut.Cells(targetRow, 6).Value = qText
            
            wsAns.Cells(targetRow, 5).Value = numVal
            wsAns.Cells(targetRow, 6).Value = qText
            wsAns.Cells(targetRow, 7).Value = aText
            wsAns.Cells(targetRow, 7).Font.Color = RGB(200, 0, 0)
        End If
    Next i
    
    wsOut.Activate
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    
    MsgBox "100問のテストを作成しました! (" & modeTitle & ")", vbInformation
End Sub


' --- サブルーチン: 「単語一覧」シートからデータを取得 ---
Private Function CollectWordsFromListSheet(startNo As Long, endNo As Long) As Collection
    Dim col As New Collection
    Dim ws As Worksheet
    Dim lastRow As Long, r As Long
    Dim numVal As Long, cellVal As Variant
    Dim engWord As String, jpnWord As String
    Dim weight As Long
    
    On Error Resume Next
    Set ws = Worksheets("単語一覧")
    On Error GoTo 0
    
    If ws Is Nothing Then
        MsgBox "「単語一覧」という名前のシートが見つかりません。" & vbCrLf & _
               "シート名を確認してください。", vbCritical
        End
    End If
    
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    
    For r = 2 To lastRow ' 1行目は見出し
        cellVal = ws.Cells(r, 1).Value
        If IsNumeric(cellVal) And Not IsEmpty(cellVal) Then
            numVal = CLng(cellVal)
            If numVal >= startNo And numVal <= endNo Then
                engWord = Trim(CStr(ws.Cells(r, 2).Value)) ' B列:英単語
                jpnWord = Trim(CStr(ws.Cells(r, 3).Value)) ' C列:訳
                
                If engWord <> "" Then
                    ' 重み計算 (D列を見る)
                    weight = 1
                    If Trim(CStr(ws.Cells(r, 4).Value)) <> "" Then
                        If IsNumeric(ws.Cells(r, 4).Value) Then
                            weight = weight + CLng(ws.Cells(r, 4).Value) ' 数字が入っている場合
                        Else
                            weight = weight + 1 ' 文字・チェックが入っている場合
                        End If
                    End If
                    
                    On Error Resume Next
                    col.Add Array(numVal, engWord, jpnWord, weight), CStr(numVal)
                    On Error GoTo 0
                End If
            End If
        End If
    Next r
    
    Set CollectWordsFromListSheet = col
End Function


' --- サブルーチン: 重み付き抽選 ---
Private Function Pick100WordsWeighted(allWords As Collection) As Collection
    Dim result As New Collection
    Dim availableWords As New Collection
    Dim item As Variant, totalWeight As Long, randVal As Long, currentSum As Long, i As Long
    
    For Each item In allWords: availableWords.Add item: Next item
    
    Randomize
    Do While result.Count < 100 And availableWords.Count > 0
        totalWeight = 0
        For Each item In availableWords: totalWeight = totalWeight + CLng(item(3)): Next item
        
        randVal = Int(Rnd * totalWeight) + 1
        currentSum = 0
        For i = 1 To availableWords.Count
            item = availableWords(i)
            currentSum = currentSum + CLng(item(3))
            If randVal <= currentSum Then
                result.Add item
                availableWords.Remove i
                Exit For
            End If
        Next i
    Loop
    
    Set Pick100WordsWeighted = result
End Function


' --- サブルーチン: 出題タイプシャッフル ---
Private Function GetShuffledQuestionTypes(countType1 As Long, countType2 As Long) As Long()
    Dim total As Long: total = countType1 + countType2
    Dim arr() As Long: ReDim arr(1 To total)
    Dim i As Long, j As Long, tmp As Long
    
    For i = 1 To countType1: arr(i) = 1: Next i
    For i = countType1 + 1 To total: arr(i) = 2: Next i
    
    Randomize
    For i = total To 2 Step -1
        j = Int(Rnd * i) + 1
        tmp = arr(i): arr(i) = arr(j): arr(j) = tmp
    Next i
    GetShuffledQuestionTypes = arr
End Function


' --- サブルーチン: シート取得または作成 ---
Private Function GetOrCreateSheet(sheetName As String) As Worksheet
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = Worksheets(sheetName)
    On Error GoTo 0
    If ws Is Nothing Then
        Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
        ws.Name = sheetName
    End If
    Set GetOrCreateSheet = ws
End Function


' --- サブルーチン: レイアウト作成 ---
Private Sub SetupTestSheetLayout(ws As Worksheet, rangeStr As String, titleName As String)
    ws.Cells(1, 1).Value = titleName & " (出題範囲: " & rangeStr & ")"
    ws.Cells(1, 1).Font.Size = 14: ws.Cells(1, 1).Font.Bold = True
    
    ws.Cells(2, 1).Value = "目標時間[10分/100問]"
    ws.Cells(2, 6).Value = "解答時間( )分"
    ws.Cells(2, 7).Value = "得点:      / 100"
    
    ws.Cells(4, 1).Value = "番号": ws.Cells(4, 2).Value = "問題": ws.Cells(4, 3).Value = "解答"
    ws.Cells(4, 5).Value = "番号": ws.Cells(4, 6).Value = "問題": ws.Cells(4, 7).Value = "解答"
    
    Dim rngList As Variant
    rngList = Array(ws.Range("A4:C54"), ws.Range("E4:G54"))
    
    Dim k As Long
    For k = LBound(rngList) To UBound(rngList)
        With rngList(k).Borders
            .LineStyle = xlContinuous: .Weight = xlThin
        End With
        rngList(k).Rows(1).Interior.Color = RGB(220, 230, 242)
        rngList(k).Rows(1).Font.Bold = True
    Next k
    
    ws.Columns("A").ColumnWidth = 8: ws.Columns("B").ColumnWidth = 22: ws.Columns("C").ColumnWidth = 20
    ws.Columns("D").ColumnWidth = 3
    ws.Columns("E").ColumnWidth = 8: ws.Columns("F").ColumnWidth = 22: ws.Columns("G").ColumnWidth = 20
End Sub

マクロボタンの設置手順(記事用メモ)

ボタンを配置したい場合は下記の設定をします。

  1. ボタンの作成
    • Excelの「挿入」タブ ➔「図形」から好きな形(角丸長方形など)を選んでシート上に配置
    • 文字を編集で「単語テスト作成」などと入力
  2. マクロの登録
    • 作成した図形を右クリック ➔ 「マクロの登録」 を選択
    • リストから実行したいマクロ(例: CreateTest_AllJapaneseToEnglish_FromList など)を選んで「OK」
  3. ファイルの保存
    • Excelファイルを保存する際は、必ず 「Excel マクロ有効ブック(.xlsm)」 形式で保存

まとめ|英単語テストもAIを使えば家庭で作れる

実力テストで簡単な英単語まで書けていなかった娘のために、まずは『でる順パス単3級』で基礎からやり直すことにしました。

そして、順番に覚えるだけではなくランダムに確認できるよう、AIにVBAを作ってもらいました。

今回は娘の日本語→英語のテストだけでなく、息子が使っているシステム英単語にも使えるように、「日本語→英語」「英語→日本語」「日本語→英語+英語→日本語」の3パターンを作っています。

自分でVBAを書くのは大変ですが、AIに具体的な希望を伝えれば、家庭の勉強に合わせた単語テストを作ることができます。

「こんなテストがあったら便利なのに」というときに、AIを活用してみるのもおすすめです。

※実力テスト(入試問題)の類題をAIに作ってもらう方法もこちらで紹介しています
👉中学実力テストの過去問がない?AIで類題を作って英作文対策!

🖌️あわせて読みたい🖌️

👉中3実力テスト範囲や平均点など

【中3実力テスト】範囲・平均点・過去問対策|何点取ればいい?5月・9月・1月の結果を公開

「中3の実力テスト、点数が低すぎてやばい……」「範囲が広すぎてどこから手をつければいいの?」「定期テストより100点近く下がったけど、志望校大丈夫かな?」中3になると、実力テストは中1・中2までの内容 ...

続きを見る

👉中2実力テスト範囲や平均点など

【中2実力テスト】範囲・平均点・過去問はある?400点を目指す勉強法

中2の実力テストは、中学生の中でも特に点数が落ちやすい学年です。 「中2の壁」と言われるように、平均点が一気に下がり、 中1までは取れていた点数が急に取れなくなるお子さんも少なくありません。 実力テス ...

続きを見る

👉中1実力テスト範囲や平均点など

【中1実力テスト】平均点が取れない理由|300点の壁と400点の分岐点(正答率データで分析)

「定期テストは良かったのに、実力テストの点数が信じられないくらい低い…」 「範囲が広すぎて、どこから手をつければいいかわからない」 初めて本格的な実力テストが返ってきたとき、親子で言葉を失ってしまうお ...

続きを見る

👉実力テストまとめ

中学生の実力テストとは?いつある?範囲や平均点のリアルと300点・400点対策と勉強法

中学生が年に数回受ける「実力テスト」。 定期テストとは違い、これまで学んだ内容すべてが出題されるテストです。 範囲が広く、問題は一部応用寄り。 英語や数学は平均点が40点台になることも珍しくなく、 「 ...

続きを見る

👉テストまとめ

【成績推移まとめ】公立中・塾なし娘の通知表・定期・実力テスト記録(中1〜中3)

公立中に通う娘の中学生活。 塾なしでコツコツと取り組みながら、通知表や実力テストの結果に一喜一憂する日々。 この記事では、各学期ごとの成績・通知表・勉強スタイル・英検などを記録した記事をまとめています ...

続きを見る

👉オンライン塾まとめ

中学生向けオンライン塾人気・おすすめ10選|料金・個別指導・東大生講師を徹底比較【2026年版】

「部活や習い事で毎日クタクタ。塾に通わせるのは時間的にも送迎の負担的にも厳しい……」「家の近くに良い塾がないけれど、難関校を目指すために質の高い先生にお願いしたい」 中学生のお子さんを持つ親御さんにと ...

続きを見る

-中3, 公立中学校, 高校受験
-,