Проверять последнюю строку на каждой итерации в цикле for

#excel #vba

#excel #vba

Вопрос:

Это мой код :

  For Each cell In Range("D2:D" amp; LastCompoundInterval)
        LastTransaction = Range("H" amp; Rows.Count).End(xlUp).Row
        If <some condition>
        ...
        If <some condition>
        ...
        End If
        Range("H" amp; LastTransaction) = DateAdd("m", m, cell.Offset(0, -2).Value)
        Range("I" amp; LastTransaction) = 0
        End If
Next cell
  

Я добавляю значения в конец столбцов H и I , которые имеют одинаковое количество строк, но LastTransaction переменная для последней строки остается неизменной на каждой итерации. Разве это не должно обновлять каждую итерацию?

Ответ №1:

Прежде всего, ответ на ваш вопрос Не должен ли он обновлять каждую итерацию? — Да. Он обновляет LastTransaction, но он просто остается прежним.

Вам нужно пересчитать lastrow, как перед следующим подобным образом, если вы хотите перейти к следующей строке.

  LastTransaction = Range("H" amp; Rows.Count).End(xlUp).Row  'Maybe you also need to add a  1 here if you want to have the first empty cell in column H
 For Each cell In Range("D2:D" amp; LastCompoundInterval)
        ' LastTransaction = Range("H" amp; Rows.Count).End(xlUp).Row
        If <some condition>
        ...
        If <some condition>
        ...
        End If
        Range("H" amp; LastTransaction) = DateAdd("m", m, cell.Offset(0, -2).Value)
        Range("I" amp; LastTransaction) = 0
        End If
        LastTransaction = Range("H" amp; Rows.Count).End(xlUp).Row  1
Next cell
  

Ответ №2:

LastTransaction происходит из Range("H" amp; Rows.Count).End(xlUp).Row . Он получит номер строки последней непустой ячейки в столбце H.

Rows.Count здесь означает общее количество строк на активном листе, которое является константой. Все выражение идентично следующей ручной операции:

  • найдите последнюю ячейку (с наибольшим номером строки) в столбце H
  • найдите следующую непустую ячейку вверх, нажав ctrl up arrow
  • верните номер строки этой ячейки

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

1. Это отвечает только на вопрос «почему переменная остается неизменной». Пока я все еще пытался выяснить, что означает определение «последней строки на каждой итерации» и «добавления», я вижу ответ @JMP. Вы можете обратиться к этому.

Ответ №3:

Я думаю, что ваш код должен быть:

  For Each cell In Range("D2:D" amp; LastCompoundInterval)
        LastTransaction = Range("H" amp; Rows.Count).End(xlUp).Row
        If <some condition>
        ...
        If <some condition>
        ...
        End If
        Range("H" amp; LastTransaction   1) = DateAdd("m", m, cell.Offset(0, -2).Value)
        Range("I" amp; LastTransaction   1) = 0
        End If
Next cell
  

Ранее он только перезаписывал значение последней строки в столбцах и не добавлял другое значение в качестве другой строки. 1 создает новую запись в следующей доступной строке.