Visual Basic 6.0 テクニック |
Visual Basic 中学校 > VB6 テクニック >
6.Select Case はもっと使える
VB1から装備されているステートメント「Select Case」はちょっとVBをやったことのある人なら誰でも使ったことがあるでしょうが、実は使いこなしている方は少ないのではないでしょうか?今回はSelect Case のいろいろな使い方を説明します。
1.導入
まずは、Select Case の普通の使い方を説明しましょう。変数 X の値に応じて処理を変える例はSelect Case を使って次のように書くことができますね。
Select Case X
Case 1
MsgBox "Xは一番小さい自然数です。"
Case 2
MsgBox "Xはもっとも小さい偶数です。"
Case 3
MsgBox "Xは2番目に小さい素数です。"
Case Else
MsgBox "Xは " & X & "です。"
End Select
この程度のプログラムは見ればわかるでしょう。しかし、みなんさんはひょっとしてSelect Case を上の例のようにだけ使ってはいないでしょうか?Select Case は工夫しだいでもっと違うこともできます。
2.Case文は意外と多機能
Select Case を使うとIf文と違って 「〜以上」「〜以下」「〜 または 〜」のような条件が判断できないと思ってる方はいませんか?それは大きな誤解です。
Select Case のなかのCase文では以下の方法で条件を指定することができます。
Is > X | Xより大きい |
Is <= X | X以下 |
X, Y | X または Y |
X To Y | X から Y の間 |
たとえば、次のような使い方ができます。
Age = InputBox("年齢は?")
Select Case Age
Case Is < 20
MsgBox "未成年ですね?"
Case 30 To 39
MsgBox "30代ですね?"
Case 77, 88, 99
MsgBox "喜寿か米寿か白寿ですね?"
Case Else
MsgBox Age & "ですか・・・。"
End Select
これらを組み合わせた次のような書き方も有効です。
Case 14, 20 To 30, Is >= 100
この文は 「14か、20〜30の間か、100以上」という条件を表します。
ちょっと面白いのは To が文字列に対しても使える点です。たとえば、次のような書き方も有効です。
Case "か" To "こんん"
この条件はあいうえお順で「始めの文字が「か」行だったら」という条件を表します。なお、「こんん」から始まる日本語が存在しないことを利用しています。
3.OptionButton(オプションボタン)の判定
4つのオプションボタンが配置されているフォームでどのオプションボタンがチェックされているか調べる時、皆さんはどのようにプログラムしていますか?素直に書くと次のようにプログラムするかもしれませんね。
If Option1.Value Then MsgBox "1がチェックされています"
If Option2.Value Then MsgBox "2がチェックされています"
If Option3.Value Then MsgBox "3がチェックされています"
If Option4.Value Then MsgBox "4がチェックされています"
これでも良さそうですが、If文が常に4回実行されてしまう文非能率的です。この点はElseIfを使えば回避できますが、Select Case を使って次のように書くこともできます。
Select Case True
Case Option1.Value : MsgBox "1がチェックされています。"
Case Option2.Value : MsgBox "2がチェックされています。"
Case Option3.Value : MsgBox "3がチェックされています。"
Case Option4.Value : MsgBox "4がチェックされています。"
End Select
Select Case は常に1つ(または0)のCase 文しか実行しないので上のIf文のような非能率は発生しません。また、注目していただきたいのはこの例では Select Case の後ろに 値 が設定されていて、各Case文に式が設定されていることです。普通のSelect Caseとは値と式の位置を逆にしてあります。この使い方はSelect Case の可能性を広げる第1歩となります。
4.Xと等しい変数があるかないか
変数 A, B, C, D, E, F, Gがあるとします。この中に変数X と値が等しいものはあるでしょうか、ないでしょうか。これを調べる必要があるときに皆さんはどうしていますか?
次のようにすれば1発です。
Select Case X
Case A, B, C, D, E, F, G
MsgBox "Xと等しい変数がありました!"
Case Else
MsgBox "Xと等しい変数はありませんでした!"
End Select
これはIf文に比べてSelect Case の方が圧倒的に効率が良いケースでしょう。ただし、「どの変数がXと等しいのか」を調べる場合はIfの方がやや有利です。というのはIf文の羅列は必ずすべてのIf文が評価されますが、Case文の羅列では最初に該当するCase文までしか評価されないので2つ以上の変数が該当する場合の検査に適さないからです。
5.2つの変数を同時判断
ちょっと細工をすれば2つの変数を同時に見て条件を分岐させることもできます。たとえば次のような対応があるとしましょう。
国コード | 1 | 2 | 3 | 4 | ||||||
都市コード | 1 | 2 | 3 | 1 | 2 | 1 | 1 | 2 | 3 | 4 |
都市名 | 東京 | 大阪 | 名古屋 | ソウル | プサン | 台北 | 北京 | 上海 | 南京 | 香港 |
国コードを表す変数 NCode と、都市コードを表す変数 CCode があるとすると、この2つを見れば「都市名」がわかるのですが具体的にはどのように書いたらよいのでしょうか?いろいろな書き方がありますがまぁSelect Case を使って次のように書くのが最も良いでしょう。
Select Case NCode & "#" & "CCode"
Case "1#1" : MsgBox "東京です。"
Case "1#2" : MsgBox "大阪です。"
Case "1#3" : MsgBox "名古屋です。"
Case "2#1" : MsgBox "ソウルです。"
(・・・以下省略します)
End Select
このようにして2つの変数を同時に判断して分岐させることができました。 # は区切り記号として使っているだけで特に意味は無いです。だから # の変わりに好きな文字・記号を使うことができます。区切り記号が無い場合どうなるかというと、国コードが 11 都市コードが 2 の場合と、国コードが 1 都市コードが 12 の場合を区別できなくなってしまうのです。
6.最後に
今回はここまでです。皆さんのつかっている便利なテクニックがあれば是非掲示板にてお知らせください。Select Case 以外のものでも歓迎いたします。