Добавить сумму к каждому листу - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть рабочая книга, которая будет состоять из непоследовательного количества рабочих листов (может быть <10 или> 100 в любой момент времени).

Столбец значений всегда будет находиться в столбце G для каждого элемента.Рабочий лист.Я написал следующее, чтобы получить общее значение в нижней части столбца G на каждом рабочем листе: -

Sub WorksheetLoop()

    Dim WS_Count As Integer
    Dim I As Integer
    Dim LR As Long

    WS_Count = ActiveWorkbook.Worksheets.Count

    For I = 1 To WS_Count

        LR = Range("G" & Rows.Count).End(xlUp).Row
        Range("G" & LR + 1).Formula = "=SUM(G4:G" & LR & ")"
        Worksheets(ActiveSheet.Index + 1).Select

    Next I

End Sub

Он запускается, однако после того, как итоговый рабочий лист завершен, я получаю следующую ошибку времени выполнения: -

Ошибка времени выполнения '9': индекс ниже диапазона

Я смотрел на другие потоки и применял разные подходы, некоторые также работают, но вызывают ошибка выполнения 91 .

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

Я считаю, что проблема заключается в Worksheets(ActiveSheet.Index + 1).Select и падениизаканчивается, когда нет активного листа для обработки.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Рабочие листы в рабочей книге - это 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 в качествепервая строка в цикле.

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

0 голосов
/ 04 декабря 2018

Как только вы попадаете на последний рабочий лист в коллекции рабочих листов, при попытке worksheets(ActiveSheet.Index + 1).Select пытается выбрать то, чего не существует.

Поскольку нет фактической причины выбирать рабочий лист для добавления формулы, избегайте использования Select .

Dim I As Integer, LR As Long

For I = 1 To ActiveWorkbook.Worksheets.Count

    with ActiveWorkbook.Worksheets(I)
        LR = .Range("G" & .Rows.Count).End(xlUp).Row
        .Range("G" & LR + 1).Formula = "=SUM(G4:G" & LR & ")"
    end with

Next I
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...