アクセス修飾子「Friend」とは?

アクセス修飾子「Friend」とは?

勘違いから、マヌケな記事を書いてしまった。

訂正記事を書くのがめんどくさいので(←コラ!)、バッサリ削除して書き直す。

アクセス修飾子「Friend」は、入門書の類にはまず出てこない。

名前が「Friend」なのに、友達がいないみたいでかわいそうだ。

FriendとPublicはどう違うのか

とりあえず、個人用マクロブック(プロジェクト名「PersonalUtils」)のSheet1オブジェクトモジュールに、次の二つのメソッドを置いてみた。

リスト1 PersonalUtils.Sheet1モジュール
Option Explicit

Friend Sub showMessageProtected()
  Call MsgBox("ち~んw")
End Sub

Public Sub showMessagePublic()
  Call MsgBox("ち~んw")
End Sub

メソッドの内容はどうでもいいので、なげやりなものにしている。

一つ目のshowMessageProtectedメソッドがFriend指定、二つ目のshowMessagePublicメソッドがPublic指定。

呼び出す

で、こうして作成した個人用マクロブックのSheet1モジュール上のメソッドを呼び出そうと試みる。

ちなみに、プロジェクトエクスプローラーはこの状態。

f:id:akashi_keirin:20190621211720j:plain

「シートモジュール活用その2.xlsm」の標準モジュールから呼び出すのだ。

f:id:akashi_keirin:20190621211757g:plain

しかし、このように、Publicメソッドであっても呼び出すことができない。

参照設定していないからである。

そこで、

f:id:akashi_keirin:20190621211723j:plain

このように参照設定する。

再度、挑戦。

f:id:akashi_keirin:20190621211725g:plain

今度は、Intellisenseが働いている!

よく見ると、ヒントが表示されるのはPublic指定のshowMessagePublicメソッドだけで、Friend指定のshowMessageProtectedの方は表示されていない。

呼び出し用プロシージャを実行してみる。

f:id:akashi_keirin:20190621211734g:plain

このように、Friend指定の方は呼び出すことができない。

一方、

f:id:akashi_keirin:20190621211744g:plain

Public指定の方は、呼び出すことができた。

おわりに

別プロジェクトからオブジェクトモジュールのメソッドを呼び出したり、プロパティを参照したりする場面自体、VBAでは想定しにくいので、いまいち使いどころがよくわからないが、Publicでもなく、Privateでもないこの振る舞いを理解しておくと、いづれ何かの機会に役立つかもしれない???