Enumの名前の重なり
VBAでEnumを使い始めの頃、その当時はPublicとPrivateの使い分けがいい加減だったこともあり、ずいぶん名前の重なりに苦労した。
そこで、最近は列挙体名、要素名それぞれにシンプルなルールに基づいて接頭辞を付け、極力重複が発生しないようにしている。
しかし、ふと思った。「Privateの場合はどうなんだ……?」。
やってみた。
まったく同じEnumを二つのモジュールに搭載する
読んで字の如し。まったく同じEnumを二つのモジュールに搭載し、それぞれそのEnumを利用するメソッドも搭載してみた。
リスト1 標準モジュール M02Sub1
Option Explicit Private Enum Hoge aho boke kasu End Enum Public Sub showMessage() Dim msg As String msg = getMessage(aho) Call MsgBox(msg) End Sub Private Function getMessage( _ ByVal msgCode As Hoge) As String Dim ret As String Select Case msgCode Case aho: ret = "アホ1号" Case boke: ret = "ボケ1号" Case kasu: ret = "カス1号" End Select getMessage = ret End Function
リスト2 標準モジュール M03Sub2
Option Explicit Private Enum Hoge aho boke kasu End Enum Public Sub showMessage() Dim msg As String msg = getMessage(aho) Call MsgBox(msg) End Sub Private Function getMessage( _ ByVal msgCode As Hoge) As String Dim ret As String Select Case msgCode Case aho: ret = "アホ2号" Case boke: ret = "ボケ2号" Case kasu: ret = "カス2号" End Select getMessage = ret End Function
見ての通り、ほぼ全く同じモジュールの内容。
異なるのはそれぞれのgetMessageの返り値の設定部分のみ。
使ってみる
それぞれのモジュールを利用するコードを次のように書く。
リスト3 標準モジュール M01Main
Option Explicit Private Sub test() Call M02Sub1.showMessage Call M03Sub2.showMessage End Sub
ご覧のように、それぞれのモジュール(標準モジュールM02Sub1とM03Sub2)のshowMessageメソッドを呼び出しているだけ。
同じ名前のメソッドでも、モジュール名から指定すればコンパイルエラーにならずに呼び出すことができる。
参考
実行結果

当然こうなる。何の問題もない。
おわりに
以上述べたとおり、PrivateのEnumにおいては、名前の重なりとか全然気にしなくてもよい……と言いたいところなのだが、

この挙動を見ていると、やはり列挙体名の方はともかく、要素名は接頭辞を付けるなどして独自のものにした方が良さそうだ。
それにしても、なぜ「name」だとコンパイルエラーになって「value」とか「address」ならオッケーなのだろう……?