追記。改善版を投稿しました!抽象度を上げ、よりシンプルになりましたの♪
ポイント
- 標準モジュールでは、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 のやり方でできることが増えてきて嬉しいですの♪
以上です。