和風スパゲティのレシピ

日本語でコーディングするExcelVBA

41本目:暗算練習アプリ

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行をマルチステートメントにすることで、
演算子の代入文を見出しとしても活用できたのが個人的に気に入りました。


好みが分かれるポイントな気がしますが、気に入ったら採用してみてください。