INDEX
Privateの概要
アクセス制御 VBAの予約語 | ||
Private 概要 Private は、VBAのプロシージャ(Sub や Function)、変数、定数、またはモジュールのアクセス範囲を制限するために使用されます。 わかりやすく説明 Private は、「この変数やプロシージャはこのモジュール内だけで使えるよ!」という命令です。他のモジュールからアクセスできないように制限します。 |
||
|
Privateを使ったプロシージャの制限
Private を使って、特定のプロシージャをモジュール内でのみ使用できるようにする基本的な例です。
' このプロシージャは他のモジュールからは呼び出せない
Private Sub PrivateProcedure()
MsgBox "このプロシージャはこのモジュール内でのみ使用可能です。", vbInformation, "Privateの例"
End Sub
解説:
Private Sub PrivateProcedure()
と宣言することで、他のモジュールからのアクセスを禁止。- 同じモジュール内の別のプロシージャからは通常どおり呼び出せる。
Private 変数を使ってデータのカプセル化
モジュールレベルの変数を Private にすることで、外部からのアクセスを制限できます。
Private counter As Integer ' このモジュール内でのみ使用可能
Sub IncrementCounter()
counter = counter + 1
MsgBox "カウンターの値: " & counter, vbInformation, "カウンター更新"
End Sub
解説:
Private counter
はモジュール内でのみアクセス可能な変数。- 他のモジュールからはこの変数にアクセスできないため、安全に管理できる。
ExcelでのPrivateの活用例(ワークシートの操作)
Private を使って、特定のプロシージャをワークシート内でのみ使用可能にする例です。
' Sheet1モジュール内に配置
Private Sub UpdateSheet()
Range("A1").Value = "更新されました"
End Sub
解説:
Private Sub UpdateSheet()
にすることで、このプロシージャは Sheet1 モジュール内でのみ使用可能。- 他のモジュールからは直接呼び出せない。
Privateを使ったクラスモジュールのプロパティ管理
クラスモジュール内で Private を使い、プロパティのカプセル化を行う例です。
' クラスモジュール (Class1)
Private pName As String ' 外部から直接アクセス不可
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(value As String)
pName = value
End Property
解説:
pName
変数はPrivate
にして外部から直接アクセスできないようにする。Property Get
とProperty Let
を使って、安全に値を取得・設定できるようにする。
エラーを回避する方法
Private で定義したプロシージャや変数に外部からアクセスしようとするとエラーになるため、Public を適切に使うことが重要です。
Sub CallPrivateProcedure()
' PrivateProcedure は別のモジュールにあるため、エラーが発生
PrivateProcedure
End Sub
解説:
- 他のモジュールから
PrivateProcedure
を呼び出そうとするとコンパイルエラーが発生。 - 外部からアクセスが必要な場合は
Public
に変更する。
Privateの注意事項
- Private なプロシージャや変数は他のモジュールからアクセスできない: モジュール外から利用する場合は
Public
に変更する。 - クラスモジュールではプロパティのカプセル化に利用: 直接アクセスを禁止し、安全な方法でデータを管理する。
- フォームモジュールでも使用可能: フォーム内の処理を限定し、外部からの直接変更を防ぐ。
よくある質問
- Q: Private なプロシージャを外部から実行できますか?
- A: いいえ。他のモジュールから直接呼び出すことはできません。
Public
にするか、呼び出し用のPublicプロシージャを作成してください。 - Q: モジュールレベルの変数を Private にするメリットは?
- A: そのモジュール内だけで使用できるため、外部から誤って変更されるのを防げます。
- Q: クラスモジュールで Private を使うと何が変わりますか?
- A: プロパティのカプセル化ができ、外部から直接データを変更されないようにできます。
- Q: Private を使うとコードの管理が楽になりますか?
- A: はい。不要なアクセスを防ぎ、意図しない変更を減らせるため、コードの可読性や保守性が向上します。
VBAにおけるアクセス装飾子の比較
修飾子 | 範囲 | 使用可能な場所 | 備考 |
---|---|---|---|
Public |
プロジェクト全体 (他のモジュールやフォームからも可) |
標準モジュール クラスモジュール |
最も広いアクセス範囲を持つ |
Private | 定義されたモジュール内のみ | 標準モジュール クラスモジュール |
外部からは参照不可 |
Friend | 同一プロジェクト内の他のクラスモジュール | クラスモジュール | VBA独自で、他言語では「internal」に近い |
まとめ
- Private を使うと、プロシージャや変数のアクセスをモジュール内に限定できる。
- クラスモジュールでは、プロパティのカプセル化に活用される。
- 外部からの誤ったアクセスを防ぎ、コードの安全性を向上させる。
- 他のモジュールからアクセスが必要な場合は
Public
に変更する。