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
] をクリックすると、コンストラクション内のIf
、Then
、ElseIf
、Else
、および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 コンパイラは、このような重複する制御構造を検出し、コンパイル時エラーを通知します。
こちらも参照ください
.NET