カテゴリー
Microsoft

【改善版】【Excel VBA】配列やコレクションの定数クラスを用意するコード2♪

の改善版ですわ♪

変更ポイント

  • プロパティのコメントから を削除した。
  • ディクショナリを生成するのは 1 つの関数にまとめ、抽象度を上げた。
  • 以前は定数ディクショナリの種類ごとに生成関数を定義していたのが、修正後は定義ディクショナリがいくつあっても 1 つのディクショナリ生成関数を使用するだけでよくなった。
  • 修正前のディクショナリ生成関数の流れ
    1. コンストラクタからディクショナリ生成関数を呼ぶ。
    2. ディクショナリ生成関数内で定数要素をディクショナリに追加していく。
    3. ディクショナリ生成関数内でディクショナリをプロパティに代入する。
  • 修正後のディクショナリ生成関数の流れ
    1. コンストラクタで定数を配列で定義する。
    2. それをディクショナリ生成関数に渡す。
    3. 返り値をプロパティに代入する。

VBA コード

''' <summary>
''' 定数クラス。
''' 配列などモジュールで定義できない定数を扱う。
''' </summary>

Option Explicit

Private mobjLevels As Object
Private mobjMartialArtsTypes As Object

''' <summary>
''' レベルのディクショナリ。キーのみ有り、値は無し。
''' </summary>
Public Property Get LEVELS() As Object
  Set LEVELS = mobjLevels
End Property

''' <summary>
''' 武術のディクショナリ。キーのみ有り、値は無し。
''' </summary>
Public Property Get MartialArtsTypes() As Object
  Set MartialArtsTypes = mobjMartialArtsTypes
End Property

''' <summary>
''' コンストラクタ
''' </summary>
Private Sub Class_Initialize()
  ' プロパティ設定
  ' レベル
  Dim varLevel As Variant: varLevel = Array("入門者", "初心者", "中級者", "上級者", "達人")
  Set mobjLevels = makeDictionary(varLevel)
  ' 武術
  Dim varMartialArtsType As Variant: varMartialArtsType = Array("空手", "柔道", "剣道", "忍術")
  Set mobjMartialArtsTypes = makeDictionary(varMartialArtsType)
End Sub

''' <summary>
''' 引数の配列からキーのみのディクショナリを生成して返します。
''' </summary>
''' <param name="varArray">ディクショナリに格納する Variant 型の配列</param>
''' <returns>キーのみ有り、値は無しのディクショナリ</returns>
Private Function makeDictionary(ByVal varArray As Variant) As Object
  Set makeDictionary = CreateObject("Scripting.Dictionary")
  Dim v As Variant
  For Each v In varArray
    Call makeDictionary.Add(Key:=v, Item:=Null)
  Next v
End Function
Option Explicit

Public Sub Test()
  Dim udtCst As CstC: Set udtCst = New CstC

  ' 定数クラスのディクショナリ定数のテスト
  ' レベル
  If udtCst.LEVELS.Exists("達人") Then
    Debug.Print "達人あり!"
  Else
    Debug.Print "達人なし><"
  End If

  If udtCst.LEVELS.Exists("黒帯") Then
    Debug.Print "黒帯あり!"
  Else
    Debug.Print "黒帯なし><"
  End If

  ' 武術
  If udtCst.MartialArtsTypes.Exists("セパタクロー") Then
    Debug.Print "セパタクローあり!"
  Else
    Debug.Print "セパタクローなし><"
  End If

  If udtCst.MartialArtsTypes.Exists("忍術") Then
    Debug.Print "忍術あり!"
  Else
    Debug.Print "忍術なし><"
  End If
End Sub

結果

達人あり!
黒帯なし><
セパタクローなし><
忍術あり!

おわりに

次のページが参考になりました。ありがとう存じます!

以上です。

コメントを残す