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

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

Например:

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

Это не работает, потому что аргумент «Конец» или «Верхний предел» определяется после того, как код проходит первую строку. Даже если я изменю его внутри кода, он будет учитывать исходное значение.

Есть предположения?

Спасибо.

Почему вы не используете цикл while?

Olf 29.05.2019 13:09

Кстати, должно быть Next i не Next ForEnd

Stavros Jon 29.05.2019 13:10

Хотя то, что сказал Олф, в этом случае подходит, возможно, предоставление нам немного дополнительной информации о ваших целях может помочь вам найти конкретный подход к вашей проблеме. Что касается вашего кода, в этом нет необходимости. Зачем нужно увеличивать концовку?

Damian 29.05.2019 13:18
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
3
52
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

@jsheeran: спасибо за замечание. Я удалил часть «делать», но почему вы говорите, что «пока..венд» устарела? Он по-прежнему работает нормально, и, согласно "docs.microsoft.com/en-gb/office/vba/language/reference/…", это правильный путь.

Dominique 29.05.2019 14:17

Это пережиток исходного синтаксиса BASIC. Страница, на которую вы ссылаетесь, вместо этого рекомендует Do...Loop, который заменяет его.

jsheeran 29.05.2019 14:19

@jsheeran: вы правы, я соответствующим образом адаптировал свой вопрос.

Dominique 29.05.2019 14:23

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

Другие вопросы по теме