Приведенная ниже функция может использоваться в вашем коде, а также в 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)