Я хотел изменить свой аргумент For «End», находясь внутри For.
Например:
ForEnd = 3
for i = 1 To ForEnd
If Something = "TRUE" Then
ForEnd = ForEnd + 1
End If
Next i
Это не работает, потому что аргумент «Конец» или «Верхний предел» определяется после того, как код проходит первую строку. Даже если я изменю его внутри кода, он будет учитывать исходное значение.
Есть предположения?
Спасибо.
Кстати, должно быть Next i
не Next ForEnd
Хотя то, что сказал Олф, в этом случае подходит, возможно, предоставление нам немного дополнительной информации о ваших целях может помочь вам найти конкретный подход к вашей проблеме. Что касается вашего кода, в этом нет необходимости. Зачем нужно увеличивать концовку?
Я понятия не имею, зачем вам нужно увеличивать окончание, и почему вы не можете использовать другие варианты, такие как Do...Loop
, но это может сработать для вас. Попробуйте адаптировать его под свои нужды:
Dim ForEnd As Byte 'Limit or FOR...NEXT
Dim i As Byte 'Counter of FOR...NEXT
Dim XX As Byte 'It will store the last value of i when we restart the FOR...NEXT
Dim Something As String
ForEnd = 3
XX = 1 'First value of i
For_Start:
For i = XX To ForEnd Step 1
If Something = "TRUE" Then
ForEnd = ForEnd + 1
XX = i + 1
GoTo For_Start
End If
Next i
Вы обрабатываете с помощью другой переменной последнюю позицию вашего цикла и перезапускаете ее оттуда с помощью GoTo
Как упоминал Олф, замените цикл for на цикл while:
ForEnd = 3
i = 1
while i<ForEnd
If Something = "TRUE" Then
ForEnd = ForEnd + 1
End If
i = i + 1
Wend
Будьте очень осторожны, чтобы не попасть в бесконечный цикл! (Something
должен регулярно отличаться от "TRUE"
)
Другой способ (более современный) — использовать подход Do..Loop
:
ForEnd = 3
i = 1
Do While i<ForEnd
If Something = "TRUE" Then
ForEnd = ForEnd + 1
End If
i = i + 1
Loop
While...Wend
устарела, а While...Do...Wend
является недопустимой конструкцией.
@jsheeran: спасибо за замечание. Я удалил часть «делать», но почему вы говорите, что «пока..венд» устарела? Он по-прежнему работает нормально, и, согласно "docs.microsoft.com/en-gb/office/vba/language/reference/…", это правильный путь.
Это пережиток исходного синтаксиса BASIC. Страница, на которую вы ссылаетесь, вместо этого рекомендует Do...Loop
, который заменяет его.
@jsheeran: вы правы, я соответствующим образом адаптировал свой вопрос.
Вы не можете контролировать верхний предел цикла For
, когда используете константу или переменную в заголовке. Однако использование функции сделает это:
for i = 1 To ForEnd(i)
' commands
Next i
Function ForEnd(k as Long) As Long
If Something = "TRUE" Then
ForEnd = 0
Else
ForEnd = k + 1
End If
End Function
хотя я бы предпочел использовать Do While
, как указано выше. Если вам нужен цикл For
, вы можете использовать Exit For
, чтобы разорвать цикл в случае:
for i = 1 To 111111
If Something = "False" Then Exit For
Next i
Вы можете использовать:
Option Explicit
Sub test()
Dim i As Long
i = 1
Do Until i > 6
ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value = 20
i = i + 1
Loop
End Sub
Почему вы не используете цикл while?