Sub ステートメント

Subプロシージャの本文を形成する名前、引数、コードを宣言します。

構文

[ Private | 公共 | フレンド ][ Static ] サブ [ ( arglist ) ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub

Sub ステートメントの構文には、次の指定項目があります。

指定項目 説明
Public 省略可能。 この Sub プロシージャは、すべてのモジュールにある他のすべてのプロシージャからアクセスできることを示します。 Option Private ステートメントを含むモジュールで使用されている場合、このプロシージャはプロジェクトの外部では使用できなくなります。
Private 省略可能。 この Sub プロシージャは、このプロシージャが宣言されたモジュール内にある他のプロシージャからのみアクセスできることを示します。
Friend 省略可能。 クラス モジュール内でのみ使用します。 この Sub プロシージャは、プロジェクト全体で参照可能ですが、オブジェクトのインスタンスのコントローラーからは参照できません。
Static 省略可能。 この Sub プロシージャのローカル変数が呼び出し間で保持されることを示します。 この Sub プロシージャの外側で宣言された変数は、このプロシージャ内で使用されていても、Static 属性の影響を受けません。
name 必須。 この Sub の名前です。標準の変数の名前付け規則に従ってください。
arglist 省略可能。 この Sub プロシージャの呼び出し時に渡される引数を表す変数のリストです。 複数の変数は、コンマで区切られます。
statements 省略可能。 この Sub プロシージャ内で実行するステートメントのグループです。

arglist 引数の構文と指定項目は次のとおりです。

[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ Astype ] [ =defaultvalue ]

指定項目 説明
Optional 省略可能。 引数が必須でないことを示すキーワードです。 このキーワードを使用した場合は、それ以降の arglist 内の引数もすべて省略可能にして、Optional キーワードを使用して宣言する必要があります。 ParamArray が使用されている場合は、どの引数にも Optional は使用できません。
ByVal 省略可能。 値渡しで引数が渡されることを示します。
ByRef 省略可能。 参照渡しで引数が渡されることを示します。 ByRef は、Visual Basic .NET とは異なり、VBA の既定値です。
ParamArray 省略可能。 最後の引数が Variant 要素の省略可能配列であることを示すために、arglist の最後の引数としてのみ使用されます。 ParamArray キーワードを使用することで、任意の数の引数を指定できます。 ParamArray は、ByValByRef、または Optional と併用することはできません。
varname 必須。 引数を表す変数の名前です。標準の変数の名前付け規則に従ってください。
type 省略可能。 プロシージャに渡す引数のデータ型です。ByteBooleanIntegerLongCurrencySingleDoubleDecimal (現在サポートされていません)、DateString (可変長のみ)、ObjectVariant、または特定のオブジェクト型を指定できます。 パラメーターが Optional でない場合は、ユーザー定義型の指定も可能です。
defaultvalue 省略可能。 任意の定数または定数です。 Optional のパラメーターにのみ有効です。 Object 型の場合、明示的な既定値は Nothing のみが有効です。

解説

PublicPrivate、または Friend を使用した明示的な指定がない場合、Sub プロシージャは既定でパブリックになります。

Static が使用されていない場合、ローカル変数の値は呼び出し間で保持されません。

Friend キーワードは、クラス モジュールでのみ使用できます。 ただし、Friend プロシージャは、プロジェクトに含まれるどのモジュール内のプロシージャからでもアクセスできます。 Friend プロシージャは、その親クラスのタイプ ライブラリには表示されません。また、Friend プロシージャは、遅延バインディングすることもできません。

Sub プロシージャは再帰できるため、特定のタスクを実行するために自身の呼び出しが可能です。 ただし、再帰はスタック オーバーフローの原因になることがあります。 通常、再帰的な Sub プロシージャには Static キーワードを使用しません。

すべての実行可能なコードは、プロシージャ内に配置する必要があります。 Sub プロシージャは、別の Sub プロシージャ、Function プロシージャ、または Property プロシージャの内側で定義することはできません。

Exit Sub キーワードにより、Sub プロシージャは即時終了します。 プログラムの実行は、その Sub プロシージャを呼び出したステートメントの次のステートメントから続行されます。 Exit Sub ステートメントは、Sub プロシージャ内の任意の場所にいくつでも配置できます。

Function プロシージャと同様に、Sub プロシージャは個別のプロシージャとして、引数を取り、一連のステートメントを実行し、その引数の値を変更できます。 ただし、値を返す Function プロシージャとは異なり、Sub プロシージャは式内では使用できません。

Sub プロシージャは、そのプロシージャの名前と、それに続く引数のリストを使用して呼び出します。 Sub プロシージャの具体的な呼び出し方法については、Call ステートメントを参照してください。

Sub プロシージャで使用される変数は、そのプロシージャ内で明示的に宣言されている変数と、明示的に宣言されていない変数の 2 つのカテゴリに分類できます。 プロシージャ内で Dim などのステートメントを使用して明示的に宣言されている変数は、常にプロシージャに対してローカルになります。 明示的に宣言されることなくプロシージャ内で使用されている変数もローカルになります。ただし、そのプロシージャの外側の上位レベルで明示的に宣言されている場合を除きます。

プロシージャでは、そのプロシージャ内で明示的に宣言していない変数を使用できますが、モジュール レベルで同じ名前が定義されているものがあると、名前の競合が発生することがあります。 別のプロシージャ、定数、または変数と名前が同じ未宣言の変数をプロシージャで参照すると、そのプロシージャは、そのモジュール レベルの名前を参照していると見なされます。 この種類の競合を回避するために、変数は明示的に宣言します。 Option Explicit ステートメントを使用して、変数の明示的な宣言を強制します。

注:

Sub プロシージャを開始または終了するために、GoSubGoTo、または Return は使用できません。

この例では、Sub ステートメントを使用して、Sub プロシージャの名前、引数、および本文を形成するコードを定義します。

' Sub procedure definition. 
' Sub procedure with two arguments. 
Sub SubComputeArea(Length, TheWidth) 

   Dim Area As Double ' Declare local variable. 

   If Length = 0 Or TheWidth = 0 Then 
      ' If either argument = 0. 
      Exit Sub ' Exit Sub immediately. 
   End If 
   
   Area = Length * TheWidth ' Calculate area of rectangle. 
   Debug.Print Area ' Print Area to Debug window. 

End Sub

関連項目

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

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