今回は、百マス計算を作ってみます。小さい頃に、ドリルとかでやったアレです。
盛り込んだ機能は、自動生成→ランダムで百マス計算の作成、自動採点→点数の表示&間違った問題を黄色で表示、という機能です。
これで、無限に百マス計算することができますよ。
概要
自動生成と自動採点の2つのパートに分割しています。
自動生成のパートでは、縦と横それぞれ10個の数字を、Rnd関数とBoolean変数(ブール型変数)を組み合わせてランダムで表示させています。
また、自動生成パートの後半のプログラムで、解答表も作成しています。
自動採点パートでは、上記の解答表と照らし合わせて、間違った問題に関して、セルを黄色で表示させています。
また、誤答数をカウントして、最終的に点数を表示させています。
計算前
↓
コード【VBAマクロ】
百マス計算の自動生成パート
- Sub 百マス計算_自動生成()
- Dim i As Long
- Dim j As Long
- Dim myNum_i As Long
- Dim myNum_j As Long
- Dim myFlag_i(1 To 10) As Boolean
- Dim myFlag_j(1 To 10) As Boolean
-  
- '列と行の幅を均一にする&前回の結果を削除
- Range("A1: K11").RowHeight = 40 * 0.75
- Range("A1:K11").ColumnWidth = 40 * 0.118
- Range("B2:K11").ClearContents
- Range("B2:K11").Interior.ColorIndex = 0
-  
- Randomize '乱数系列を初期化
-  
- For i = 2 To 11
- Do
- myNum_i = Int(10 * Rnd + 1)
- Loop Until myFlag_i(myNum_i) = False
-  
- Cells(i, 1).Value = myNum_i
- myFlag_i(myNum_i) = True
- Next i
-  
- For j = 2 To 11
- Do
- myNum_j = Int(10 * Rnd + 1)
- Loop Until myFlag_j(myNum_j) = False
-  
- Cells(1, j).Value = myNum_j
- myFlag_j(myNum_j) = True
- Next j
-  
- Sheets("Sheet1").Range("A1: K11").Copy
- Sheets("Sheet2").Select
- Range("A1").Select
- ActiveSheet.Paste
-  
- '解答作成 別タブに作成する
- For i = 2 To 11
- For j = 2 To 11
- Cells(i, j) = Cells(i, 1) * Cells(1, j)
- Next j
- Next i
-  
- Application.CutCopyMode = False
- Sheets("Sheet1").Select
-  
- End Sub
百マス計算の自動採点パート
- Sub 百マス計算_自動採点()
- Dim i As Long
- Dim j As Long
- Dim wrong As Long
- Dim points As Long
-  
- wrong = 0
-  
- For i = 2 To 11
- For j = 2 To 11
- If Worksheets("Sheet1").Cells(i, j) <> Worksheets("Sheet2").Cells(i, j) Then
- Worksheets("Sheet1").Cells(i, j).Interior.Color = vbYellow
- wrong = wrong + 1
- End If
- Next j
- Next i
- points = 100 - wrong
- Range("M" & 11).Value = points
-  
- 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パートに分かれています。
実際に百マス計算してみると、次のセルに移動する操作が面倒なので、入力したら、次のセルに自動敵に移動出来れば良いかなと感じました。
縦に計算していくか、横に計算していくか選択して、自動で移動できるプログラムを追加できれば、もっと良くなりそうです。