VB6のSelect Caseとは?条件分岐の使い方
VB6で作られた業務システムでは、入力された値や処理区分によって、実行する処理を分ける場面が多くあります。
たとえば、伝票区分によって登録処理を変える、顧客種別によって単価計算を変える、ステータスによってボタンの動作を変える、メニュー番号によって呼び出す画面を変えるといった処理です。
このような条件分岐で使われる構文の一つが、Select Case文です。
If文でも条件分岐はできますが、判定する値がはっきりしている場合や、区分コードごとに処理を分けたい場合は、Select Caseを使った方がコードを読みやすくできることがあります。
この記事では、VB6のSelect Caseの基本的な使い方、If文との違い、複数条件や範囲指定の書き方、既存VB6システムを改修する際の注意点について解説します。
VB6のSelect Caseとは
Select Caseは、1つの値をもとに処理を分けるための条件分岐です。
たとえば、変数に入っている値が「1」の場合は登録処理、「2」の場合は修正処理、「3」の場合は削除処理を行う、といった分岐に使います。
VB6では、業務システムの中で区分コードや処理番号を判定する場面が多くあります。そのため、Select Caseは既存システムのソースコードでもよく見かける構文です。
たとえば、次のような場面で使われます。
伝票区分によって処理を分ける。
顧客種別によって計算方法を変える。
商品区分によって表示内容を変える。
メニュー番号によって呼び出す画面を変える。
ステータスによって更新可否を判断する。
帳票種別によって出力する帳票を切り替える。
このように、値ごとに処理を整理したい場合にSelect Caseは使いやすい構文です。
Select Caseの基本構文
VB6のSelect Caseは、次のように書きます。
Select Case 判定する値
Case 値1
' 値1の場合の処理
Case 値2
' 値2の場合の処理
Case Else
' どのCaseにも当てはまらない場合の処理
End Select
Select Caseの後ろに、判定したい変数や式を書きます。
Caseには、判定する値を指定します。
Case Elseには、どのCaseにも当てはまらなかった場合の処理を書きます。
最後にEnd Selectで閉じます。
たとえば、処理区分によってメッセージを変える場合は、次のようになります。
Dim kubun As Integer
kubun = 1
Select Case kubun
Case 1
MsgBox "登録処理を実行します。"
Case 2
MsgBox "修正処理を実行します。"
Case 3
MsgBox "削除処理を実行します。"
Case Else
MsgBox "処理区分が不正です。"
End Select
この例では、kubunの値が1なら登録、2なら修正、3なら削除として処理を分けています。
どれにも当てはまらない場合は、Case Elseの処理が実行されます。
業務システムでは、このような処理区分の判定が多くあります。If文で書くこともできますが、区分ごとの処理を並べたい場合はSelect Caseの方が見通しがよくなります。
数値で分岐するSelect Case
Select Caseでは、数値を使った分岐がよく使われます。
たとえば、メニュー番号によって処理を分ける場合です。
Dim menuNo As Integer
Select Case menuNo
Case 1
Call OpenCustomerForm
Case 2
Call OpenOrderForm
Case 3
Call OpenInvoiceForm
Case 9
Unload Me
Case Else
MsgBox "メニュー番号が正しくありません。"
End Select
このような書き方にすると、メニュー番号と処理の対応が分かりやすくなります。
If文で書くと、次のようになります。
If menuNo = 1 Then
Call OpenCustomerForm
ElseIf menuNo = 2 Then
Call OpenOrderForm
ElseIf menuNo = 3 Then
Call OpenInvoiceForm
ElseIf menuNo = 9 Then
Unload Me
Else
MsgBox "メニュー番号が正しくありません。"
End If
どちらでも処理はできますが、値ごとの分岐が多くなるほど、Select Caseの方が整理しやすくなります。
文字列で分岐するSelect Case
Select Caseは、数値だけでなく文字列の判定にも使えます。
たとえば、伝票区分を文字列で管理している場合です。
Dim denpyoKubun As String
Select Case denpyoKubun
Case "売上"
Call SyoriUriage
Case "仕入"
Call SyoriShiire
Case "返品"
Call SyoriHenpin
Case Else
MsgBox "伝票区分が不正です。"
End Select
文字列で分岐する場合は、表記ゆれに注意が必要です。
たとえば、「売上」と「売上伝票」、「売上げ」のように入力値がばらつくと、想定したCaseに入らないことがあります。
既存システムでは、画面上では同じ意味に見えても、内部ではコード値で管理している場合があります。たとえば、売上は「01」、仕入は「02」、返品は「03」のような形です。
Dim denpyoCode As String
Select Case denpyoCode
Case "01"
Call SyoriUriage
Case "02"
Call SyoriShiire
Case "03"
Call SyoriHenpin
Case Else
MsgBox "伝票コードが不正です。"
End Select
業務システムでは、画面に表示される名称ではなく、内部の区分コードで分岐していることが多くあります。改修時には、このコードの意味を確認することが重要です。
複数の値を1つのCaseで扱う方法
同じ処理を複数の値で実行したい場合は、Caseに複数の値を指定できます。
Dim status As Integer
Select Case status
Case 1, 2
MsgBox "処理可能です。"
Case 3, 4
MsgBox "確認が必要です。"
Case 9
MsgBox "処理済みです。"
Case Else
MsgBox "ステータスが不正です。"
End Select
この例では、statusが1または2の場合に同じ処理を実行します。
3または4の場合も同じ処理にまとめています。
既存VB6システムでは、次のように同じような処理が重複して書かれていることがあります。
Select Case status
Case 1
MsgBox "処理可能です。"
Case 2
MsgBox "処理可能です。"
Case 3
MsgBox "確認が必要です。"
Case 4
MsgBox "確認が必要です。"
End Select
このような場合、処理内容が完全に同じであれば、複数条件をまとめることでコードを読みやすくできます。
ただし、古いシステムを改修する場合は、見た目が似ている処理でも微妙に違うことがあります。メッセージは同じでも、内部で別の変数をセットしている場合もあります。
そのため、単純にまとめる前に、処理内容が本当に同じかを確認する必要があります。
範囲を指定するSelect Case
Select Caseでは、範囲指定もできます。
たとえば、金額によって処理を分ける場合です。
Dim kingaku As Long
Select Case kingaku
Case 0
MsgBox "金額が入力されていません。"
Case 1 To 9999
MsgBox "少額取引です。"
Case 10000 To 99999
MsgBox "通常取引です。"
Case Is >= 100000
MsgBox "高額取引です。"
Case Else
MsgBox "金額を確認してください。"
End Select
「1 To 9999」のように書くと、1以上9999以下の範囲を指定できます。
「Case Is >= 100000」のように比較条件を使うこともできます。
点数、金額、数量、件数、年齢、経過日数など、範囲で処理を分けたい場合に使えます。
ただし、範囲指定を使う場合は、条件の漏れや重複に注意が必要です。
たとえば、0をどう扱うのか、マイナス値が入る可能性はあるのか、上限を超えた値はどうするのかを考えておく必要があります。
業務システムでは、想定外の値が入ったときに処理が止まるより、Case Elseで異常値として扱えるようにしておく方が安全です。
Case Elseの役割
Case Elseは、どのCaseにも当てはまらなかった場合の処理です。
Select Caseを書くときは、できるだけCase Elseを入れておくことをおすすめします。
Select Case syoriKubun
Case "A"
Call SyoriA
Case "B"
Call SyoriB
Case "C"
Call SyoriC
Case Else
MsgBox "処理区分が不正です。"
End Select
Case Elseがない場合、想定外の値が入っても何も処理されずに通過してしまうことがあります。
これが業務システムでは問題になる場合があります。
たとえば、本来は登録・修正・削除のいずれかに分岐すべき処理で、想定外の区分が入ったにもかかわらず何も表示されないと、利用者は何が起きたのか分かりません。
また、後続処理だけが動いてしまい、中途半端な状態になることもあります。
既存VB6システムを改修するときに、新しい区分を追加する場合は、Case Elseの処理も確認しておく必要があります。
新しい区分がCase Elseに流れてエラー扱いになっていないか、逆にCase Elseで処理されてしまって問題が隠れていないかを確認します。
Select CaseとIf文の違い
Select CaseとIf文は、どちらも条件分岐に使えます。
ただし、向いている場面が違います。
Select Caseが向いているのは、1つの値に対して複数の候補を判定する場合です。
たとえば、処理区分、伝票区分、商品区分、顧客種別、ステータス、メニュー番号などです。
Select Case status
Case 0
MsgBox "未処理"
Case 1
MsgBox "処理中"
Case 2
MsgBox "完了"
Case Else
MsgBox "不明"
End Select
一方、If文が向いているのは、複数の条件を組み合わせて判定する場合です。
If zaikoSu > 0 And chumonSu <= zaikoSu Then
MsgBox "出荷可能です。"
Else
MsgBox "在庫を確認してください。"
End If
このように、在庫数と注文数を比較する、複数の条件をAndやOrで組み合わせる、画面項目の入力状態を複合的に判定するような場合はIf文の方が自然です。
Select Caseでも工夫すれば複雑な条件を書ける場合はありますが、無理にSelect Caseへ寄せる必要はありません。
大切なのは、後から読む人が分かりやすいかどうかです。
VB6の既存システムでは、担当者が退職している、仕様書が残っていない、長年改修を重ねているというケースがあります。そのようなシステムでは、コードの読みやすさが保守性に大きく関わります。
既存VB6システムでSelect Caseが使われる場面
既存のVB6システムでは、Select Caseに業務ルールが埋まっていることがあります。
たとえば、メニュー番号による画面呼び出しです。
Select Case menuNo
Case 1
frmCustomer.Show
Case 2
frmOrder.Show
Case 3
frmSeikyu.Show
Case 9
Unload Me
End Select
このような処理では、メニュー番号と画面の対応関係がコードの中に直接書かれています。
また、伝票区分による処理分岐もよくあります。
Select Case denpyoKubun
Case "01"
Call UriageTouroku
Case "02"
Call ShiireTouroku
Case "03"
Call HenpinTouroku
End Select
顧客種別や商品種別によって計算方法を変える場合もあります。
Select Case kokyakuKubun
Case "A"
waribikiRate = 0.1
Case "B"
waribikiRate = 0.05
Case Else
waribikiRate = 0
End Select
帳票出力やCSV出力でもSelect Caseは使われます。
Select Case outputKubun
Case "NOUHIN"
Call PrintNouhinsho
Case "SEIKYU"
Call PrintSeikyusho
Case "MITUMORI"
Call PrintMitsumorisho
Case Else
MsgBox "出力区分が不正です。"
End Select
このような分岐は、単なるプログラム上の条件分岐ではなく、実際の業務ルールそのものです。
そのため、既存VB6システムを改修する際には、Select Caseの中身を丁寧に確認する必要があります。
Select Caseを改修するときの注意点
Select Caseの改修では、「Caseを1つ追加すれば終わり」と考えない方がよいです。
たとえば、新しい伝票区分を追加する場合、該当するSelect CaseにCaseを追加するだけでは不十分なことがあります。
登録処理では区分を追加しても、検索処理、一覧表示、帳票出力、CSV出力、集計処理、削除処理など、別の場所にも同じ区分判定があるかもしれません。
VB6の既存システムでは、同じようなSelect Caseが複数のフォームやモジュールに分散していることがあります。
たとえば、伝票区分「04」を追加する場合、次のような箇所を確認する必要があります。
入力画面で選択できるか。
登録処理で保存できるか。
検索画面で表示されるか。
一覧画面で名称が表示されるか。
帳票出力に反映されるか。
CSV出力に含まれるか。
集計処理で対象になるか。
削除や取消処理で問題がないか。
このように、Select Caseは処理の入口だけでなく、業務全体に関係している場合があります。
また、既存の区分コードとの整合性も確認します。
「01」「02」「03」のようなコードが使われている場合、空いている番号を適当に追加すると、他システム連携や帳票側で意味がずれることがあります。
Case Elseの処理にも注意が必要です。
新しい区分を追加する前は、想定外の値としてCase Elseに流れていたものが、改修後は正式な区分として扱われる場合があります。そのとき、Case Elseで出していたエラーやログの扱いも見直す必要があります。
Select Caseが複雑化している場合の確認ポイント
長年使われているVB6システムでは、Select Caseが複雑化していることがあります。
Caseの数が非常に多い。
同じような分岐が複数箇所にある。
コメントと実際の処理が合っていない。
使われていないCaseが残っている。
Caseの中でさらにIf文やSelect Caseが入れ子になっている。
このような状態では、少し修正しただけでも思わぬ影響が出ることがあります。
たとえば、次のようなコードです。
Select Case syoriKubun
Case "01"
If tokuiSakiKubun = "A" Then
Call SyoriA1
Else
Call SyoriA2
End If
Case "02"
If kingaku > 100000 Then
Call SyoriB1
Else
Call SyoriB2
End If
Case "03"
Call SyoriC
Case Else
Call ErrorSyori
End Select
このように、Select Caseの中でさらにIf文が重なっている場合、処理の流れを追うのが難しくなります。
改修時には、まず分岐条件を整理することが重要です。
何の値で分岐しているのか。
それぞれのCaseが何を意味しているのか。
現在も使われているCaseなのか。
Caseごとの処理内容に重複はないか。
マスタや設定値として管理できるものではないか。
特に、区分コードごとの名称や処理内容がプログラム内に直接書かれている場合、今後の改修が増えるたびにコードを変更する必要があります。
場合によっては、Select Caseで直接分岐するのではなく、データベースのマスタや設定テーブルで管理する形に見直した方がよいこともあります。
VB6から移行する際のSelect Caseの扱い
VB6からVB.NET、C#、Webシステムなどへ移行する場合、Select Caseの扱いも確認が必要です。
単純な条件分岐であれば、新しい言語にも置き換えやすい場合があります。
ただし、既存VB6システムのSelect Caseには、業務上の判断ルールが含まれていることが多くあります。
たとえば、顧客種別ごとの割引率、伝票区分ごとの登録処理、ステータスごとの更新可否、帳票種類ごとの出力条件などです。
これらをそのまま新しいシステムに移すだけでよいとは限りません。
長年の運用で使われなくなった区分が残っている場合もあります。
過去の特例処理がそのまま残っている場合もあります。
同じ意味の処理が複数箇所に重複している場合もあります。
移行時には、Select Caseのコードを見ながら、業務ルールとして残すべきものと、整理できるものを分ける必要があります。
特に、区分コードやステータスは、画面表示、帳票、データベース、外部連携に関係していることがあります。
そのため、Select Caseを単なる文法として見るのではなく、「この分岐がどの業務判断を表しているのか」を確認することが大切です。
まとめ
VB6のSelect Caseは、値によって処理を分けるための条件分岐です。
処理区分、伝票区分、商品区分、顧客種別、ステータス、メニュー番号など、1つの値に対して複数の処理を分けたい場合に使いやすい構文です。
If文でも条件分岐はできますが、判定する値が決まっていて、候補ごとに処理を並べたい場合は、Select Caseの方がコードを読みやすくできます。
Select Caseでは、数値や文字列の分岐だけでなく、複数の値を1つのCaseで扱ったり、範囲を指定したりすることもできます。また、想定外の値を処理するためにCase Elseを入れておくことも重要です。
既存VB6システムを改修する場合は、Select CaseにCaseを追加するだけで済むとは限りません。同じ区分判定が別画面、別モジュール、帳票、CSV出力、集計処理などにも使われている可能性があります。
特に長年使われている業務システムでは、Select Caseの中に実際の業務ルールが埋まっていることがあります。
VB6システムの改修や移行を検討する際は、Select Caseの文法だけでなく、そこに書かれている区分コード、処理内容、影響範囲まで確認することが大切です。