VBAのPublicでプロシージャや変数をモジュール間で共有する方法をわかりやすく解説

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

Publicの概要

アクセス制御 VBAの予約語

Public

概要 Public は、VBAのプロシージャ(Sub や Function)、変数、定数、またはオブジェクトをモジュール間で共有できるようにするために使用されます。

わかりやすく説明 Public は、「この変数やプロシージャは、どこからでも使えるようにするよ!」という命令です。他のモジュールやフォームからもアクセスできるようになります。

  • Public で宣言された変数やプロシージャは、他のモジュールからも使用可能。
  • 変数をモジュールレベルで宣言すると、グローバル変数として扱われる。
  • モジュール間のデータ共有や、汎用的なプロシージャの定義に役立つ。

Publicを使ったプロシージャの共有

Public を使って、異なるモジュールから呼び出せるプロシージャを作成する例です。

' Module1
Public Sub ShowMessage()
    MsgBox "このメッセージは他のモジュールからも呼び出せます。", vbInformation, "Publicの例"
End Sub

解説:

  • Public Sub ShowMessage() にすることで、他のモジュールからも使用可能。
  • 別のモジュールで ShowMessage を呼び出すことができる。

Public 変数を使ってデータを共有する

Public 変数を使うと、異なるモジュール間でデータを共有できます。

' Module1
Public counter As Integer ' 他のモジュールでも使用可能

Sub IncrementCounter()
    counter = counter + 1
    MsgBox "カウンターの値: " & counter, vbInformation, "カウンター更新"
End Sub

解説:

  • Public counter はグローバル変数として扱われ、他のモジュールでも使用可能。
  • どのモジュールからでも counter の値を変更・参照できる。

ExcelでのPublicの活用例(ワークシートを共有)

Public を使って、特定のワークシートオブジェクトを他のモジュールでも使用可能にする例です。

' Module1
Public ws As Worksheet ' ワークシートオブジェクトを共有

Sub SetWorksheet()
    Set ws = ThisWorkbook.Sheets("Sheet1")
End Sub

' Module2
Sub UseWorksheet()
    If ws Is Nothing Then
        MsgBox "ワークシートがセットされていません。", vbExclamation, "エラー"
    Else
        ws.Range("A1").Value = "Public変数で共有"
    End If
End Sub

解説:

  • Module1 で ws を Public 変数として宣言し、Sheet1 のオブジェクトをセット。
  • Module2 で ws を使ってセルの値を変更可能。

クラスモジュールでのPublicプロパティの利用

クラスモジュールで Public を使うと、外部からプロパティを直接取得・設定できます。

' クラスモジュール (Class1)
Public Name As String ' 直接アクセス可能なプロパティ

解説:

  • Public Name にすることで、外部から obj.Name = "テスト" のように直接設定可能。
  • 安全性を考慮する場合は、Property GetProperty Let を使うのが推奨される。

エラーを回避する方法

Public 変数を使う際に、適切な初期化を行わないとエラーが発生する可能性があります。

Public ws As Worksheet ' 他のモジュールでも使用可能

Sub CheckWorksheet()
    If ws Is Nothing Then
        MsgBox "ワークシートがセットされていません。", vbExclamation, "エラー"
    Else
        MsgBox "ワークシートは有効です。"
    End If
End Sub

解説:

  • Public 変数 ws は、Set しないと Nothing のまま。
  • 利用前に Is Nothing でチェックし、エラーを回避する。

Publicの注意事項

  • Public 変数は他のモジュールから自由にアクセスできる: 意図しない変更を防ぐため、適切に管理する。
  • クラスモジュールのプロパティには Property を推奨: クラスのデータを適切に管理するため、直接アクセス可能な Public 変数は避けるのが望ましい。
  • モジュールレベルで宣言するとグローバル変数になる: 大規模なプログラムでは乱用を避け、必要な場合のみ使用する。

よくある質問

Q: Public なプロシージャはどこからでも実行できますか?
A: はい。他のモジュールやフォームからでも実行可能です。
Q: Public 変数をフォームモジュールで使えますか?
A: はい。ただし、フォームが破棄されると変数の値もリセットされるため注意が必要です。
Q: Public 変数の値は VBA の終了後も保持されますか?
A: いいえ。VBA の実行が終了すると、Public 変数もリセットされます。
Q: クラスモジュールで Public 変数を使うのは問題ですか?
A: 可能ですが、推奨されません。Property GetProperty Let を使う方が安全です。

まとめ

  • Public を使うと、プロシージャや変数をモジュール間で共有できる。
  • モジュールレベルの Public 変数はグローバル変数として扱われる。
  • クラスモジュールのプロパティとして Public 変数を使う場合は注意が必要。
  • 適切なエラーチェックを行い、意図しない変更を防ぐことが重要。