モジュール名と同名のプロシージャ

「モジュール」とは何なのか?

「Module1」プロシージャ問題

つらつらとTwitterを眺めていると、フォローしている方が

モジュール名とプロシージャ名を同じにしてCallで呼ぼうとするとエラーが出ます。
(中略)
「モジュールではなく、変数またはプロシージャ名を指定してください。」というコンパイルエラーが出ます。

とツイートしていた。

このとき

akashi-keirin.hatenablog.com



Private指定したFunctionはイミディエイトで呼び出せなくて不便だよな

みたいにボヤいたら、ExcelVBAer (id:x1xy2xyz3)さんから、

?Module1.hogeHoge(foo, bar)

みたいに書いたらPrivateでもイミディエイトで呼び出せるぜ!

とアドヴァイスをいただいたのを思い出して、

Call Module1.Module1

って書いたら呼び出せるんじゃね?

などと、テキトーなことをぶっこいたら、

できた!

とのこと。

まぐれ当たりにもほどがある。

まあ、この際だから、いろいろ実験しておこうと思った。

実験 その1

まず、Module1にModule1というプロシージャを置く。

f:id:akashi_keirin:20180113131016j:plain

いちおうコードも載っけとこう。

リスト1 標準モジュール
Public Sub Module1()
  Call makeUserSick("呼んだ?")
End Sub

おなじみ、makeUserSickメソッドを呼び出しているだけw

このModule1プロシージャを、他の標準モジュールに次のコードを書いて呼び出すことを試みる。

スト2 標準モジュール
Public Sub callTest()
  Call Module1
End Sub

実行してみると……

f:id:akashi_keirin:20180113131028j:plain

あ、ホントだ。確かにコンパイルエラーになる。

そこで、リスト2 標準モジュール

Call Module1

の「Module1」のあとに「.」(ピリオド)を打ってみると、

f:id:akashi_keirin:20180113131045j:plain

このように、Intellisenceが働いて、「Module1」が選べるようになる。

リスト2を修正して次のようにする。

リスト3 標準モジュール
Public Sub callTest()
  Call Module1.Module1
End Sub

これで実行してみると、

f:id:akashi_keirin:20180113131101j:plain

ホントだ。ちゃんと実行できた。

実験 その2

ここでふと思った。

モジュールって"namespace"みたいなもんなんじゃね???

と。

そこで、別の標準モジュールに同じ「Module1」という名のプロシージャを置くことにした。

f:id:akashi_keirin:20180113131109j:plain

こんなふうに、「HTMLOperator」という名の標準モジュールに「Module1」というプロシージャを置く。

リスト4 標準モジュール
Public Sub Module1()
  Call makeUserSick("あら、また呼んだ?")
End Sub

んで、リスト3に次のようにコードを追加。

リスト5 標準モジュール
Public Sub callTest()
  Call Module1.Module1
  Call HTMLOperator.Module1
End Sub

コード入力中は、

f:id:akashi_keirin:20180113131119j:plain

こんなふうに、やはりIntellisenseが効く。

実行してみると……

f:id:akashi_keirin:20180113131128j:plain

f:id:akashi_keirin:20180113131138j:plain

普通に両方とも実行できた。

おわりに

まあ、同名のプロシージャが定義できたところで、あまり役に立ちそうな場面は思い浮かばない。結局いちいちモジュール名から指定しないといけないわけだから。

「namespace」というより「インスタンス化できないクラス」みたいなもんなのかなあ。

@akashi_keirin on Twitter