Можно ли обновить аргумент For End, находясь внутри него? - PullRequest
0 голосов
/ 29 мая 2019

Я хотел изменить свой аргумент For "End", находясь внутри For.

Например:

ForEnd = 3
for i = 1 To ForEnd
   If Something = "TRUE" Then
      ForEnd = ForEnd + 1
   End If
Next i

Это не работает, потому что "End" или "Upper Limit"msgstr "аргумент определяется, как только код проходит первую строку.Даже если я изменю его внутри кода, он примет во внимание исходное значение.

Есть мысли?

Спасибо.

Ответы [ 4 ]

1 голос
/ 29 мая 2019

Как уже упоминал Ольфф, замените цикл 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
0 голосов
/ 29 мая 2019

Вы можете использовать:

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
0 голосов
/ 29 мая 2019

Вы не можете контролировать верхний предел цикла 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
0 голосов
/ 29 мая 2019

Я понятия не имею, почему вам нужно увеличить окончание, и почему вы не можете использовать другие опции как 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...