次の方法で共有


入れ子になったコントロール構造 (Visual Basic)

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

入れ子のレベル

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 ステートメントと一致します。

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

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

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

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  

コントロール構造の重複

コントロール構造を重ねることはできません。 つまり、入れ子になった構造体は、次の最も内側の構造に完全に含まれている必要があります。 たとえば、内部For ブロックが終了する前にWith ループが終了するため、次の配置は無効です。

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

Visual Basic コンパイラは、このような重複する制御構造を検出し、コンパイル時エラーを通知します。

こちらも参照ください