VBA PrivateプロシージャとPublicプロシージャの違い
In this Article
このチュートリアルでは、VBAにおけるpublic宣言とprivate宣言の違いと、モジュールをprivateに指定する方法について説明します。
PublicサブプロシージャとPrivateサブプロシージャ
VBAのプロシージャ(SubやFunction)は、PrivateとPublicのどちらかで宣言することができます。Publicであれば、Excelのマクロウィンドウから見ることができ、VBAプロジェクト内のどこからでも呼び出すことができます。 Privateの場合、Excelのマクロウィンドウからは見えず、宣言したモジュール内でのみ使用可能です。(通常の方法で、他のモジュールからPrivateプロシージャにアクセスする方法は、この記事の最後を参照してください。)
Publicに定義した関数は、Excelの組み込み関数と同様に、Excelのワークシートから呼び出すことができます。
注: 変数と定数もPublicまたはPrivateにすることができます。
Excelマクロウィンドウ
Excelマクロ(ほとんどのVBAプロシージャ)は、デフォルトではマクロウィンドウでワークブックのユーザーに表示されます。
これらはPublicプロシージャとみなされます。プロシージャをPublicとして明示的に定義するには、Subステートメントの前に Public を追加します。
Public Sub HelloWorld()
MsgBox "Hello World"
End Sub
プロシージャをPublicとして明示的に定義しない場合でもPublicとみなされます。
プロシージャをPrivateと宣言するには、プロシージャのSubステートメントの前に Private を追加します。
Private Sub HelloEveryone()
MsgBox "Hello Everyone"
End Sub
2番目のプロシージャは、Excelのユーザーからはマクロウィンドウに表示されませんが、VBAコードでは使用することができます。
引数を持つプロシージャ
サブプロシージャは引数を持つことができます。引数は、サブプロシージャへの入力です。
Sub Hello(strName as string)
MsgBox "Hello" & strName
End Sub
サブプロシージャが引数を持っていても、引数を宣言する方法がないため、Public宣言されているかどうかにかかわらず、マクロウィンドウに表示されることはありません。
関数も、Public宣言されているかどうかにかかわらず、マクロウィンドウに表示されることはありません。
VBAのPublic関数は、「ユーザー定義関数」(UDF)としてワークシートで直接使用することができます。これは基本的に、ワークシートで直接呼び出すことができるカスタム式です。これらは、「関数の挿入」ウィンドウの「ユーザー定義」カテゴリで見つけることができますし、セルに直接入力することもできます。
VBAプロジェクトでモジュール間のプロシージャを使用する
Publicプロシージャは、VBAプロジェクト内のどのモジュールやフォームからも呼び出すことができます。
異なるモジュールからPrivateプロシージャを呼び出そうとすると、エラーになります。(注:回避策はこの記事の最後を参照してください。)
注: クラスモジュール内のPublicプロシージャや変数は若干挙動が異なるので、この記事の範囲外です。
異なるモジュールでも、同じ名前のプロシージャを格納することができますが、両方ともPrivateであることが条件です。
もし、2つ以上のプロシージャーが同じ名前でPublicと宣言されている場合、コードを実行すると「名前が適切ではありません」コンパイルエラーが発生します。
Privateモジュール
デフォルトでは、モジュールはPublicです。 モジュールを非公開にするには、モジュールの先頭に以下のキーワードを記述します。
Option Private Module
モジュールをPrivateと宣言した場合、モジュール内のプロシージャはExcelユーザーからは見えなくなります。関数の場合は、関数の挿入ウィンドウには表示されませんが、ユーザーが関数名を知ってさえいれば、実際にはExcelシートで使用することができてしまいます!
サブプロシージャも、マクロウィンドウには表示されませんが、VBAプロジェクト内で使用することができます。
異なるモジュールからPrivateプロシージャにアクセスする
前述のとおり、Privateプロシージャは、他のコード モジュールから「通常の」方法ではアクセスすることはできません。しかし、VBA で使用できるApplication.Runコマンドを使用すれば、Privateプロシージャにアクセスすることができます。
次の3つのモジュールを考えてみましょう。
Module 2はPublic サブプロシージャを持つPrivateモジュールであり、Module 3はPrivateサブプロシージャを持つPublicモジュールです。
Module1 では、Hello World を呼び出すことができます。先頭にあるOption Private Moduleは、サブプロシージャを呼び出すことを妨げるものではなく、サブプロシージャ を マクロウィンドウに表示させないようにするためのものだからです。
また、Callステートメントも必要ありません。これはコードを読みやすくするためのものです。
このコードは、次のようにすることもできます。
Sub CallHelloFromPrivate()
'Privateモジュールからサブを呼び出す
HelloWorld
End Sub
HelloWorldサブプロシージャは、VBAのApplication.Runコマンドで実行することもできます。
しかし、Module3 では、GoodMorningWorld プロシージャは、Private と宣言されています。 このプロシージャは、他のモジュールからCallステートメントなどの「通常の」手段で呼び出すことはできません。
他のモジュールからPrivate Subを実行するには、Application.Runコマンドを使用しなければなりません。
Sub CallGoodMorning()
'PublicモジュールからPrivateサブを実行する
Application.Run ("GoodMorningWorld")
End Sub
Application.Runコマンドを使用するときは、サブプロシージャ名を引用符で囲む必要があることに注意してください。
もし、Callステートメントを使ってGoodMorningWorld サブプロシージャを実行しようとすると、エラーが発生します。