入れ子になった制御構造
更新 : 2007 年 11 月
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 ステートメントに対応します。
異なる種類の制御構造を入れ子にする
他の種類の制御構造内で、ある種類の制御構造を入れ子にできます。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 コンパイラによって、そのような制御構造の重なりが検出され、コンパイル エラーが通知されます。