Sub ステートメント (Visual Basic)Sub Statement (Visual Basic)

Sub プロシージャを定義する名前、パラメーター、およびコードを宣言します。Declares the name, parameters, and code that define a Sub procedure.


[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Sub ]
    [ statements ]
End Sub


  • attributelist

    省略可。Optional. 属性リスト」を参照してください。See Attribute List.

  • Partial

    省略可。Optional. 部分メソッドの定義を示します。Indicates definition of a partial method. 部分メソッド」を参照してください。See Partial Methods.

  • accessmodifier

    省略可。Optional. 次のいずれかになります。Can be one of the following:

    Visual Basic でのアクセス レベル」を参照してください。See Access levels in Visual Basic.

  • proceduremodifiers

    省略可。Optional. 次のいずれかになります。Can be one of the following:

  • Shared

    省略可。Optional. Shared」を参照してください。See Shared.

  • Shadows

    省略可。Optional. Shadows」を参照してください。See Shadows.

  • Async

    省略可。Optional. Async」を参照してください。See Async.

  • name

    必須。Required. プロシージャの名前。Name of the procedure. 宣言された要素の名前」を参照してください。See Declared Element Names. クラスのコンストラクタープロシージャを作成するには、Sub プロシージャの名前を New キーワードに設定します。To create a constructor procedure for a class, set the name of a Sub procedure to the New keyword. 詳細については、「オブジェクトの有効期間: オブジェクトの作成方法と破棄方法」を参照してください。For more information, see Object Lifetime: How Objects Are Created and Destroyed.

  • typeparamlist

    省略可。Optional. ジェネリックプロシージャの型パラメーターのリスト。List of type parameters for a generic procedure. 型リストを参照してください。See Type List.

  • parameterlist

    省略可。Optional. このプロシージャのパラメーターを表すローカル変数名の一覧。List of local variable names representing the parameters of this procedure. パラメーターリスト」を参照してください。See Parameter List.

  • Implements

    省略可。Optional. このプロシージャが1つ以上の Sub プロシージャを実装することを示します。各プロシージャは、このプロシージャのクラスまたは構造体を含むインターフェイスで定義されています。Indicates that this procedure implements one or more Sub procedures, each one defined in an interface implemented by this procedure's containing class or structure. Implements ステートメント」を参照してください。See Implements Statement.

  • implementslist

    Implements を指定する場合は、必ず指定します。Required if Implements is supplied. 実装される Sub プロシージャのリストです。List of Sub procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    implementedprocedure の構文と指定項目は次のとおりです。Each implementedprocedure has the following syntax and parts:


    要素Part 説明Description
    interface 必須。Required. このプロシージャのクラスまたは構造体によって実装されるインターフェイスの名前。Name of an interface implemented by this procedure's containing class or structure.
    definedname 必須。Required. interface の中でプロシージャを定義するために使用する名前。Name by which the procedure is defined in interface.
  • Handles

    省略可。Optional. このプロシージャが1つ以上の特定のイベントを処理できることを示します。Indicates that this procedure can handle one or more specific events. Handles」を参照してください。See Handles.

  • eventlist

    Handles を指定する場合は、必ず指定します。Required if Handles is supplied. このプロシージャが処理するイベントの一覧です。List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    eventspecifier の構文と指定項目は次のとおりです。Each eventspecifier has the following syntax and parts:


    要素Part 説明Description
    eventvariable 必須。Required. イベントを発生させるクラスまたは構造体のデータ型で宣言されたオブジェクト変数。Object variable declared with the data type of the class or structure that raises the event.
    event 必須。Required. このプロシージャが処理するイベントの名前。Name of the event this procedure handles.
  • statements

    省略可。Optional. このプロシージャ内で実行するステートメントのブロック。Block of statements to run within this procedure.

  • End Sub

    このプロシージャの定義を終了します。Terminates the definition of this procedure.


すべての実行可能コードは、プロシージャ内になければなりません。All executable code must be inside a procedure. 呼び出し元のコードに値を返さないようにする場合は、Sub プロシージャを使用します。Use a Sub procedure when you don't want to return a value to the calling code. 値を返す場合は、Function プロシージャを使用します。Use a Function procedure when you want to return a value.

Sub プロシージャの定義Defining a Sub Procedure

Sub プロシージャは、モジュールレベルでのみ定義できます。You can define a Sub procedure only at the module level. したがって、サブプロシージャの宣言コンテキストは、クラス、構造体、モジュール、またはインターフェイスにする必要があり、ソースファイル、名前空間、プロシージャ、またはブロックにすることはできません。The declaration context for a sub procedure must, therefore, be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。For more information, see Declaration Contexts and Default Access Levels.

Sub プロシージャは、既定でパブリックアクセスになります。Sub procedures default to public access. アクセス修飾子を使用して、アクセスレベルを調整できます。You can adjust their access levels by using the access modifiers.

プロシージャが Implements キーワードを使用している場合、含んでいるクラスまたは構造体には、その Class または Structure ステートメントの直後にある Implements ステートメントが含まれている必要があります。If the procedure uses the Implements keyword, the containing class or structure must have an Implements statement that immediately follows its Class or Structure statement. Implements ステートメントには、implementslistで指定されている各インターフェイスを含める必要があります。The Implements statement must include each interface that's specified in implementslist. ただし、インターフェイスが Sub (definedname) を定義する際には、このプロシージャの名前 (name) と一致する必要はありません。However, the name by which an interface defines the Sub (in definedname) doesn't have to match the name of this procedure (in name).

Sub プロシージャからの戻りReturning from a Sub Procedure

Sub プロシージャが呼び出し元のコードに戻ると、ステートメントを呼び出したステートメントの後のステートメントで実行が続行されます。When a Sub procedure returns to the calling code, execution continues with the statement after the statement that called it.

次の例は、Sub プロシージャからの戻り値を示しています。The following example shows a return from a Sub procedure.

Sub mySub(ByVal q As String)
End Sub

Exit Sub ステートメントおよび Return ステートメントを行うと、Sub プロシージャからすぐに終了します。The Exit Sub and Return statements cause an immediate exit from a Sub procedure. プロシージャ内の任意の場所で任意の数の Exit Sub および Return ステートメントを使用できます。また、Exit SubReturn のステートメントを混在させることができます。Any number of Exit Sub and Return statements can appear anywhere in the procedure, and you can mix Exit Sub and Return statements.

Sub プロシージャの呼び出しCalling a Sub Procedure

Sub プロシージャを呼び出すには、ステートメントでプロシージャ名を使用し、その名前の後にかっこで囲んだ引数リストを指定します。You call a Sub procedure by using the procedure name in a statement and then following that name with its argument list in parentheses. かっこを省略できるのは、引数を指定しない場合のみです。You can omit the parentheses only if you don't supply any arguments. ただし、常にかっこを含めると、コードが読みやすくなります。However, your code is more readable if you always include the parentheses.

Sub プロシージャと Function プロシージャは、パラメーターを持つことができ、一連のステートメントを実行できます。A Sub procedure and a Function procedure can have parameters and perform a series of statements. ただし、Function プロシージャは値を返し、Sub プロシージャは返しません。However, a Function procedure returns a value, and a Sub procedure doesn't. したがって、式の中で Sub プロシージャを使用することはできません。Therefore, you can't use a Sub procedure in an expression.

Sub プロシージャを呼び出すときに Call キーワードを使用することはできますが、ほとんどの場合、そのキーワードは推奨されません。You can use the Call keyword when you call a Sub procedure, but that keyword isn't recommended for most uses. 詳細については、「Call ステートメント」を参照してください。For more information, see Call Statement.

Visual Basic は、内部効率を向上させるために算術式を再配置することがあります。Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. そのため、引数リストに他のプロシージャを呼び出す式が含まれている場合は、それらの式が特定の順序で呼び出されると想定しないでください。For that reason, if your argument list includes expressions that call other procedures, you shouldn't assume that those expressions will be called in a particular order.

非同期サブプロシージャAsync Sub Procedures

非同期機能を使用すると、明示的なコールバックを使用したり、複数の関数やラムダ式にコードを手動で分割したりせずに、非同期関数を呼び出すことができます。By using the Async feature, you can invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

プロシージャにAsync修飾子を指定した場合は、プロシージャでAwait演算子を使用できます。If you mark a procedure with the Async modifier, you can use the Await operator in the procedure. コントロールが Async プロシージャ内の Await 式に到達すると、コントロールは呼び出し元に戻り、待機中のタスクが完了するまで、プロシージャの進行状況は中断されます。When control reaches an Await expression in the Async procedure, control returns to the caller, and progress in the procedure is suspended until the awaited task completes. タスクが完了すると、プロシージャで実行を再開できます。When the task is complete, execution can resume in the procedure.


Async プロシージャは、まだ完了していない最初の待機中のオブジェクトが検出された場合、または Async プロシージャの最後に到達した場合に、呼び出し元に戻ります。An Async procedure returns to the caller when either the first awaited object that’s not yet complete is encountered or the end of the Async procedure is reached, whichever occurs first.

Function ステートメントAsync 修飾子でマークすることもできます。You can also mark a Function Statement with the Async modifier. Async 関数は、Task<TResult> または Taskの戻り値の型を持つことができます。An Async function can have a return type of Task<TResult> or Task. このトピックの後半の例では、Task<TResult>の戻り値の型を持つ Async 関数を示します。An example later in this topic shows an Async function that has a return type of Task<TResult>.

AsyncSub プロシージャは、主に、値を返すことができないイベントハンドラーに使用されます。Async Sub procedures are primarily used for event handlers, where a value can't be returned. Async Sub プロシージャは待機できません。また、AsyncSub プロシージャの呼び出し元は、Sub プロシージャがスローする例外をキャッチできません。An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that the Sub procedure throws.

Async プロシージャでByRefパラメーターを宣言することはできません。An Async procedure can't declare any ByRef parameters.

Async の手順の詳細については、「async および Await を使用した非同期プログラミング」、「非同期プログラムでの制御フロー」、および「非同期の戻り値の型」を参照してください。For more information about Async procedures, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.


次の例では、Sub ステートメントを使用して、Sub プロシージャの本体を形成する名前、パラメーター、およびコードを定義します。The following example uses the Sub statement to define the name, parameters, and code that form the body of a Sub procedure.

Sub ComputeArea(ByVal length As Double, ByVal width As Double)
    ' Declare local variable.
    Dim area As Double
    If length = 0 Or width = 0 Then
        ' If either argument = 0 then exit Sub immediately.
        Exit Sub
    End If
    ' Calculate area of rectangle.
    area = length * width
    ' Print area to Immediate window.
End Sub


次の例では、DelayAsync は、戻り値の型が Task<TResult>Async Function です。In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync には、整数を返す Return ステートメントがあります。DelayAsync has a Return statement that returns an integer. したがって、DelayAsync の関数宣言には、Task(Of Integer)の戻り値の型を指定する必要があります。Therefore, the function declaration of DelayAsync must have a return type of Task(Of Integer). 戻り値の型が Task(Of Integer)ので、次のステートメントに Dim result As Integer = Await delayTask示すように、DoSomethingAsyncAwait 式を評価すると整数が生成されます。Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer, as the following statement shows: Dim result As Integer = Await delayTask.

startButton_Click プロシージャは、Async Sub プロシージャの一例です。The startButton_Click procedure is an example of an Async Sub procedure. DoSomethingAsyncAsync 関数であるため、次のステートメントに示すように、DoSomethingAsync を呼び出すためのタスクを待機する必要があります。 Await DoSomethingAsync()Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement shows: Await DoSomethingAsync(). startButton_Click Sub プロシージャには Await 式があるため、Async 修飾子を使用して定義する必要があります。The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' Imports System.Diagnostics
' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task
    Dim delayTask As Task(Of Integer) = DelayAsync()
    Dim result As Integer = Await delayTask

    ' The previous two statements may be combined into
    ' the following statement.
    ' Dim result As Integer = Await DelayAsync()

    Debug.WriteLine("Result: " & result)
End Function

Private Async Function DelayAsync() As Task(Of Integer)
    Await Task.Delay(100)
    Return 5
End Function

'  Output:
'   Result: 5

参照See also