#724 列挙型(列挙体)Enumの使い方 VBA

VBAのプログラムをコーディングしていく際、たとえば「MsgBox」関数を使うときであれば、「MsgBox "メッセージ文"」と入力し、さらに「,」をキーインすると自動的に次の引数の入力候補がリスト表示されます(VBEのオプションの”自動メンバー表示”がONの場合)。


「MsgBox」ではここで”vbOKOnly”や”vbOKCancel”などが表示されますが、実はこれらの値は「vbOKOnly」といった文字データではなく、それぞれが”数値”を表しています。たとえば「vbOKOnly → 0」、「vbOKCancel → 1」、「vbAbortRetryIgnore → 2」、「vbYesNoCancel → 3」です。
ですので、プログラムでも「vbOKOnly」ではなく「0」と記述してもよいのですが、数値だとそれぞれの意味合いが分かりづらいので、すぐにイメージできる文字表記で記述できるようAccess VBAに組み込まれています。


そのような定数表記の仕組みを自分で独自に作ることができます。それを作る際に使うのが『列挙型(列挙体)』で、VBAのコードでは「Enum」を使って表記します。
次の例では、役職を表す「Pos」という名前の列挙型でそれぞれの役職(の数値)をメンバーに設定、その利用例を示しています。

  1. まず列挙型を宣言します。それには、「Declarations」セクションに「Enum 任意の列挙型名 〜 End Enum」でくくって、それぞれのメンバーを「任意の定数名 = その値」という式で列挙します。

    Option Compare Database
    Option Explicit

    Enum Pos
      Director = 10   '部長
      Manager = 20    '課長
      Chief = 30      '係長
      Leader = 40     '班長
      General = 50    '一般
      Trainee = 55    '研修
    End Enum

  2. どこかのプロシージャにおいて、上記で宣言した「列挙型名」(ここでは”Pos”)、それに続いて「.」をキーインしてみます。
    それによってメンバーがリスト表示されますので、いずれかを選択することでその定数名をコードとして入力することができます。


    プログラム例:

    Sub EnumTest1()

      Debug.Print Pos.Director
      Debug.Print Pos.Manager
      Debug.Print Pos.Chief
      Debug.Print Pos.Leader

    End Sub

    実行例:


    またここでは次のような記述もできます。

    Debug.Print Director
    Debug.Print Manager
    Debug.Print Chief
    Debug.Print Leader

    MsgBox関数で定数が”vb”という文字で始まっているように、他とバッティングしないようなユニークなメンバー名にして、このような列挙型名を省略したスタイルの方が楽かもしれません。ただしそうでない場合は列挙型名も明示した方が確実です。


  3. 列挙型はプロシージャの引数の型としても利用することができます。
    次の例では「GetPosName」というプロシージャを作り、”Position”という名前で”列挙型の引数”を宣言しています。

    Function GetPosName(Position As Pos) As String

      Dim strRet As String

      Select Case Position
        Case Pos.Director
         strRet = "部長"
        Case Pos.Manager
          strRet = "課長"
        Case Pos.Chief
          strRet = "係長"
        Case Pos.Leader
          strRet = "班長"
        Case Pos.General
          strRet = "一般"
        Case Pos.Trainee
          strRet = "研修"
      End Select

      GetPosName = strRet

    End Function

    そして、そのプロシージャを呼び出すコードを書いてみます。するとその引数を入力する位置にきたときにやはり列挙型のメンバーが表示され、そこからいずれかを選択することができます。


    プログラム例:

    Sub EnumTest2()

      Debug.Print GetPosName(Director)
      Debug.Print GetPosName(Manager)
      Debug.Print GetPosName(Trainee)
      Debug.Print GetPosName(General)

    End Sub

    実行例:
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved