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

For...Next ループ内の If...Then...Else ブロックなど、制御ステートメントを他の制御ステートメントに配置することができます。 別の制御ステートメントに配置された制御ステートメントは、"入れ子にされた" ステートメントと呼ばれます。

入れ子のレベル

Visual Basic の制御構造は、必要な数のレベルで入れ子にできます。 一般的には、入れ子構造を読みやすくするには、各本体をインデントします。 統合開発環境 (IDE) エディターでは、これが自動的に行われます。

次の例では、プロシージャ sumRows は、マトリックスの各行の正の要素をすべて加算します。

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 ループを閉じます。

同様に、入れ子にされた If ステートメントでは、End If ステートメントは、最も近い前の If ステートメントに自動的に適用されます。 入れ子にされた Do ループも同じように機能し、最も内側の Loop ステートメントと最も内側の Do ステートメントが一致します。

Note

多くの制御構造で、キーワードの 1 つをクリックすると、構造内のすべてのキーワードが強調表示されます。 たとえば、If...Then...Else コンストラクションで If をクリックすると、コンストラクション内の IfThenElseIfElse、および End If のすべてのインスタンスが強調表示されます。 次または前の強調表示されたキーワードに移動するには、Ctrl + Shift + ↓キーを押すか、Ctrl + Shift + ↑キーを押します。

入れ子にされたさまざまな種類の制御構造

ある種類の制御構造を、別の種類の制御構造の中で入れ子にできます。 次の例は、For Each ループ内の With ブロックと、With ブロック内の入れ子にされた If ブロックを使用しています。

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  

制御構造のオーバーラップ

制御構造をオーバーラップさせることはできません。 つまり、入れ子構造は、次の最も内側にある構造に完全に含まれている必要があります。 たとえば、次の配置は、内側の With ブロックが終了する前に For ループが終了するため無効です。

Diagram that shows an example of invalid nesting.

Visual Basic コンパイラは、このような制御構造の重なりを検出し、コンパイル時にエラーが発生したことを通知します。

関連項目