VBA PrivateプロシージャとPublicプロシージャの違い

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

masahiro yoshida

Last updated on 7月 28, 2022

このチュートリアルでは、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プロシージャ)は、デフォルトではマクロウィンドウでワークブックのユーザーに表示されます。

vba publicvsprivate macro window

これらは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コードでは使用することができます。

vba publicvsprivate 2

引数を持つプロシージャ

サブプロシージャは引数を持つことができます。引数は、サブプロシージャへの入力です。

Sub Hello(strName as string)
   MsgBox "Hello" & strName
End Sub

サブプロシージャが引数を持っていても、引数を宣言する方法がないため、Public宣言されているかどうかにかかわらず、マクロウィンドウに表示されることはありません。

関数も、Public宣言されているかどうかにかかわらず、マクロウィンドウに表示されることはありません。

vba publicvsprivate macro window 2

VBAのPublic関数は、「ユーザー定義関数」(UDF)としてワークシートで直接使用することができます。これは基本的に、ワークシートで直接呼び出すことができるカスタム式です。これらは、「関数の挿入」ウィンドウの「ユーザー定義」カテゴリで見つけることができますし、セルに直接入力することもできます。

vba publicvsprivate excel function

VBAプロジェクトでモジュール間のプロシージャを使用する

Publicプロシージャは、VBAプロジェクト内のどのモジュールやフォームからも呼び出すことができます。 vba publicvsprivate call sub

異なるモジュールからPrivateプロシージャを呼び出そうとすると、エラーになります。(注:回避策はこの記事の最後を参照してください。)

vba publicvsprivate call private sub

注: クラスモジュール内のPublicプロシージャや変数は若干挙動が異なるので、この記事の範囲外です。

異なるモジュールでも、同じ名前のプロシージャを格納することができますが、両方ともPrivateであることが条件です。

もし、2つ以上のプロシージャーが同じ名前でPublicと宣言されている場合、コードを実行すると「名前が適切ではありません」コンパイルエラーが発生します。

vba publicvsprivate ambigious

Privateモジュール

デフォルトでは、モジュールはPublicです。 モジュールを非公開にするには、モジュールの先頭に以下のキーワードを記述します。

Option Private Module

モジュールをPrivateと宣言した場合、モジュール内のプロシージャはExcelユーザーからは見えなくなります。関数の場合は、関数の挿入ウィンドウには表示されませんが、ユーザーが関数名を知ってさえいれば、実際にはExcelシートで使用することができてしまいます!

vba publicvsprivate private function excel

サブプロシージャも、マクロウィンドウには表示されませんが、VBAプロジェクト内で使用することができます。

異なるモジュールからPrivateプロシージャにアクセスする

前述のとおり、Privateプロシージャは、他のコード モジュールから「通常の」方法ではアクセスすることはできません。しかし、VBA で使用できるApplication.Runコマンドを使用すれば、Privateプロシージャにアクセスすることができます。

次の3つのモジュールを考えてみましょう。

vba publicvsprivate multi modules

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 サブプロシージャを実行しようとすると、エラーが発生します。

vba publicvsprivate multi modules error

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Return to VBA Code Examples