ご存知、『excel vba のプログラミングのツボとコツがゼッタイにわかる本』の計算ドリル編(~6章)まで終えました。
そこで、自分に修行を課そうと思いまして。
計算ドリルを2次元で、つまり100計算ならぬ25マス計算を作ったよ、という内容です。
仕様とポイント
基本的にはテキストの仕様を真似しました。
仕様概要
1) 5×5の足し算
2) check ボタンを押したら答え合わせ
– 正解:青
– 不正解:赤色で背景黄色
3) reset でリセット
– 回答を全部消す
– 背景色をリセット
– 再度入力する文字は黒色
– 5×5の問題がランダムに変化(今回は1桁)
ポイント1: 2次元で値が変化する
テキストだと行or列の一方向のみループで回していた。
今回は各方向に値を変化させるので変数定義は2つ必要。
私は
1. まず 列方向(上から下) を処理
2. 次に 行方向 (左から右) を処理
という順にした。
ポイント2: 背景色が変化する
ググッて解決。
colorindex 又は RGB のどちらを使うのかは好みの問題だと思います。
結果とコード
excelの見た目
コード
Option Explicit '--- difiniton Const STR_RW As Integer = 3 'start in row Const END_RW As Integer = 7 'end in row Const STR_CLM As Integer = 5 'start in colum Const END_CLM As Integer = 9 'end in colum '--- check Sub check5x5() Dim j As Integer '列 (左右) 方向 (row) Dim i As Integer '行 (上下) 方向 (colum) For j = 3 To 7 For i = 5 To 9 Select Case Cells(i, j) Case Is <> Cells(i, STR_RW - 1).Value + Cells(STR_CLM - 1, j).Value '--- 不正解 With Cells(i, j) .Font.Color = vbRed .Interior.Color = RGB(256, 256, 0) '--- 黄色 End With Case Is = Cells(i, STR_RW - 1).Value + Cells(STR_CLM - 1, j).Value '--- 正解 With Cells(i, j) .Font.Color = vbBlue .Interior.ColorIndex = 0 End With Case Else MsgBox ("unexpected errors have occured !") Cells(i, j).Interior.Color = RGB(230, 0, 18) '--- 赤色 End Select Next i Next j End Sub '--- reset Sub reset5x5() Dim j As Integer Dim i As Integer For j = STR_RW To END_RW For i = STR_CLM To END_CLM With Cells(i, j) .ClearContents .Font.Color = vbBlack .Interior.ColorIndex = 0 End With Cells(i, STR_RW - 1).Value = Int(Rnd * 10) Cells(STR_CLM - 1, j).Value = Int(Rnd * 10) Next i Next j End Sub
反省 -空白セルに対する処理から逃げた-
上のコード@ 20行目 について。
当初考えた仕様は、
・スペースが入力される
or
・空白
↓
該当セルを 黄色 に塗り潰す
でした。
ググッて調べましたが、空白に対する処理は結構複雑。
そんな訳で次のように仕様変更して逃げました。
・計算結果が異なる場合
→入力された数字を赤色にする
→さらに背景を黄色に塗りつぶす
感想と今後の展望
良かったこと
一先ず基本的な使い方は身に付ける事ができた。
変数の定義に戸惑ったけど、将来的に変更箇所を減らすためには大切な作業だよね。
イマイチだったこと
– 得点率を表示した方が使用者に優しい
– 空白セル対策から逃げたのがちょっと…
– デザイン(見た目)がダサい
私が使う側なら 正解数 又は 不正解数 が知りたいかな。
もっと欲を言えば、開始~終了までに要した時間も。
更に欲を言えば、前回の記録から何%回答速度がアップ/ダウンしたのか。
更に更に欲を言えば、今までの記録の中で何番目に早く回答できたのか(順位)。
今後の課題として一旦保留。
空白セルの問題を先延ばしにしたのは悔やまれる。
将来的にまた同じ所で躓く予感。
またこの問題に直面したらその時に考えることにする。
デザインについては個人の美的センスに依るけど…
見た目がちょっとダサい。
今後の展望
箇条書きで。
– 得点率[%]を表示するかも
– 空白セル対応をするかも
– 状態(文字の色, 値をクリア等) を定義して可読性向上を図るかも
– 見た目をもっと良くするかも
以上です。