スコープと可視性について

スコープによって、別のプロシージャから変数定数、またはプロシージャを使用できるかどうかが決まります。 スコープには、プロシージャレベル、プライベートなモジュールレベル、パブリックなモジュールレベルの 3 つのレベルがあります。

変数のスコープは、宣言時に決定します。 異なるスコープの変数間で名前の競合エラーが発生しないように、すべての変数を明示的に宣言することをお勧めします。

プロシージャ レベルのスコープ

プロシージャ内に定義された変数または定数は、そのプロシージャの外部からは参照できません。 変数の宣言を含むプロシージャでのみ使用できます。 次の例では、最初のプロシージャで、文字列を含むメッセージ ボックスが表示されます。 変数 strMsg は最初のプロシージャのローカル変数なので、2 つ目のプロシージャでは空のメッセージ ボックスが表示されます。

Sub LocalVariable() 
 Dim strMsg As String 
 strMsg = "This variable can't be used outside this procedure." 
 MsgBox strMsg 
End Sub 
 
Sub OutsideScope() 
 MsgBox strMsg 
End Sub

プライベート モジュール レベルのスコープ

モジュール レベルの変数と定数は、モジュールの [宣言] セクションで定義できます。 モジュール レベルの変数は、パブリックまたはプライベートのどちらでもかまいません。 パブリック変数は、 プロジェクト内のすべてのモジュールのすべてのプロシージャで使用できます。プライベート変数は、そのモジュール内のプロシージャでのみ使用できます。 既定では、[宣言] セクションで Dim ステートメントを使用して宣言された変数のスコープはプライベートです。 ただし、変数の前に Private キーワードを付けることで、スコープはコード内で明らかです。

次の例では、モジュールで定義されているすべてのプロシージャで文字列変数 strMsg を使用できます。 2 番目のプロシージャが呼び出されると、ダイアログ ボックスに文字列変数 strMsg の内容が表示されます。

' Add following to Declarations section of module. 
Private strMsg As String 
 
Sub InitializePrivateVariable() 
 strMsg = "This variable can't be used outside this module." 
End Sub 
 
Sub UsePrivateVariable() 
 MsgBox strMsg 
End Sub

注:

標準モジュールまたはクラス モジュールのパブリック プロシージャは、任意の参照元プロジェクトから使用できます。 モジュール内のすべてのプロシージャのスコープを現在のプロジェクトに制限するには、モジュールの [宣言] セクションに Option Private Module ステートメントを追加します。 これにより、現在のプロジェクトの他のプロシージャではパブリックな変数およびプロシージャを引き続き使用できますが、参照元プロジェクトからは使用できなくなります。

パブリック モジュール レベルのスコープ

モジュールレベル変数をパブリックとして宣言すると、プロジェクト内のすべてのプロシージャで使用できます。 次の例では、文字列変数 strMsg は、プロジェクト内の任意のモジュールの任意のプロシージャで使用できます。

' Include in Declarations section of module. 
Public strMsg As String 

イベント プロシージャを除いて、すべてのプロシージャは既定でパブリックです。 Visual Basic でイベント プロシージャが作成されると、 Privateキーワード はプロシージャ宣言の前に自動的に挿入されます。 他のすべてのプロシージャでは、パブリックにしたくない場合は、 Private キーワードを使用してプロシージャを明示的に宣言する必要があります。

プロジェクトを参照する標準モジュールまたはクラス モジュールで定義されているパブリック プロシージャ、変数、および定数を使用します。 ただし、最初に、それらが定義されているプロジェクトへの参照を設定しておく必要があります。

フォーム モジュールやレポート モジュールなど、標準モジュールまたはクラス モジュール以外で定義されているパブリック プロシージャ、変数、定数は、参照プロジェクトでは使用できません。これらのモジュールは、それらが存在するプロジェクトに対してプライベートであるためです。

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。