Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:暗算練習アプリ
#VBA100本ノック 41本目
暗算練習アプリを作成します。
・整数2個と+-*/の演算子をランダムに選ぶ
・問題をInputBoxに表示
・入力値を採点
・全10問、最後に10点満点で点数をMsgBox表示
・キャンセルや未回答は次の問題に進む
※整数の範囲については暗算できる範囲で随意
※添付GIFを参考に


◇ 出題ページはこちら
ソースコード
' 100本ノック041:暗算練習アプリ Sub 暗算練習アプリを起動する() ' 10問分ループ Dim 解答記録 As String Dim 正解数 As Long: 正解数 = 0 Dim n As Long For n = 1 To 10 Dim 演算子 As String, 第1数値 As Long, 第2数値 As Long, 答え As Long ' 演算子ごとに2値と答えを用意 Dim 演算子乱数 As Long 演算子乱数 = Fx.RandBetween(1, 4) Select Case 演算子乱数 Case 1: 演算子 = "+" 第1数値 = Fx.RandBetween(1, 99) 第2数値 = Fx.RandBetween(1, 99) 答え = 第1数値 + 第2数値 Case 2: 演算子 = "-" 第1数値 = Fx.RandBetween(1, 99) 第2数値 = Fx.RandBetween(1, 第1数値) 答え = 第1数値 - 第2数値 Case 3: 演算子 = "×" 第1数値 = Fx.RandBetween(1, 99) 第2数値 = IIf(第1数値 < 10, Fx.RandBetween(10, 99) _ , Fx.RandBetween(1, 9)) ' 片方は1桁 答え = 第1数値 * 第2数値 Case 4: 演算子 = "÷" 第2数値 = Fx.RandBetween(1, 20) 答え = Fx.RandBetween(1, 20) 第1数値 = 答え * 第2数値 End Select ' ユーザーへ出題し合っていたら正解数をカウント Dim 出題数式 As String 出題数式 = 第1数値 & 演算子 & 第2数値 & "=" Dim ユーザー解答 As Variant: ユーザー解答 _ = InputBox(n & "問目" & vbLf & vbLf & 出題数式, "暗算練習") ユーザー解答 = StrConv(ユーザー解答, vbNarrow) If ユーザー解答 = 答え Then 正解数 = 正解数 + 1 解答記録 = 解答記録 & vbLf & 出題数式 & " " & ユーザー解答 & " ○" Else 解答記録 = 解答記録 & vbLf & 出題数式 & " " & ユーザー解答 & " × (答え:" & 答え & ")" End If Next MsgBox "正解数:" & 正解数 & " / 10" & vbLf & 解答記録 End Sub
解説
数式を作成してInputBoxとの正誤を確かめる問題でした。
演算子を「+-*/」で作ればEvaluateメソッドに計算させる方法もありますが、
どのみち2つの数値は演算子ごとに作る必要があるため愚直に分岐しました。
この方が「+-×÷」を使えて数式が読みやすくなりますね。
あとはコードを見てもらえば処理の内容はつかめるかなと思います。
自分で一度プレイしてみて9/10と表示されてしまったのですが、
どこが間違っていたのかわからなくて腹が立ったので解答歴の表示を追加しました。
せっかく練習するなら間違った箇所のフィードバックは大事ですね。
あとはソースコードの記述ポイントとして、
Case 2: 演算子 = "-" 第1数値 = Fx.RandBetween(1, 99) 第2数値 = Fx.RandBetween(1, 第1数値) 答え = 第1数値 - 第2数値
このようにCase文の第1行をマルチステートメントにすることで、
演算子の代入文を見出しとしても活用できたのが個人的に気に入りました。
好みが分かれるポイントな気がしますが、気に入ったら採用してみてください。