入れ子になった制御構造 (Visual Basic)
For...Next ループの中に If...Then...Else ブロックを配置するなど、制御ステートメントの中に別の制御ステートメントを配置できます。制御ステートメントの中に別の制御ステートメントを配置することを入れ子にすると言います。
入れ子のレベル
Visual Basic には、制御構造を入れ子にするときのレベルに制限はありません。構造を入れ子にする場合は、コードを読みやすくするために、レベルごとにインデントして記述するのが一般的です。これは、統合開発環境 (IDE: Integrated Development Environment) エディターによって、自動的に行われます。
次の例では、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 ループが終了するため、無効です。
For および With 構造体の無効な入れ子
Visual Basic コンパイラによって、そのような制御構造の重なりが検出され、コンパイル エラーが通知されます。