【VBAマクロ】EXCELで百マス計算の自動生成&採点をしよう!

今回は、百マス計算を作ってみます。小さい頃に、ドリルとかでやったアレです。
盛り込んだ機能は、自動生成→ランダムで百マス計算の作成、自動採点→点数の表示&間違った問題を黄色で表示、という機能です。
これで、無限に百マス計算することができますよ。


概要

自動生成と自動採点の2つのパートに分割しています。
自動生成のパートでは、縦と横それぞれ10個の数字を、Rnd関数とBoolean変数(ブール型変数)を組み合わせてランダムで表示させています。
また、自動生成パートの後半のプログラムで、解答表も作成しています。
自動採点パートでは、上記の解答表と照らし合わせて、間違った問題に関して、セルを黄色で表示させています。
また、誤答数をカウントして、最終的に点数を表示させています。

計算前


計算後の採点結果

コード【VBAマクロ】

百マス計算の自動生成パート

  1. Sub 百マス計算_自動生成()
  2.     Dim i As Long
  3.     Dim j As Long
  4.     Dim myNum_i As Long
  5.     Dim myNum_j As Long
  6.     Dim myFlag_i(1 To 10) As Boolean
  7.     Dim myFlag_j(1 To 10) As Boolean
  8.  
  9. '列と行の幅を均一にする&前回の結果を削除
  10.     Range("A1: K11").RowHeight = 40 * 0.75
  11.     Range("A1:K11").ColumnWidth = 40 * 0.118
  12.     Range("B2:K11").ClearContents
  13.     Range("B2:K11").Interior.ColorIndex = 0
  14.  
  15.     Randomize '乱数系列を初期化
  16.  
  17.     For i = 2 To 11
  18.         Do
  19.             myNum_i = Int(10 * Rnd + 1)
  20.         Loop Until myFlag_i(myNum_i) = False
  21.  
  22.         Cells(i, 1).Value = myNum_i
  23.         myFlag_i(myNum_i) = True
  24.     Next i
  25.  
  26.     For j = 2 To 11
  27.         Do
  28.             myNum_j = Int(10 * Rnd + 1)
  29.         Loop Until myFlag_j(myNum_j) = False
  30.  
  31.         Cells(1, j).Value = myNum_j
  32.         myFlag_j(myNum_j) = True
  33.     Next j
  34.  
  35.     Sheets("Sheet1").Range("A1: K11").Copy
  36.     Sheets("Sheet2").Select
  37.     Range("A1").Select
  38.     ActiveSheet.Paste
  39.  
  40.     '解答作成 別タブに作成する
  41.     For i = 2 To 11
  42.         For j = 2 To 11
  43.             Cells(i, j) = Cells(i, 1) * Cells(1, j)
  44.         Next j
  45.     Next i
  46.  
  47.     Application.CutCopyMode = False
  48.     Sheets("Sheet1").Select
  49.  
  50. End Sub


百マス計算の自動採点パート

  1. Sub 百マス計算_自動採点()
  2.     Dim i As Long
  3.     Dim j As Long
  4.     Dim wrong As Long
  5.     Dim points As Long
  6.  
  7.     wrong = 0
  8.  
  9.     For i = 2 To 11
  10.         For j = 2 To 11
  11.             If Worksheets("Sheet1").Cells(i, j) <> Worksheets("Sheet2").Cells(i, j) Then
  12.                 Worksheets("Sheet1").Cells(i, j).Interior.Color = vbYellow
  13.                 wrong = wrong + 1
  14.             End If
  15.         Next j
  16.     Next i
  17.     
  18.     points = 100 - wrong
  19.     Range("M" & 11).Value = points
  20.  
  21. End Sub





コード【VBAマクロ】の解説

自動生成パートの解説

2-7.
行数をi、列数をjと定義します。また、iとjに関して、それぞれmyNumとmyFlagという変数を定義します。
myNumは、ランダムな一桁の数字を入れる変数、myFlagは、数字に被りがない(1〜10まで)ように判定する変数として利用しています。
※重複のないランダムな数の生成方法に関して、以下のブログを参考にさせて頂きました。
mougモーグ: 重複のない、ランダムな数をセルに代入する
10-11.
百マス計算の範囲(A1:K11)の列と行の幅を均一にしています(セルの形を正方形にする)。
行の高さ: ○x0.75
列の横幅: ○x0.118
という数字をかけると、正方形になります。
※○の部分は、変更可能。今回は、40。
12-13.
ClearContentsで、前回の結果を消去します。
上記操作では、セルの色は変わらないので(黄色のセルは、そのまま黄色)、セルの背景色を「塗りつぶしなし」にします。
※採点パートで、間違った問題のセルを黄色にする操作を入れているので、ここで黄色を消しています。
15.
乱数ジェネレーターを初期化します。
17-24.
For構文で、2行目〜11行目まで、以下の操作をループさせます。
また、Do構文で、20行目のUntilまでループさせます。
19.
ランダムに「1〜10」の数字を取得する方法は、Int(10*Rnd+1)を使います。
Rnd関数で生成される数字は、0以上で1未満なので、10を掛けて、1を足して、Int関数で整数部分を取り出すことで、「1〜10」の数字をランダムに生成できます。
i行目のmyNumに、上の数字を1つ入れます。
例)2行目(A2セル)に、「5」を入れる。
20.
i行目のmyNumの数に対して、Boolean変数(ブール型変数)で、真(true)か偽(false)の判定をしています。
真であれば、再び19行目の操作が始まります。
偽であれば、ループが終わり、22行目に移ります。
例)2行目(A2セル)に、「5」を入れる。これまでに「5」は入っていないので偽となり、22行目へ。
例)2行目(A2セル)に「5」、次のループで3行目(A2セル)に「5」だった場合。既に「5」が入っているので真となり、18行目へ。
22-23.
A列i行目のセルに、myNum_iの数字を入れる。
myFlag_i(myNum_i)を真とします。
例)2行目(A2セル)に、「5」を入れる。これまでに「5」は入っていないので偽となり、22行目へ。myFlag_2(5)を真とする。
26-33.
iと同じ操作。
35-38.
作成した百マス計算をコピーして、Sheet2にペーストします。
40-45.
Sheet2に、解答を作成します。
二重ループにて、Cells(i. j)を求めます。掛け算は「*」を使用します。
47-48.
コピーした情報を無効にして、Sheet1を選択します。

自動採点パートの解説

2-5.
行数をi、列数をjと定義します。
また、間違いをwrong、点数をpointsと定義します。
7.
wrong変数を0にします(リセット)。
9-16.
二重ループにて、百マス全てのセルの正誤判定をします。
もし、Sheet1の記入した数字と、Sheet2の解答が異なる(<>)場合、次の操作をします。
Sheet1のCells(i, j)のセルの背景色を黄色にして、wrong変数に1を加えます(間違った数のカウント)。
18-19.
得点を計算します。100点から、wrong(間違った数)を引いて、pointsを出します。
得点表示セルに、pointsを表示させます。

今回のコードでは、自動生成と自動採点の2パートに分かれています。
実際に百マス計算してみると、次のセルに移動する操作が面倒なので、入力したら、次のセルに自動敵に移動出来れば良いかなと感じました。
縦に計算していくか、横に計算していくか選択して、自動で移動できるプログラムを追加できれば、もっと良くなりそうです。