入れ子になった制御構造 (Visual Basic)Nested Control Structures (Visual Basic)

制御ステートメントは、For...Next ループ内の If...Then...Else ブロックなど、他のコントロールステートメント内に配置できます。You can place control statements inside other control statements, for example an If...Then...Else block within a For...Next loop. 別の control ステートメント内に配置された control ステートメントは、入れ子になっていると言います。A control statement placed inside another control statement is said to be nested.

入れ子のレベルNesting Levels

Visual Basic の制御構造は、必要な数のレベルに入れ子にすることができます。Control structures in Visual Basic can be nested to as many levels as you want. 入れ子構造体を読みやすくするには、それぞれの本文をインデントするのが一般的です。It is common practice to make nested structures more readable by indenting the body of each one. これは、統合開発環境 (IDE) エディターによって自動的に行われます。The integrated development environment (IDE) editor automatically does this.

次の例では、プロシージャ sumRows、マトリックスの各行の正の要素を加算します。In the following example, the procedure sumRows adds together the positive elements of each row of the matrix.

Public Sub sumRows(ByVal a(,) As Double, ByRef r() As Double)  
    Dim i, j As Integer  
    For i = 0 To UBound(a, 1)  
        r(i) = 0  
        For j = 0 To UBound(a, 2)  
            If a(i, j) > 0 Then  
                r(i) = r(i) + a(i, j)  
            End If  
        Next j  
    Next i  
End Sub  

前の例では、最初の Next ステートメントは内側の For ループを閉じ、最後の Next ステートメントは外側の For ループを閉じます。In the preceding example, the first Next statement closes the inner For loop and the last Next statement closes the outer For loop.

同様に、入れ子になった If ステートメントでは、End If ステートメントが最も近い直前の If ステートメントに自動的に適用されます。Likewise, in nested If statements, the End If statements automatically apply to the nearest prior If statement. 入れ子になった Do ループは同様の方法で動作し、最も内側の Loop ステートメントは最も内側の Do ステートメントと一致します。Nested Do loops work in a similar fashion, with the innermost Loop statement matching the innermost Do statement.

注意

多くの制御構造では、キーワードをクリックすると、構造内のすべてのキーワードが強調表示されます。For many control structures, when you click a keyword, all of the keywords in the structure are highlighted. たとえば、If...Then...Else の構築で [If] をクリックすると、構築内の IfThenElseIfElse、および End If のすべてのインスタンスが強調表示されます。For instance, when you click If in an If...Then...Else construction, all instances of If, Then, ElseIf, Else, and End If in the construction are highlighted. 次または前の強調表示されたキーワードに移動するには、CTRL + SHIFT + ↓キーを押すか、CTRL + SHIFT + 上方向キーを押します。To move to the next or previous highlighted keyword, press CTRL+SHIFT+DOWN ARROW or CTRL+SHIFT+UP ARROW.

さまざまな種類の制御構造の入れ子Nesting Different Kinds of Control Structures

1つの種類のコントロール構造を別の種類に入れ子にすることができます。You can nest one kind of control structure within another kind. 次の例では、With ブロック内で For Each ループと入れ子になった If ブロック内の With ブロックを使用します。The following example uses a With block inside a For Each loop and nested If blocks inside the With block.

For Each ctl As System.Windows.Forms.Control In Me.Controls  
    With ctl  
        .BackColor = System.Drawing.Color.Yellow  
        .ForeColor = System.Drawing.Color.Black  
        If .CanFocus Then  
            .Text = "Colors changed"  
            If Not .Focus() Then  
                ' Insert code to process failed focus.  
            End If  
        End If  
    End With  
Next ctl  

重複する制御構造Overlapping Control Structures

制御構造を重ねることはできません。You cannot overlap control structures. つまり、入れ子構造は、次の最も内側の構造体内に完全に含まれている必要があります。This means that any nested structure must be completely contained within the next innermost structure. たとえば、次の配置は、内部 With ブロックが終了する前に For ループが終了するため無効です。For example, the following arrangement is invalid because the For loop terminates before the inner With block terminates.

無効な入れ子の例を示す図。

Visual Basic コンパイラは、このような重複する制御構造を検出し、コンパイル時エラーを通知します。The Visual Basic compiler detects such overlapping control structures and signals a compile-time error.

参照See also