Почему мой цикл For завершается перед последней строкой?

#excel #vba #for-loop

#excel #vba #цикл for

Вопрос:

У меня есть довольно простой For loop способ просмотра двух столбцов — NAME и JOB. Если в ячейке есть имена, разделенные запятыми, это запускает функцию, которая вставляет каждое имя на одну строку ниже, а затем берет количество новых строк и добавляет его к значению последней строки (минус 1). Затем, если рядом с этим именем нет задания, оно использует значение задания 1 выше.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я вижу, что LastRow значение добавляется по мере выполнения, цикл все равно завершается после достижения исходного LastRow значения, когда цикл начался.

т.е. если LR = 100 в начале цикла, но из-за CountUnique LR теперь = 115, цикл все равно завершается после 100.

Я не могу понять, почему.

  LR = Range("B" amp; Rows.Count).End(xlUp).Row

' Mirror missing attributes
    For i = 2 To LR
        If InStr(Cells(i, 2).Value, ",") Then
            LR = LR   CountUnique(Cells(i, 2)) - 1
        End If
        If Cells(i, 1).Value = "" Then
            Cells(i, 1).Value = Cells(i - 1, 1).Value
        End If

    Next i

Public Function CountUnique(r As Range) As Integer

  Dim c As Collection
    Set c = New Collection
    ary = Split(r.Text, ",")
    On Error Resume Next
    For Each a In ary
        c.Add a, CStr(a)
        If Err.Number = 0 Then

            If CountUnique >= 1 Then
                r.Offset(CountUnique, 0).EntireRow.Insert
                r.Offset(CountUnique, 0).Value = Trim(a)
            End If

            CountUnique = CountUnique   1
        Else
            Err.Number = 0
        End If
    Next a

 r.Value = c.Item(1)

End Function
  

Ответ №1:

В VB границы For цикла оцениваются один раз в начале, а значения кэшируются.

Если вам нужна динамическая верхняя граница, вам нужно использовать Do цикл.

Комментарии:

1. Спасибо! По какой-то причине я всегда избегал использования Do циклов. Очень ценная информация в отношении кэширования.