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

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

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

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

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

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

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

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

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

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

※この方法は、マクロ(VBA)が使えるデスクトップ版Excel向けです。Googleスプレッドシートではそのまま使えません。

マイクロソフト
¥39,982 (2026/10/16 10:26時点 | Amazon調べ)
マイクロソフト
¥21,300 (2026/10/16 10:26時点 | Amazon調べ)

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

ランダム英単語帳(紙で印刷するタイプ)の完成例

まずは、ランダム単語帳の完成図をご紹介。

アプリ等でもランダム表示してくれるものはたくさんあるのですが、中学生の場合は「単語を書かせる」問題も多く出るためにA4用紙に印刷できるものを作りたくて・・・

これは問題番号950から1000の50問、1から500の500問の中から100問をピックアップ。

ピックアップした印刷用の単語シート。完成図はこちら。

丸付けする用に解答シートも作ってます。

間違えた問題を優先的に出題するためにテスト後に間違えた問題を入力し

出題回数と不正解回数もインプットされるシートも作りました(これはあくまで確認用)。不正解回数から優先して出題するようにしています。

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

中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(ジェミニ)。Claudでも良いと思います。

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

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

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

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

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

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

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

では、実際どのような指示(プロンプト)を出して作ってもらったのかをご紹介します。

Excelに「単語一覧」というシートがあります。
この単語一覧を使って、100問の英単語テストを作成するVBAを作ってください。

【シート構成】

1. 「単語一覧」シート(マスターデータ)
・A列:番号
・B列:英単語
・C列:日本語訳

2. 「出題履歴」シート(履歴データ/シートがなければ自動作成する)
・A列:番号
・B列:英単語
・C列:出題回数
・D列:不正解回数

【基本仕様】

・データは2行目から始まり、1行目はヘッダー。
・出題範囲を「1-500」「150-300」だけでなく、「950-1000,1-500」のようにカンマ区切りで複数の範囲を指定できるようにする
・指定した範囲内から100問をランダムに選ぶ(同じ単語の重複は不可)
・「出題履歴」シートの「不正解回数(D列)」が多い単語ほど、優先して出題されやすくする(※まだ履歴がない場合は均等に出題)
・テストを作成した際、「出題履歴」シートの選ばれた単語の「出題回数(C列)」に+1加算する

【問題の種類】

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

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

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

【採点後の間違い一括記録機能】

・テスト作成完了後、丸付けが終わった後に間違えた問題番号(例:1,7,50)を入力できる画面(インプットボックス)を表示する
・入力された問題番号の単語について、「出題履歴」シートの「不正解回数(D列)」に+1加算する

【出力】

・「テスト出力」シートと「解答シート」を作成し、問題と解答を同じ順番で左右2列(50問ずつ)に表示する
・問題には単語番号も表示し、出題範囲、目標時間、解答時間、得点の記入欄を作る
・既に「テスト出力」「解答シート」がある場合は内容を消去して新しく作成する
・データが100問未満の場合やキャンセル時はメッセージを表示して安全に処理を中断する

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

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

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

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

  • シート名:単語一覧
  • 1行目:見出し行(「番号」「英単語」など)
  • A列:単語番号(例: 1, 2, 3...)
  • B列:英単語
  • C列:日本語訳
Option Explicit

' ============================================================
' ボタン登録用プロシージャ(Excelのボタンに割り当てる用)
' ============================================================
Sub テスト作成_7割3割()
    CreateTest 1
End Sub

Sub テスト作成_全問英訳()
    CreateTest 2
End Sub

Sub テスト作成_全問和訳()
    CreateTest 3
End Sub


' ============================================================
' メイン処理(テスト作成)
' ============================================================
Sub CreateTest(testMode As Long)
    Dim wsList As Worksheet
    Dim wsHist As Worksheet
    Dim wsOut As Worksheet
    Dim wsAns As Worksheet

    Dim inputStr As String
    Dim modeTitle As String

    ' --------------------------------------------------------
    ' シート取得・自動作成
    ' --------------------------------------------------------
    On Error Resume Next
    Set wsList = ThisWorkbook.Worksheets("単語一覧")
    Set wsHist = ThisWorkbook.Worksheets("出題履歴")
    Set wsOut = ThisWorkbook.Worksheets("テスト出力")
    Set wsAns = ThisWorkbook.Worksheets("解答シート")
    On Error GoTo 0

    If wsList Is Nothing Then
        MsgBox "「単語一覧」シートが見つかりません。" & vbCrLf & _
               "シート名を確認してください。", vbCritical
        Exit Sub
    End If

    If wsHist Is Nothing Then
        Set wsHist = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        wsHist.Name = "出題履歴"
    End If

    If wsOut Is Nothing Then
        Set wsOut = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        wsOut.Name = "テスト出力"
    End If

    If wsAns Is Nothing Then
        Set wsAns = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        wsAns.Name = "解答シート"
    End If

    ' --------------------------------------------------------
    ' モード設定
    ' --------------------------------------------------------
    Select Case testMode
        Case 1: modeTitle = "7割:訳→英 / 3割:英→訳"
        Case 2: modeTitle = "全問:英→訳"
        Case 3: modeTitle = "全問:訳→英"
        Case Else
            MsgBox "テストモードが正しくありません。", vbCritical
            Exit Sub
    End Select

    ' --------------------------------------------------------
    ' 範囲指定インプットボックス
    ' --------------------------------------------------------
    inputStr = InputBox( _
        "出題範囲を入力してください。" & vbCrLf & vbCrLf & _
        "例:" & vbCrLf & _
        "1-500" & vbCrLf & _
        "1150-1200,1-500" & vbCrLf & _
        "1-100,300-400,800-900" & vbCrLf & vbCrLf & _
        "モード:" & modeTitle, _
        "出題範囲指定", _
        "1-1200")

    If Trim(inputStr) = "" Then Exit Sub

    ' 履歴の同期
    InitializeHistory wsList, wsHist

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' 単語抽出
    Dim allWords As Collection
    Set allWords = CollectWordsFromListSheet(wsList, inputStr)

    If allWords.Count < 100 Then
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        MsgBox "指定範囲内の単語が100問未満です。" & vbCrLf & _
               "該当:" & allWords.Count & "問" & vbCrLf & vbCrLf & _
               "100問以上になるように範囲を広げてください。", vbExclamation
        Exit Sub
    End If

    ' 重み付き抽選で100問選出
    Dim selectedWords As Collection
    Set selectedWords = Pick100WordsWeighted(allWords, wsHist)

    ' 問題形式の決定
    Dim qTypes() As Long
    Dim i As Long

    If testMode = 1 Then
        qTypes = GetShuffledQuestionTypes(70, 30)
    Else
        ReDim qTypes(1 To 100)
        For i = 1 To 100
            qTypes(i) = IIf(testMode = 3, 1, 2)
        Next i
    End If

    ' シートの初期化とレイアウト
    wsOut.Cells.Clear
    wsAns.Cells.Clear

    SetupTestSheetLayout wsOut, inputStr, "英単語テスト (" & modeTitle & ")"
    SetupTestSheetLayout wsAns, inputStr, "英単語テスト【解答】"

    ' --------------------------------------------------------
    ' 問題書き込み
    ' --------------------------------------------------------
    Dim wordItem As Variant
    Dim numVal As Long, engWord As String, jpnWord As String
    Dim qText As String, aText As String, targetRow As Long

    For i = 1 To 100
        wordItem = selectedWords(i)
        numVal = CLng(wordItem(0))
        engWord = CStr(wordItem(1))
        jpnWord = CStr(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

        ' 出題回数を+1
        IncrementQuestionCount wsHist, numVal
    Next i

    wsOut.Activate
    Application.ScreenUpdating = True
    Application.EnableEvents = True

    MsgBox "100問のテストを作成しました!" & vbCrLf & vbCrLf & _
           "モード:" & modeTitle & vbCrLf & _
           "出題範囲:" & inputStr & vbCrLf & vbCrLf & _
           "「テスト出力」=問題" & vbCrLf & _
           "「解答シート」=答え", vbInformation, "テスト作成完了"
End Sub


' ============================================================
' 不正解一括記録マクロ(丸付け後に実行する用)
' ============================================================
Sub 不正解記録()
    Dim wsHist As Worksheet
    Set wsHist = GetOrCreateHistorySheet()

    Dim s As String
    s = InputBox("間違えた問題番号を入力してください。" & vbCrLf & vbCrLf & _
                 "複数ある場合はカンマで区切ってください。" & vbCrLf & _
                 "例:12,45,78,103", "不正解記録")
    If Trim(s) = "" Then Exit Sub

    Dim nums() As String: nums = Split(s, ",")
    Dim i As Long, numVal As Long, hRow As Long
    Dim successCount As Long, errorCount As Long, oneNum As String

    For i = LBound(nums) To UBound(nums)
        oneNum = Trim(nums(i))
        If oneNum <> "" And IsNumeric(oneNum) Then
            numVal = CLng(oneNum)
            hRow = FindHistoryRow(wsHist, numVal)
            If hRow > 0 Then
                If IsNumeric(wsHist.Cells(hRow, 4).Value) Then
                    wsHist.Cells(hRow, 4).Value = CLng(wsHist.Cells(hRow, 4).Value) + 1
                Else
                    wsHist.Cells(hRow, 4).Value = 1
                End If
                successCount = successCount + 1
            Else
                errorCount = errorCount + 1
            End If
        Else
            If oneNum <> "" Then errorCount = errorCount + 1
        End If
    Next i

    Dim msg As String
    msg = successCount & "問の不正解を記録しました。"
    If errorCount > 0 Then msg = msg & vbCrLf & "確認できなかった番号:" & errorCount & "件"
    MsgBox msg, vbInformation, "不正解記録完了"
End Sub


' ============================================================
' 内部処理・関数群
' ============================================================
Private Sub InitializeHistory(wsList As Worksheet, wsHist As Worksheet)
    Dim lastRow As Long, r As Long, numVal As Long, engWord As String
    Dim hRow As Long, nextRow As Long

    wsHist.Cells(1, 1).Value = "番号"
    wsHist.Cells(1, 2).Value = "単語"
    wsHist.Cells(1, 3).Value = "出題回数"
    wsHist.Cells(1, 4).Value = "不正解回数"
    wsHist.Range("A1:D1").Font.Bold = True

    lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row

    For r = 2 To lastRow
        If IsNumeric(wsList.Cells(r, 1).Value) Then
            numVal = CLng(wsList.Cells(r, 1).Value)
            engWord = Trim(CStr(wsList.Cells(r, 2).Value))
            If engWord <> "" Then
                hRow = FindHistoryRow(wsHist, numVal)
                If hRow = 0 Then
                    nextRow = wsHist.Cells(wsHist.Rows.Count, 1).End(xlUp).Row + 1
                    If nextRow < 2 Then nextRow = 2
                    wsHist.Cells(nextRow, 1).Value = numVal
                    wsHist.Cells(nextRow, 2).Value = engWord
                    wsHist.Cells(nextRow, 3).Value = 0
                    wsHist.Cells(nextRow, 4).Value = 0
                Else
                    wsHist.Cells(hRow, 2).Value = engWord
                End If
            End If
        End If
    Next r
    wsHist.Columns("A:D").AutoFit
End Sub

Private Function FindHistoryRow(wsHist As Worksheet, numVal As Long) As Long
    Dim lastRow As Long, r As Long
    lastRow = wsHist.Cells(wsHist.Rows.Count, 1).End(xlUp).Row
    For r = 2 To lastRow
        If IsNumeric(wsHist.Cells(r, 1).Value) Then
            If CLng(wsHist.Cells(r, 1).Value) = numVal Then
                FindHistoryRow = r
                Exit Function
            End If
        End If
    Next r
    FindHistoryRow = 0
End Function

Private Function FindHistoryRowByNumber(wsHist As Worksheet, numVal As Long) As Long
    FindHistoryRowByNumber = FindHistoryRow(wsHist, numVal)
End Function

Private Function CollectWordsFromListSheet(ws As Worksheet, rangeText As String) As Collection
    Dim col As New Collection
    Dim lastRow As Long, r As Long, cellVal As Variant, numVal As Long
    Dim engWord As String, jpnWord As String, weight As Double, hRow As Long
    Dim rangesText() As String, addedNumbers As Object

    Set addedNumbers = CreateObject("Scripting.Dictionary")
    rangesText = Split(rangeText, ",")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For r = 2 To lastRow
        cellVal = ws.Cells(r, 1).Value
        If IsNumeric(cellVal) Then
            numVal = CLng(cellVal)
            If IsNumberInMultipleRanges(numVal, rangesText) Then
                If Not addedNumbers.Exists(CStr(numVal)) Then
                    engWord = Trim(CStr(ws.Cells(r, 2).Value))
                    jpnWord = Trim(CStr(ws.Cells(r, 3).Value))
                    If engWord <> "" Then
                        hRow = FindHistoryRowByNumber(ThisWorkbook.Worksheets("出題履歴"), numVal)
                        If hRow > 0 Then
                            If IsNumeric(ThisWorkbook.Worksheets("出題履歴").Cells(hRow, 4).Value) Then
                                weight = CDbl(ThisWorkbook.Worksheets("出題履歴").Cells(hRow, 4).Value) + 1
                            Else
                                weight = 1
                            End If
                        Else
                            weight = 1
                        End If
                        col.Add Array(numVal, engWord, jpnWord, weight)
                        addedNumbers.Add CStr(numVal), True
                    End If
                End If
            End If
        End If
    Next r
    Set CollectWordsFromListSheet = col
End Function

Private Function IsNumberInMultipleRanges(numVal As Long, rangesText() As String) As Boolean
    Dim i As Long, oneRange As String, parts() As String, startNo As Long, endNo As Long
    For i = LBound(rangesText) To UBound(rangesText)
        oneRange = Trim(rangesText(i))
        If oneRange <> "" Then
            parts = Split(oneRange, "-")
            If UBound(parts) = 1 Then
                If IsNumeric(Trim(parts(0))) And IsNumeric(Trim(parts(1))) Then
                    startNo = CLng(Trim(parts(0)))
                    endNo = CLng(Trim(parts(1)))
                    If startNo > endNo Then
                        Dim tmp As Long: tmp = startNo: startNo = endNo: endNo = tmp
                    End If
                    If numVal >= startNo And numVal <= endNo Then
                        IsNumberInMultipleRanges = True
                        Exit Function
                    End If
                End If
            End If
        End If
    Next i
    IsNumberInMultipleRanges = False
End Function

Private Function Pick100WordsWeighted(allWords As Collection, wsHist As Worksheet) As Collection
    Dim selectedCol As New Collection
    Dim tempWords As New Collection
    Dim item As Variant, i As Long, totalWeight As Double, rndVal As Double, currentWeight As Double
    Dim pickedIndex As Long

    For i = 1 To allWords.Count
        tempWords.Add allWords(i)
    Next i

    Randomize
    Do While selectedCol.Count < 100 And tempWords.Count > 0
        totalWeight = 0
        For i = 1 To tempWords.Count
            item = tempWords(i)
            totalWeight = totalWeight + CDbl(item(3))
        Next i

        rndVal = Rnd() * totalWeight
        currentWeight = 0
        pickedIndex = 1

        For i = 1 To tempWords.Count
            item = tempWords(i)
            currentWeight = currentWeight + CDbl(item(3))
            If currentWeight >= rndVal Then
                pickedIndex = i
                Exit For
            End If
        Next i

        selectedCol.Add tempWords(pickedIndex)
        tempWords.Remove pickedIndex
    Loop

    Set Pick100WordsWeighted = selectedCol
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 Sub IncrementQuestionCount(wsHist As Worksheet, numVal As Long)
    Dim hRow As Long
    hRow = FindHistoryRow(wsHist, numVal)
    If hRow > 0 Then
        If IsNumeric(wsHist.Cells(hRow, 3).Value) Then
            wsHist.Cells(hRow, 3).Value = CLng(wsHist.Cells(hRow, 3).Value) + 1
        Else
            wsHist.Cells(hRow, 3).Value = 1
        End If
    End If
End Sub

Private Function GetOrCreateHistorySheet() As Worksheet
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("出題履歴")
    On Error GoTo 0
    If ws Is Nothing Then
        Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        ws.Name = "出題履歴"
        ws.Cells(1, 1).Value = "番号"
        ws.Cells(1, 2).Value = "単語"
        ws.Cells(1, 3).Value = "出題回数"
        ws.Cells(1, 4).Value = "不正解回数"
        ws.Range("A1:D1").Font.Bold = True
    End If
    Set GetOrCreateHistorySheet = 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. マクロの登録
    • 作成した図形を右クリック ➔ 「マクロの登録」 を選択
    • リストから実行したいマクロ(例 など)(例:テスト作成_7割3割)を選んで「OK」
  3. ファイルの保存
    • Excelファイルを保存する際は、必ず 「Excel マクロ有効ブック(.xlsm)」 形式で保存

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

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

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

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

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

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

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

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

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

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

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

👉実力テストまとめ

👉テストまとめ

👉オンライン塾まとめ

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