まなデジ 中学1年生 正負の数 数の大小関係と数直線 タイトル画像

📝概要

Excelで「○より△大きい(小さい)数」を自動で作り出す学習ツールです。
毎回ちがう問題ができるので、負の数のしくみをくり返し練習できます。
数直線といっしょに、数の変化を目で見てわかりやすく学べます。

📥ツールのダウンロード

ツールは下記ページからダウンロードすることができます。
なお、ダウンロードページは2026/07/08に公開となっておりますので、 それまでリンクがございません。

noteへ

なお、こちらからダウンロードできるExcelファイルには、ブックの保護とシートの保護をかけています。
ブックの保護を解除し非表示シートを表示したり、 仕組みを見るためにシートの保護を解除する場合は、下記パスワードを使用してください。
パスワード:math1234

📘画面構成

💡このツールのポイント

「○より△大きい・小さい」を体感で理解できる

負の数を使った“増える・減る”の感覚を、数直線で視覚的に学べるツールです。
数字の変化が目で見えるので、文章だけでは分かりにくい負の数の動きをつかみやすくなります。

毎回ちがう問題が自動で作られる

Excelがランダムに問題を作るため、何度でも新しい問題に挑戦できます。
反復練習に向いていて、理解の定着を助けます。

正解・不正解がその場でわかる

入力した答えが正しければ緑、不正解なら赤で表示されます。
自分の考え方が合っているかどうか、すぐに確認できます。

負の数を「使わずに言い換える」練習ができる

「1より−5大きい数」などの表現を、 負の数を使わずにどう言い換えるかを学べるようになっています。
文章理解と計算の両方を鍛えられる仕組みです。

数直線で位置を確認しながら答えを導ける

数直線上に「A」を置くことで、 “どこにある数なのか”を視覚的に確認できます。
計算だけでなく、数の位置関係の理解にもつながります。

ボタンひとつで何度でも挑戦できる

「もう一度挑戦する」ボタンで、すぐに新しい問題へ。
短時間でサッと使える、学習しやすい構造になっています。

💻コード紹介


                        
Option Explicit

Public Const PW As String = "math1234"

Sub makeQes()

'【変数】
    'このファイルとシート
    Dim wb    As Workbook  'このファイル
    Dim wsQes As Worksheet '数の大小関係シート
    Dim wsSet As Worksheet '設定シート
    
    '操作する数値と文字列
    Dim ArrBaseNum()           As Long     'ベースナンバーのもととなる数値を格納する配列
    Dim ArrNegativeNum()       As Long     'アのもととなる数値を格納する配列
    Dim ArrLargeSmallNumBase() As Long     'イのもととなる数値化したものを格納する配列
    Dim cnt                    As Long     '上記3種類のデータ数
    Dim baseNum                As Long     'ベースナンバー
    Dim negativeNum            As Long     'アの負の数
    Dim positiveNum            As Long     'ウの正の数
    Dim largeSmallNumBase      As Long     'イを数値化したもの(大きい数:0、小さい数:1)
    Dim largeSmallNumReverse   As Long     'エを数値化したもの(大きい数:0、小さい数:1)
    Dim largeSmallBase         As String   'イの文字列
    Dim largeSmallReverse      As String   'エの文字列
    Dim ansNum                 As Long     '解答の数値
    
    'セル
    Dim rngBaseNum                As Range '数の大小関係シート:ベースナンバー
    Dim rngNegetiveNum            As Range '数の大小関係シート:アの負の数
    Dim rngLargeSmallBase1        As Range '数の大小関係シート:イの大きい数/小さい数
    Dim rngPositiveNum            As Range '数の大小関係シート:ポジティブナンバー
    Dim rngLargeSmallBase2         As Range '数の大小関係シート:大小の数2
    Dim rngNumberLine             As Range '数の大小関係シート:数直線
    Dim rngOutputAns              As Range '数の大小関係シート:解答入力欄
    Dim rngPosiNum                As Range '設定シート    :ウの正の数
    Dim rngLargeSmallReverse      As Range '設定シート    :エの大きい数/小さい数
    Dim rngAnsNum                 As Range '設定シート    :解答
    
    
    '乱数
    Dim aRnd As Long
    
    '行/列
    Dim low As Long '行
    Dim col As Long '列
    
    'カウンタ変数
    Dim i As Long
    Dim j As Long
    
    
'【動作】
    '動作が速くなるコード
    With Application
        .ScreenUpdating = False            '画面遷移→しない
        .EnableEvents = False              'イベントの発生→しない
        .Calculation = xlCalculationManual '再計算→手動
        .Cursor = xlWait                   'カーソル→ウェイト
        .DisplayAlerts = False             '確認ダイアログボックスの表示→なし
    End With
    
    'このファイルとシートを変数格納
    Set wb = ThisWorkbook
    With wb
        Set wsQes = .Sheets("数の大小関係")
        Set wsSet = .Sheets("設定")
    End With
    
    '数の大小関係シート
    With wsQes
        'シートを保護する
        .Protect Password:=PW, UserInterfaceOnly:=True
        
        '名前付きセルの情報を変数に代入する
        Set rngBaseNum = .Range("ベースナンバー")
        Set rngNegetiveNum = .Range("ネガティブナンバー")
        Set rngLargeSmallBase1 = .Range("大小の数1")
        Set rngPositiveNum = .Range("ポジティブナンバー")
        Set rngLargeSmallBase2 = .Range("大小の数2")
        Set rngNumberLine = .Range("数直線")
        Set rngOutputAns = .Range("解答入力欄")
        
        '文字列の情報をクリアする
        rngPositiveNum.ClearContents
        rngLargeSmallBase2.Value = ""
        rngNumberLine.ClearContents
        rngOutputAns.ClearContents
    End With
    
    '設定シート
    With wsSet
        Set rngPosiNum = .Range("ウ")
        Set rngLargeSmallReverse = .Range("エ")
        Set rngAnsNum = .Range("解答")
        
    End With
    
    '配列にベースナンバー、もととなる数値、大きい数/小さい数の全データを格納する
    cnt = 0
    For i = 1 To 19 'i:ベースナンバー(このiから-10をしたものを配列に格納する)
        If i <> 10 Then 'iから-10をしたものを配列に格納するので0は避けたい
            For j = 2 To 8
                '大きい数
                If Abs((i - 10) - j) > 0 And Abs((i - 10) - j) <= 10 Then
                    ReDim Preserve ArrBaseNum(cnt)
                    ReDim Preserve ArrNegativeNum(cnt)
                    ReDim Preserve ArrLargeSmallNumBase(cnt)
                    
                    ArrBaseNum(cnt) = i - 10       'ベースナンバー
                    ArrNegativeNum(cnt) = j * (-1) 'もととなる数値
                    ArrLargeSmallNumBase(cnt) = 0     '大きい数/小さい数を数値化したもの
                    
                    cnt = cnt + 1
                End If
                
                '小さい数
                If Abs((i - 10) + j) > 0 And Abs((i - 10) + j) <= 10 Then
                    ReDim Preserve ArrBaseNum(cnt)
                    ReDim Preserve ArrNegativeNum(cnt)
                    ReDim Preserve ArrLargeSmallNumBase(cnt)
                    
                    ArrBaseNum(cnt) = i - 10       'ベースナンバー
                    ArrNegativeNum(cnt) = j * (-1) 'もととなる数値
                    ArrLargeSmallNumBase(cnt) = 1     '大きい数/小さい数を数値化したもの
                    
                    cnt = cnt + 1
                End If
            Next j
        End If
    Next i
    cnt = cnt - 1
    
    '上記で作成したものに対し、乱数を発生させ、
    '発生させた乱数に対する数値や文字列を変数に代入する
    'さらに、セルに値を代入する
    
    '乱数
    aRnd = Int(Rnd() * (cnt + 1))
    
    'ベースナンバー
    baseNum = ArrBaseNum(aRnd)
    rngBaseNum.Value = baseNum
    
    'アの数値(負の数)
    negativeNum = ArrNegativeNum(aRnd)
    rngNegetiveNum.Value = negativeNum
    
    'イの数値
    largeSmallNumBase = ArrLargeSmallNumBase(aRnd)
    
    'イの文字列
    If largeSmallNumBase = 0 Then
        largeSmallBase = "大きい数"
    Else
        largeSmallBase = "小さい数"
    End If
    rngLargeSmallBase1.Value = largeSmallBase
    
    'ウの数値(正の数)
    positiveNum = Abs(negativeNum)
    rngPosiNum.Value = positiveNum
    
    'エの数値と文字列
    If largeSmallNumBase = 0 Then
        largeSmallNumReverse = 1
        largeSmallReverse = "小さい数"
        
    Else
        largeSmallNumReverse = 0
        largeSmallReverse = "大きい数"
        
    End If
    rngLargeSmallReverse.Value = largeSmallReverse
    
    '解答
    If largeSmallNumBase = 0 Then
        rngAnsNum.Value = baseNum + negativeNum
    Else
        rngAnsNum.Value = baseNum - negativeNum
    End If
    
    'もとに戻すコード
    With Application
        .ScreenUpdating = True                '画面遷移→する
        .EnableEvents = True                  'イベントの発生→あり
        .Calculation = xlCalculationAutomatic '再計算→自動
        .Cursor = xlDefault                   'カーソル→動かす
        .DisplayAlerts = True                 '確認ダイアログボックスの表示→あり
    End With
    
    wsQes.Activate
    wb.Save
    
    MsgBox "出題が完了しました。流れにしたがって作業を進めてください。"
End Sub

💡このコードのポイント

① まず、出題に必要なセルを準備する
ツールが使う「ベースの数」「負の数」「大小の向き」「答え欄」などのセルを読み込み、前回の内容をきれいにリセットします。
これで、いつでも新しい問題を作れる状態になります。

② 出題候補となる数の組み合わせをすべて作る
「ベースとなる数(−9〜9の0以外)」と「負の数(−2〜−8)」を組み合わせて、
・大きい数になる場合
・小さい数になる場合
の両方をチェックし、成立する問題だけを配列に保存します。
この段階で“安全な問題リスト”が完成します。

③ ランダムに1問を選び、問題を作る
作成した問題リストの中から、Excelがランダムに1つ選びます。
選ばれた問題から、「ベースナンバー」「負の数(ア)」「大きい/小さい(イ)」 「正の数(ウ)」「反対向き(エ)」「正しい答え」を決定し、シートに反映します。

④ 学習シートに値を書き込み、問題が完成
選ばれた内容が「数の大小関係」シートに書き込まれ、 学習者はそのまま問題に取り組める状態になります。
数直線や答え欄もクリアされているので、毎回まっさらな問題になります。

⑤ Excelの動作を元に戻し、出題完了
画面更新や再計算の設定を通常に戻し、 最後に「出題が完了しました」というメッセージを表示します。