私は次のコードを持っています
For x = LBound(arr) To UBound(arr)
sname = arr(x)
If instr(sname, "Configuration item") Then
'**(here i want to go to next x in loop and not complete the code below)**
'// other code to copy past and do various stuff
Next x
だから私は単純にステートメントThen Next x
を持つことができると思ったが、これは「宣言されたforステートメントなし」エラーを与える。
それで、xの次の値に進むためにIf instr(sname, "Configuration item") Then
の後に何を置くことができますか?
あなたは Javaの または Pythonの のようなcontinue
ステートメントを考えていますが、VBAにはそのようなネイティブステートメントがなく、できませんそのようなVBAのNext
を使用します。
代わりにGoTo
ステートメントを使用して、やろうとしていることのようなものを達成できますが、実際には、GoTo
は、代替が不自然で実用的でない場合のために予約する必要があります。
単一の「継続」状態の場合、本当にシンプルで、クリーンで、読みやすい代替手段があります。
If Not InStr(sname, "Configuration item") Then
'// other code to copy paste and do various stuff
End If
GoTo
を使用できます:
Do
'... do stuff your loop will be doing
' skip to the end of the loop if necessary:
If <condition-to-go-to-next-iteration> Then GoTo ContinueLoop
'... do other stuff if the condition is not met
ContinueLoop:
Loop
何年も後...私はこれが好きです:
For x = LBound(arr) To UBound(arr): Do
sname = arr(x)
If instr(sname, "Configuration item") Then Exit Do
'// other code to copy past and do various stuff
Loop While False: Next x
For i=1 To 10
Do
'Do everything in here and
If I_Dont_Want_Finish_This_Loop Then
Exit Do
End If
'Of course, if I do want to finish it,
'I put more stuff here, and then...
Loop While False 'quit after one loop
Next i
数年遅れましたが、別の選択肢があります。
For x = LBound(arr) To UBound(arr)
sname = arr(x)
If InStr(sname, "Configuration item") Then
'Do nothing here, which automatically go to the next iteration
Else
'Code to perform the required action
End If
Next x
これはブール値を使用して解決することもできます。
For Each rngCol In rngAll.Columns
doCol = False '<==== Resets to False at top of each column
For Each cell In Selection
If cell.row = 1 Then
If thisColumnShouldBeProcessed Then doCol = True
End If
If doCol Then
'Do what you want to do to each cell in this column
End If
Next cell
Next rngCol
たとえば、以下は完全な例です。
(1)ワークシート上の使用済みセルの範囲を識別します
(2)各列をループします
(3)列のタイトルが受け入れられている場合、列のすべてのセルをループします
Sub HowToSkipForLoopIfConditionNotMet()
Dim rngCol, rngAll, cell As Range, cnt As Long, doCol, cellValType As Boolean
Set rngAll = Range("A1").CurrentRegion
'MsgBox R.Address(0, 0), , "All data"
cnt = 0
For Each rngCol In rngAll.Columns
rngCol.Select
doCol = False
For Each cell In Selection
If cell.row = 1 Then
If cell.Value = "AnAllowedColumnTitle" Then doCol = True
End If
If doCol Then '<============== THIS LINE ==========
cnt = cnt + 1
Debug.Print ("[" & cell.Value & "]" & " / " & cell.Address & " / " & cell.Column & " / " & cell.row)
If cnt > 5 Then End '<=== NOT NEEDED. Just prevents too much demo output.
End If
Next cell
Next rngCol
End Sub
注:すぐにキャッチしなかった場合、If docol Then
行は反転したCONTINUEです。つまり、doCol
がFalseのままの場合、スクリプトは次のセルに進み、何もしません。
確かに、適切なcontinue
またはnext for
ステートメントほど高速/効率的ではありませんが、最終結果は私が手に入れることができるほど近いものです。