カテゴリー
Microsoft

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

追記。改善版を投稿しました!抽象度を上げ、よりシンプルになりましたの♪


ポイント

  • 標準モジュールでは、Const は定義できるが、Const で配列を定義できない。
  • クラスモジュールでは、Const を定義できないが、コンストラクタで値をセットしてゲッターから取り出すようにすることで Const のような配列を定義できる。
  • したがって、様々なパターンの定数を網羅するには、標準モジュールで 1 つ、クラスモジュールで 1 つの、合計 2 つの定数用ファイルを用意する必要がある。
  • Excel 2013 で試した。
  • ファイル名に「Const」が使用できないことを考慮し、「ConstM」「CstM」や、「ConstC」「CstC」といったファイル名を付けると良いのではないかと思う。

経緯

配列の定数を用意しておき、

を参考に、Filter プロシージャを使って文字列が配列のどこかの要素と一致するかどうかのチェックをしたいと思いました。

しかし、標準モジュールに作った定数ファイルに追加しようとしましたら、エラーとなってしまいました><。

にあるように、VBA では実現できないようですの><。

そこで、定数用のクラスを別途用意し、そこに書くことで目的を実現するコードを残しておきますわ♪

VBA コード

定数クラス

  • CstC は ConstantClass の略
  • 配列ではなく、ディクショナリを使用することで、存在チェックを Exists プロシージャを呼ぶだけで済ませるようにした。
  • Filter プロシージャではチェック対象が「完全一致」ではなく、「一部含まれれば」チェック OK となるようなので、その弱点も克服している。
  • チェック用が目的のため、ディクショナリの値 (item) は不要で、キー (Key) のみ設定した。
Option Explicit

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

Private mobjLevels As Object

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

''' <summary>
''' コンストラクタ
''' </summary>
Private Sub Class_Initialize()
  ' プロパティ設定
  Call SetLevels
End Sub

Private Sub SetLevels()
  Set mobjLevels = CreateObject("Scripting.Dictionary")
  mobjLevels.Add Key:="入門者", item:=Null
  mobjLevels.Add Key:="初心者", item:=Null
  mobjLevels.Add Key:="中級者", item:=Null
  mobjLevels.Add Key:="上級者", item:=Null
  mobjLevels.Add Key:="達人", item:=Null
End Sub

使用例

Option Explicit

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

  If udtCst.LEVELS.Exists("達人") Then
    Debug.Print "チェックOK!"
  Else
    Debug.Print "チェックNG><"
  End If

  If udtCst.LEVELS.Exists("黒帯") Then
    Debug.Print "チェックOK!"
  Else
    Debug.Print "チェックNG><"
  End If
End Sub

結果

チェックOK!
チェックNG><

おわりに

ディクショナリは、わたくしたちの以前の投稿を参考にしております。少しずつ、VBA のやり方でできることが増えてきて嬉しいですの♪

以上です。

コメントを残す