【VBA】Quiz プログラムを作ってみたよ!

 ふい~。何だかここ数日色々なことがあって大変でした。
 こばとが泣いたり、怒ったり、まさに修羅場でしたよ。
 まあ、何はともあれ日常生活が戻りつつあるので、また楽しく VBA のお話をしましょ~。

【VBA】Quizマクロ

 ところで皆さん、クイズ は好きですか?
 いきなりこんなこと訊かれても、よほどのクイズ好き以外は返答に困るでしょうけど、取り立てて「嫌い!」て言う人もあまりいないと思うので、「こういうマクロも簡単にできちゃうんだね」ぐらいの気分で軽く読み流してくださいな。問題は全て VBA に関するものです。中には少し難しいな問題もあるので、全部正解したら中級以上だと思いますよ。とりあえず、Quizマクロ のプロシージャはこんなふうになります。

'[VBA] ランダムにクイズが出題されるプロシージャ

Option Base 1

Sub Quiz()

  Dim i As Integer
  Dim q(5) As String
  Dim a(5) As String
  Dim mystr(5) As String

  q(1) = "値が日付かどうかをチェックするのは(  )関数"
  q(2) = "配列のインデックス番号の下限値を参照するのは(  )関数"
  q(3) = "値渡しで引数を渡すときは(  )キーワード"
  q(4) = "グラフの種類を変更するのは(  )プロパティ"
  q(5) = "テキストファイルを開くのは(  )メソッド"

  a(1) = "IsDate"
  a(2) = "LBound"
  a(3) = "ByVal"
  a(4) = "ChartType"
  a(5) = "OpenText"

  ct = 0

  For i = 1 To 5

    'ユーザーさんに答えを入力してもらいます
    'ただし大文字・小文字は区別しません
    mystr(i) = InputBox(q(i))

    '入力された文字が解答と同じであれば
    If StrComp(a(i), mystr(i), 1) = 0 Then
      '正解数に 1 を加えます
      ct = ct + 1
      MsgBox "正解です!"
    Else
      MsgBox "残念!"
    End If

  Next i

  '全部で何問正解したかを表示します
  MsgBox ct & "問正解です"

End Sub

 全部で 5 つの問題 q(i) と解答 a(i)、ユーザーさんの入力した解答 mystr(i) を全て配列に入れておいて、a(i) と mystr(i) が等しければ「正解です!」、違っていれば「残念!」と表示されます。その文字列を比較するときに StrComp という少し難しい関数を使っています。というのは、

If a(i) = mystr(i) Then

というように書いてしまうと、大文字と小文字を違うものとして区別してしまいます。このような比較モードを Bynaryモードとよびます。たとえば “IsDate” が正解であるところを、ユーザーさんが “isdate” と入力すると「間違いです!」と判定されてしまうのです。でも VBE (Visual Basic Editor) のコードウィンドウでは小文字で入力したって、大文字にすべきところは自動で大文字に変えてくれるのですから、”isdate” だって正解にしたいところです。さもないと、ユーザーさんが「なんだ、このプログラムは!?」と怒ってしまいます。そこで大文字と小文字を同じものとして扱うために、Textモードで比較する必要があるのですが、そのときに使用するのが StrComp関数なのです。StrComp関数は

StrComp(文字列1, 文字列2 [, 比較モード])

という形式で記述し、[比較モード] に「 1 」を指定すると Textモードで文字列を比較し、等しい場合に 0 を返します。上のマクロでは

StrComp(a(i), mystr(i), 1)

と記述して、配列 a(i) と mystr(i) に入っている文字列を Textモードで比較しているわけです。StrComp関数 については近いうちに別の記事で書く予定だから、そちらも参考にしてくださいな。

コメント

タイトルとURLをコピーしました