VBAのPrivateでモジュールやプロシージャのアクセス範囲を制限する方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Privateの概要

アクセス制御 VBAの予約語

Private

概要 Private は、VBAのプロシージャ(Sub や Function)、変数、定数、またはモジュールのアクセス範囲を制限するために使用されます。

わかりやすく説明 Private は、「この変数やプロシージャはこのモジュール内だけで使えるよ!」という命令です。他のモジュールからアクセスできないように制限します。

  • 変数やプロシージャをモジュール内でのみ使用可能にする。
  • Public(公開)と対比され、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 GetProperty 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 に変更する。