モジュール名と同名のプロシージャ
「モジュール」とは何なのか?
「Module1」プロシージャ問題
つらつらとTwitterを眺めていると、フォローしている方が
モジュール名とプロシージャ名を同じにしてCallで呼ぼうとするとエラーが出ます。
(中略)
「モジュールではなく、変数またはプロシージャ名を指定してください。」というコンパイルエラーが出ます。
とツイートしていた。
このとき
に
Private指定したFunctionはイミディエイトで呼び出せなくて不便だよな
みたいにボヤいたら、ExcelVBAer (id:x1xy2xyz3)さんから、
?Module1.hogeHoge(foo, bar)
みたいに書いたらPrivateでもイミディエイトで呼び出せるぜ!
とアドヴァイスをいただいたのを思い出して、
Call Module1.Module1
って書いたら呼び出せるんじゃね?
などと、テキトーなことをぶっこいたら、
できた!
とのこと。
まぐれ当たりにもほどがある。
まあ、この際だから、いろいろ実験しておこうと思った。
実験 その1
まず、Module1にModule1というプロシージャを置く。
いちおうコードも載っけとこう。
リスト1 標準モジュール
Public Sub Module1() Call makeUserSick("呼んだ?") End Sub
おなじみ、makeUserSickメソッドを呼び出しているだけw
このModule1プロシージャを、他の標準モジュールに次のコードを書いて呼び出すことを試みる。
リスト2 標準モジュール
Public Sub callTest() Call Module1 End Sub
実行してみると……
あ、ホントだ。確かにコンパイルエラーになる。
そこで、リスト2 標準モジュールの
Call Module1
の「Module1」のあとに「.」(ピリオド)を打ってみると、
このように、Intellisenseが働いて、「Module1」が選べるようになる。
リスト2を修正して次のようにする。
リスト3 標準モジュール
Public Sub callTest() Call Module1.Module1 End Sub
これで実行してみると、
ホントだ。ちゃんと実行できた。
実験 その2
ここでふと思った。
モジュールって"namespace"みたいなもんなんじゃね???
と。
そこで、別の標準モジュールに同じ「Module1」という名のプロシージャを置くことにした。
こんなふうに、「HTMLOperator」という名の標準モジュールに「Module1」というプロシージャを置く。
リスト4 標準モジュール
Public Sub Module1() Call makeUserSick("あら、また呼んだ?") End Sub
んで、リスト3に次のようにコードを追加。
リスト5 標準モジュール
Public Sub callTest() Call Module1.Module1 Call HTMLOperator.Module1 End Sub
コード入力中は、
こんなふうに、やはりIntellisenseが効く。
実行してみると……
普通に両方とも実行できた。
おわりに
まあ、同名のプロシージャが定義できたところで、あまり役に立ちそうな場面は思い浮かばない。結局いちいちモジュール名から指定しないといけないわけだから。
「namespace」というより「インスタンス化できないクラス」みたいなもんなのかなあ。