Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Метод WorksheetFunction.Sum

    Метод WorksheetFunction.Sum — аналог функции СУММ в VBA Excel — вычисление суммы числовых аргументов или значений заданного диапазона ячеек.

    Метод WorksheetFunction.Sum

    Метод WorksheetFunction.Sum возвращает сумму значений своих аргументов. Аргументы могут быть числами, переменными и выражениями, возвращающими числовые значения. Является аналогом функции СУММ.

    Синтаксис метода WorksheetFunction.Sum:

    • Arg – аргумент, который может быть числом, переменной, выражением. Тип данных — Variant. Максимальное количество аргументов – 30.
    • Метод WorksheetFunction.Sum возвращает значение типа Double.

    Значение функции рабочего листа Sum может быть присвоено:

    • переменной числового типа Double или универсального типа Variant (при использовании числовых переменных других типов возможны недопустимые округления значений, возвращаемых методом WorksheetFunction.Sum);
    • выражению, возвращающему диапазон ячеек (точнее, возвращающему свойство Value диапазона, которое является свойством по умолчанию и его в выражениях можно не указывать);
    • другой функции в качестве аргумента.

    Примеры вычисления сумм в коде VBA

    Пример 1

    Присвоение значений, вычисленных методом WorksheetFunction.Sum, переменной:

    Наверно, вы удивитесь, но информационное окно MsgBox дважды покажет одно и то же число 10. Почему так происходит?

    Дело в том, что переменная a объявлена как целочисленная (Integer). Дробные числа, возвращенные функцией рабочего листа Sum, были округлены, а в VBA Excel применяется бухгалтерское округление, которое отличается от общепринятого.

    При бухгалтерском округлении 10.5 и 9.5 округляются до 10. Будьте внимательны при выборе типа переменной.

    Пример 2

    Вычисление суммы значений диапазона ячеек, расположенного на текущем листе:

    Если хотите проверить работу кода в своем редакторе VBA, заполните на рабочем листе Excel диапазон A1:C5 любыми числами.

    Самая удобная формулировка по моему мнению:

    Cells(10, 6) = WorksheetFunction.Sum(Range(Cells(2, 6), Cells(9, 6))) ,

    где вместо номеров строк и столбцов можно использовать переменные.

    Пример 3

    Вычисление суммы значений диапазона ячеек, расположенного на другом листе:

    Пример 4

    Самый простой пример, где метод WorksheetFunction.Sum используется в качестве аргумента другой функции:

    В данном случае значение функции рабочего листа Sum является аргументом функции MsgBox.


    Возможно, вам интересно, откуда я взял, что функция рабочего листа (WorksheetFunction) является объектом, а сумма (Sum) ее методом? Из справки Microsoft.

    Смотрите также статьи о методах WorksheetFunction.SumIf (суммирование с одним условием) и WorksheetFunction.SumIfs (суммирование с несколькими условиями).


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    15 комментариев для “VBA Excel. Метод WorksheetFunction.Sum”

    1. Алексей

      Подскажите, можно ли таким образом WorksheetFunction.Sum(Range(Cells(1, 2), Cells(5, 2))) выделить несколько несмежных диапазонов? С указанием столбцов и строк вроде как можно. А вот указать несколько диапазонов через cells (x,y) — это возможно?

      1. Евгений

        Привет, Алексей!
        Посчитать сумму несмежного диапазона можно так:

        а выделить его — так:

    2. Информационные источники предлагают еще одно решение.

      Какие преимущества/недостатки каждого из них?

      1. Евгений

        Application.Sum и WorksheetFunction.Sum – два способа записи одной и той же функции. Отличие в том, что запись Application.Sum не упоминается в документации по VBA Excel, хотя и работает, как и другие встроенные функции рабочего листа. Я предпочитаю запись WorksheetFunction.Sum.

    3. Доброго времени суток!
      Подскажите как получить сумму на Листе2, а результат вывести в ячейке на Листе1?!

      PosStr — переменная с последней ячейкой

      1. Евгений

        Здравствуйте, Виктор!

        1. Здравствуйте, Евгений!
          К сожалению не работает.
          Ошибка:
          Application-defined or object-defined error
          Вот в принципе весь код по нажатию кнопки на листе1:

          Будет отлично, если Вы поможете решить эту задачку.
          Заранее спасибо!

          1. Евгений

            Виктор, попробуйте запустить одну строку кода:

            • Лист1.Cells(3, 10): Лист1 — имя листа в проводнике редактора VBA;
            • Sheets("Лист1"): Лист1 — имя ярлычка.
    4. Добрый день!
      Можно ли использовать данную функцию, если необходимо сложить одинаковые ячейки, но в разных книгах?
      У меня 50 разных файлов, одинаковых по структуре, необходимо свести все данные в 1 общий файл, сохранив структуру.

      1. Евгений

        Здравствуйте, Анна!
        Можно, но без WorksheetFunction будет попроще:

        WorksheetFunction вам не подойдет, так как эта функция может обработать только 30 аргументов.

        1. Добрый день!
          Каким образом в таком случае лучше записать макрос? может быть, есть какой-то подходящий пример?

    5. Доброго вечера!
      Можно ли этой функцией суммировать необходимый диапазон в массиве?

      Есть массив с числами, нужно постоянно сдвигать диапазон суммирования и возвращать сумму для формулы.

      Как лучше сделать?

    6. Здравствуйте. Пытаюсь запустить по кнопке на листе 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. Есть ли способ кроме дедовского, складывать каждую ячейку?

      1. Евгений

        Добрый день!
        Если вы используете оператор With, не забывайте проставлять точки не только перед .Range, но и перед .Cells, так как Cells без точки — это ячейка на активном листе.

    Обсуждение закрыто.