#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
циклов. Очень ценная информация в отношении кэширования.