Запись общего количества столбцов в любое место - PullRequest
0 голосов
/ 26 марта 2020

Этот код просто суммирует значения в нижней части каждого столбца, но я хочу получить сумму этих значений в последнем столбце

enter image description here

Sub Sum_Last_Row()

Dim LastColumn As Long


LastColumn = Cells(Rows.Count, "A").End(xlUp).Row



Range("A" & LastColumn + 1 & ":D" & LastColumn + 1).Formula = "=SUM(A2:A" & LastColumn & ")"


End Sub

1 Ответ

0 голосов
/ 26 марта 2020

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

Function SumColumn(Rng As Range, _
                   Optional ByVal FirstRow As Long = 1) As Double

    Dim SumRng As Range
    Dim C As Long

    C = Rng.Column
    FirstRow = Application.WorksheetFunction.Max(FirstRow, 1)
    With Rng.Worksheet
        ' define the range by [First cell], [Last cell]
        Set SumRng = .Range(.Cells(FirstRow, C), _
                            .Cells(.Rows.Count, C).End(xlUp))
    End With
    SumColumn = Application.WorksheetFunction.Sum(SumRng)
End Function

Функция принимает два параметра, второй, FirstRow , является необязательным. Если он опущен, функция будет суммировать все в столбце, начиная со строки 1 до конца столбца. Если FirstRow - это число меньше последней использованной строки, функция вернет сумму, взятую из указанного FirstRow в последнюю использованную строку. Число меньше 1 будет преобразовано в 1. Число больше последней использованной строки вернет значение, найденное в последней использованной строке.

Первый параметр - это диапазон. Когда функция вызывается из кода, который может представлять собой одну ячейку или огромный диапазон из нескольких столбцов. Функция будет использовать первый столбец либо. То же самое верно, когда функция вызывается из листа. Однако определение диапазона определяет, когда Excel обновит результат функции. И =SumColumn(A1), и =SumColumn(A:A) будут возвращать один и тот же результат, как и SumColumn(A:D), но первая версия будет пересчитываться автоматически только при изменении в A1, тогда как последняя будет обновляться всякий раз, когда в столбцах есть изменения ОБЪЯВЛЕНИЕ. Очевидно, что это перебор, потому что только изменения в столбце A могут повлиять на общее количество, произведенное функцией. Выполнение ненужных вычислений замедлит рабочий лист.

Вот несколько примеров вызовов UDF из рабочего листа. Они могут быть размещены в любой ячейке на любом листе, кроме тех, которые включены в SumRange, поскольку это приведет к циклической ошибке ссылки.

=SumColumn(D:D,4)        ' start summing from row 4
=SumColumn($D:$D,4)      ' absolute referencing for copying to other columns
=SumColumn(D:D)          ' start summing in row 1

Примеры вызовов из кода: -

' replace column IDs with column numbers if you wish
Cells(1, "A").Value = SumColumn(Columns("D"), 2)
Debug.Print SumColumn(Columns("D"), 2)
Sheet1.Cells(1, "A").Value = SumColumn(Sheet2.Columns("D"), 2)
Set Rng = Range("D8:AB17")
' the function will sum column D from row 3:-
Sheet1.Cells(1, 10).Value = SumColumn(Rng, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...