Рабочие листы в рабочей книге - это Collection
.Хорошая вещь о коллекциях состоит в том, что вы можете проходить через каждый элемент в коллекции, используя цикл For...Each
.
Приведенный ниже код будет проходить через каждый Worksheet
в коллекции Worksheets
в книге, содержащей код (ThisWorkbook
).Вы можете изменить это значение на ActiveWorkbook
, что будет делать то же самое для любой активной книги в данный момент.
Вместо того, чтобы возвращать номер строки последней ячейки в столбце G, код возвращает ссылку на фактическую ячейку, а затем Offset
s на одну строку, чтобы получить следующую пустую строку.
R1C1
стиль используется для ссылки на диапазон - R4C
означает строку 4 в любом столбце формулы.R[-1]C
означает строку над формулой в любом столбце формулы. Таким образом, R4C:R[-1]C
, помещенный в ячейку G8
, будет означать G4:G7
.
Sub WorkSheetLoop()
Dim wrkSht As Worksheet
Dim rLastCell As Range
For Each wrkSht In ThisWorkbook.Worksheets
Set rLastCell = wrkSht.Cells(wrkSht.Rows.Count, 7).End(xlUp)
If rLastCell.Row > 4 Then
rLastCell.Offset(1).FormulaR1C1 = "=SUM(R4C:R[-1]C)"
End If
Next wrkSht
End Sub
Почему ваша версия не работает
Причина, по которой вы получаете ошибку времени выполнения №9, заключается в том, что ваш код пытается выбрать лист, который не работаетсуществовать.
Например, ваш код начинается с первого листа, выбранного в книге на двух листах:
Цикл 1:
LR
найдено для первого листа, - Формула
SUM
добавлена к первому листу. - Выбран второй лист.
Петля 2:
LR
найдено для второго листа. - Формула
SUM
добавлена ко второму листу. - Код пытается выбрать третий лист, который не существует - возникает ошибка.
Ваш код будет работать, если вы удалите строку Worksheets(ActiveSheet.Index + 1).Select
и добавите Worksheets(I).Select
в качествепервая строка в цикле.
Кроме того, ваш код может начинаться с любого выбранного листа - если последний лист активен при запуске кода, он добавит сумму к этому листу, а затем попытается выбрать следующий листвызывая его сбой в первом цикле.