INDEX
Friendの概要
クラスモジュール内のメンバーを同じプロジェクト内の他のモジュールからアクセス可能にする VBAの予約語 | ||
Friend 概要 Friend ステートメントは、VBAのクラスモジュール内で使用されるアクセス修飾子で、同じプロジェクト内の他のモジュールからはアクセスできるが、外部のプロジェクトやインスタンス化されたオブジェクトからはアクセスできないメンバーを定義するために使用されます。 わかりやすく説明 クラス内のメンバーを、同じプロジェクト内でのみ使えるようにする修飾子。 |
||
|
Friendを使った基本的なクラス定義
以下の例では、Friend を使ってクラスモジュール内でメンバーを定義します。
' クラスモジュール(Class1)内に記述
Option Explicit
Friend Sub ShowMessage()
MsgBox "このメソッドは同じプロジェクト内のモジュールからのみ呼び出せます。"
End Sub
解説:
Friend
を使うことで、このメソッドは同じプロジェクト内でのみアクセス可能。- 外部のプロジェクトからはアクセスできない。
標準モジュールからFriendメソッドを呼び出す
標準モジュール(Module1)から Friend メソッドを呼び出す例です。
' 標準モジュール(Module1)内に記述
Sub TestFriend()
Dim obj As New Class1
obj.ShowMessage ' Friendメソッドは同じプロジェクト内ならアクセス可能
End Sub
解説:
- クラスモジュール
Class1
のShowMessage
を呼び出し。 - 同じプロジェクト内のため、Friend メソッドが利用可能。
FriendとPublicの違い
Friend は同じプロジェクト内でのみアクセスできるのに対し、Public は外部プロジェクトからもアクセス可能です。
' クラスモジュール(Class1)内に記述
Option Explicit
Public Sub PublicMethod()
MsgBox "これは外部プロジェクトからもアクセス可能。"
End Sub
Friend Sub FriendMethod()
MsgBox "これは同じプロジェクト内でのみアクセス可能。"
End Sub
解説:
PublicMethod
: どこからでもアクセス可能。FriendMethod
: 同じプロジェクト内でのみアクセス可能。
Excel VBAでのFriendの活用
Friend を使って Excel のワークブック管理クラスを作成する例です。
' クラスモジュール(WorkbookManager)内に記述
Option Explicit
Friend Sub SaveWorkbook(wb As Workbook)
wb.Save
MsgBox "ワークブックを保存しました: " & wb.Name
End Sub
このクラスを標準モジュールから使用する例:
' 標準モジュール(Module1)内に記述
Sub TestSaveWorkbook()
Dim mgr As New WorkbookManager
mgr.SaveWorkbook ThisWorkbook
End Sub
解説:
Friend
を使うことで、同じプロジェクト内の標準モジュールからアクセス可能。- 外部のプロジェクトからは
SaveWorkbook
メソッドを直接呼び出せない。
Friendの注意事項
- Friend はクラスモジュール内でのみ使用可能: 標準モジュールでは使用できない。
- 同じプロジェクト内でしかアクセスできない: 他のVBAプロジェクトからは使用できない。
- 外部プロジェクトへの公開を防ぐ: ライブラリとしてVBAプロジェクトを提供する際、内部メソッドを外部に見せたくない場合に有効。
よくある質問
- Q: Friend を標準モジュールで使えますか?
- A: いいえ。Friend はクラスモジュールでのみ使用可能です。
- Q: Friend を使うメリットは?
- A: 外部プロジェクトからのアクセスを制限しつつ、同じプロジェクト内では利用できるようにできます。
- Q: Public と Friend の使い分けは?
- A: 外部プロジェクトからも使わせたい場合は Public、同じプロジェクト内だけで使う場合は Friend を選びます。
まとめ
- Friend はクラスモジュール内のメンバーを同じプロジェクト内でのみアクセス可能にする。
- 外部プロジェクトからはアクセスできないため、内部ロジックを隠蔽できる。
- Excel VBAでのワークブック管理やカスタムクラスの設計に役立つ。
- 標準モジュールでは使用できず、クラスモジュール専用の修飾子である。