ふい~。何だかここ数日色々なことがあって大変でした。
こばとが泣いたり、怒ったり、まさに修羅場でしたよ。
まあ、何はともあれ日常生活が戻りつつあるので、また楽しく 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関数 については近いうちに別の記事で書く予定だから、そちらも参考にしてくださいな。
コメント