Метод WorksheetFunction.Sum — аналог функции СУММ в VBA Excel — вычисление суммы числовых аргументов или значений заданного диапазона ячеек.
Метод WorksheetFunction.Sum
Метод WorksheetFunction.Sum возвращает сумму значений своих аргументов. Аргументы могут быть числами, переменными и выражениями, возвращающими числовые значения. Является аналогом функции СУММ.
Синтаксис метода WorksheetFunction.Sum:
1 |
WorksheetFunction.Sum(Arg1, Arg2, Arg3, ..., Arg30) |
- Arg – аргумент, который может быть числом, переменной, выражением. Тип данных — Variant. Максимальное количество аргументов – 30.
- Метод WorksheetFunction.Sum возвращает значение типа Double.
Значение функции рабочего листа Sum может быть присвоено:
- переменной числового типа Double или универсального типа Variant (при использовании числовых переменных других типов возможны недопустимые округления значений, возвращаемых методом WorksheetFunction.Sum);
- выражению, возвращающему диапазон ячеек (точнее, возвращающему свойство Value диапазона, которое является свойством по умолчанию и его в выражениях можно не указывать);
- другой функции в качестве аргумента.
Примеры вычисления сумм в коде VBA
Пример 1
Присвоение значений, вычисленных методом WorksheetFunction.Sum, переменной:
1 2 3 4 5 6 7 |
Sub Primer1() Dim a As Integer a = WorksheetFunction.Sum(5.5, 25, 8, -28) MsgBox a a = WorksheetFunction.Sum(4.5, 25, 8, -28) MsgBox a End Sub |
Наверно, вы удивитесь, но информационное окно MsgBox дважды покажет одно и то же число 10. Почему так происходит?
Дело в том, что переменная a объявлена как целочисленная (Integer). Дробные числа, возвращенные функцией рабочего листа Sum, были округлены, а в VBA Excel применяется бухгалтерское округление, которое отличается от общепринятого.
При бухгалтерском округлении 10.5 и 9.5 округляются до 10. Будьте внимательны при выборе типа переменной.
Пример 2
Вычисление суммы значений диапазона ячеек, расположенного на текущем листе:
1 2 3 4 5 6 7 8 9 10 11 |
Sub Primer2() 'Итог в 6 ячейке столбца "A" Cells(6, 1) = WorksheetFunction.Sum(Cells(1, 1), Cells(2, 1), _ Cells(3, 1), Cells(4, 1), Cells(5, 1)) 'Итог в 6 ячейке столбца "B" Range("B6") = WorksheetFunction.Sum(Range(Cells(1, 2), Cells(5, 2))) 'Итог в 6 ячейке столбца "C" Range("B6").Offset(, 1) = WorksheetFunction.Sum(Range("C1:C5")) 'Присвоение суммы диапазону ячеек Range("A8:C10") = WorksheetFunction.Sum(Range("A1:C5")) End Sub |
Если хотите проверить работу кода в своем редакторе VBA, заполните на рабочем листе Excel диапазон A1:C5 любыми числами.
Самая удобная формулировка по моему мнению:
Cells(10, 6) = WorksheetFunction.Sum(Range(Cells(2, 6), Cells(9, 6)))
,
где вместо номеров строк и столбцов можно использовать переменные.
Пример 3
Вычисление суммы значений диапазона ячеек, расположенного на другом листе:
1 2 3 |
Sub Primer3() Лист1.Cells(3, 10) = WorksheetFunction.Sum(Range(Лист2.Cells(2, 5), Лист2.Cells(100, 5))) End Sub |
Пример 4
Самый простой пример, где метод WorksheetFunction.Sum используется в качестве аргумента другой функции:
1 2 3 |
Sub Primer4() MsgBox WorksheetFunction.Sum(24, -5, 8 * 2) End Sub |
В данном случае значение функции рабочего листа Sum является аргументом функции MsgBox.
Возможно, вам интересно, откуда я взял, что функция рабочего листа (WorksheetFunction) является объектом, а сумма (Sum) ее методом? Из справки Microsoft.
Смотрите также статьи о методах WorksheetFunction.SumIf (суммирование с одним условием) и WorksheetFunction.SumIfs (суммирование с несколькими условиями).
Подскажите, можно ли таким образом
WorksheetFunction.Sum(Range(Cells(1, 2), Cells(5, 2)))
выделить несколько несмежных диапазонов? С указанием столбцов и строк вроде как можно. А вот указать несколько диапазонов через cells (x,y) — это возможно?Привет, Алексей!
Посчитать сумму несмежного диапазона можно так:
а выделить его — так:
Информационные источники предлагают еще одно решение.
Какие преимущества/недостатки каждого из них?
Application.Sum и WorksheetFunction.Sum – два способа записи одной и той же функции. Отличие в том, что запись Application.Sum не упоминается в документации по VBA Excel, хотя и работает, как и другие встроенные функции рабочего листа. Я предпочитаю запись WorksheetFunction.Sum.
Доброго времени суток!
Подскажите как получить сумму на Листе2, а результат вывести в ячейке на Листе1?!
PosStr — переменная с последней ячейкой
Здравствуйте, Виктор!
Здравствуйте, Евгений!
К сожалению не работает.
Ошибка:
Application-defined or object-defined error
Вот в принципе весь код по нажатию кнопки на листе1:
Будет отлично, если Вы поможете решить эту задачку.
Заранее спасибо!
Виктор, попробуйте запустить одну строку кода:
Лист1.Cells(3, 10)
: Лист1 — имя листа в проводнике редактора VBA;Sheets("Лист1")
: Лист1 — имя ярлычка.Добрый день!
Можно ли использовать данную функцию, если необходимо сложить одинаковые ячейки, но в разных книгах?
У меня 50 разных файлов, одинаковых по структуре, необходимо свести все данные в 1 общий файл, сохранив структуру.
Здравствуйте, Анна!
Можно, но без WorksheetFunction будет попроще:
WorksheetFunction вам не подойдет, так как эта функция может обработать только 30 аргументов.
Добрый день!
Каким образом в таком случае лучше записать макрос? может быть, есть какой-то подходящий пример?
Здравствуйте, Анна!
Смотрите примеры в статье Сбор данных из открытых книг.
Доброго вечера!
Можно ли этой функцией суммировать необходимый диапазон в массиве?
Есть массив с числами, нужно постоянно сдвигать диапазон суммирования и возвращать сумму для формулы.
Как лучше сделать?
Здравствуйте. Пытаюсь запустить по кнопке на листе 1, а сумму взять с неактивного листа, но выдает ошибку:
Application-defined or object-defined error
summaSt = Application.Sum(.Range(Cells(6, i), Cells(6, i + kolvoSt - 1)))
так тоже не выходит
With Worksheets("Result_Inj")
summaSt = Application.Sum(.Range(Cells(6, i), Cells(6, i + kolvoSt - 1)))
End With
Если перейти на лист Result_Inj, то все работает без
With Worksheets("Result_Inj")
Я так понял, сумму можно посчитать исключительно на активном листе? Не даром пишется Worksheet. Есть ли способ кроме дедовского, складывать каждую ячейку?Добрый день!
Если вы используете оператор With, не забывайте проставлять точки не только перед
.Range
, но и перед.Cells
, так какCells
без точки — это ячейка на активном листе.Обсуждение закрыто.