次の方法で共有


入れ子になったコントロール構造 (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 ステートメントと一致します。

多くのコントロール構造では、キーワードをクリックすると、その構造内のすべてのキーワードが強調表示されます。 たとえば、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 ループが終了するため、次の配置は無効です。

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

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

こちらも参照ください