Макросы в excel для суммирования

Уважаемые форумчане, добрый вечер!

Потихоньку жажда знаний стала одолевать лень, и я занялся освоением макросов и языка VBA, пока что на сугубо дилетантском уровне — по уже готовым примерам в сети, и разбору кода записанного через макрорекодер. Скажу честно, понимаю я пока немного, но твёрдо намерен освоить это дело хоть на каком то уровне.

Собственно, застопорился, на элементарном примере, задача — через VBA-код реализовать ТО ЖЕ САМОЕ ЧТО ДЕЛАЕТ сочетание клавиш Alt+
т.е. сложение всех чисел в столбце находящихся выше выделенной ячейки  (в эту самую ячейку надо поместить сумму этих чисел).
По условию:
1. Числа могут идти в любом столбце (A, B, …), из какого столбца суммируем определяем по выделенной в данный момент ячейке, выше которой, как предполагается находятся числа для суммирования, которые в столбце идут без пропусков,
2. Числа могут начинаться с произвольной строчки т.е. не обязательно сверху листа
3. Их может быть от 1 до N в пределах системных ограничений Эксель
4. Над первым числом может идти поле заголовка (таблицы) типа «Продажи», «Прибыль» и.т.д., либо его может не быть т.е. просто сверху вниз в столбце идут числа
5. Формула суммы чисел вписывается в первую пустую ячейку под ними, куда предварительно ставим курсов до запуска макроса.

Суть вопроса:
Макрорекордер при записи макроса сгенерил следующий код:

Код
Sub Macro23()
    ActiveCell.FormulaR1C1 = "=SUM(R[-22]C:R[-1]C)"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Этот пример прекрасно сработал для одного конкретного диапазона, на котором я собственно записывал макрос, но если чисел в столбце, большеменьше, чем в этом примере, то разумеется, корректно складывать не будет, это вижу даже я т.к. он вставляет формулу суммы через относительные ссылки в ячейку и при этом жёстко фиксирует диапазон, подлежащий сложению.
Проблема в том, что когда записываешь макрос, он не понимает что ты через Alt+ или функцией СУММ и Ctrl+стрелкой хочешь захватить весь диапазон чисел для суммирования (сколько бы их ни было в конкретном случае) и тупо подсчитывает сколько конкретно строчек просуммировалось для текущего случая и фиксирует это в макросе!
Умом понимаю, что надо как то найти и запомнить в переменной положение самой верхней и самой нижней цифры диапазона суммирования (т.е. их адреса ячеек) и уже дальше эти переменные вставлять в ту формулу суммы, которую через макрос вводим в нужную ячейку, но как это сделать, увы, не знаю! :(

Кто знает, подскажите, как это сделать, пожалуйста. Возможно код должен быть гораздо сложнее, чем это…

Знаю, что это ерунда, а не задача, но я пока пробую самое простое, по отрывочным сведениям в сети, совершенно не разобрался с выделением диапазоновячеек и доступом к их свойствам…

И, кстати, был бы очень благодарен, если бы Вы могли посоветовать полноценную, не совсем для «чайников», но при этом хотя бы в меру короткую и доходчивую книгу по макросамVBA для изучения с обилием примеров.
Уокенбах, конечно, крутой, но пока в нём найдёшь нужный раздел, это пипец… ))
Лет 10 назад занимался программированием в универе (Паскаль, СС++, Java), но с тех пор от этого полностью отошёл и много чего забыл очевидно, так что в коде в принципе смогу разобраться, но на сложном материале скорее всего буду тупить…

Вычисление суммы числовых аргументов или значений диапазона ячеек с помощью кода VBA Excel. Метод WorksheetFunction.Sum – синтаксис, примеры.

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

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

WorksheetFunction.Sum(Arg1, Arg2, Arg3, ..., Arg30)

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

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

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

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

Пример 1

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

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

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

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

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

Sub Primer3()

Лист1.Cells(3, 10) = WorksheetFunction.Sum(Range(Лист2.Cells(2, 5), Лист2.Cells(100, 5)))

End Sub

Пример 4

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

Sub Primer4()

MsgBox WorksheetFunction.Sum(24, 5, 8 * 2)

End Sub

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


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

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


In Excel, you can use VBA to calculate the sum of values from a range of cells or multiple ranges. And, in this tutorial, we are going to learn the different ways that we can use this.

Sum in VBA using WorksheetFunction

In VBA, there are multiple functions that you can use, but there’s no specific function for this purpose. That does not mean we can’t do a sum. In VBA, there’s a property called WorksheetFunction that can help you to call functions into a VBA code.

sum-in-vba-using-worksheet

Let sum values from the range A1:A10.

  1. First, enter the worksheet function property and then select the SUM function from the list.
    2-enter-worksheet-function
  2. Next, you need to enter starting parenthesis as you do while entering a function in the worksheet.
    3-starting-parenthesis
  3. After that, we need to use the range object to refer to the range for which we want to calculate the sum.
    4-use-the-range-object
  4. In the end, type closing parenthesis and assign the function’s returning value to cell B1.
    5-closing-parenthesis
Range("B1") = Application.WorksheetFunction.Sum(Range("A1:A10"))

Now when you run this code, it will calculate the sum for the values that you have in the range A1:A10 and enter the value in cell B1.

run-the-code-to-calculate

Sum Values from an Entire Column or a Row

In that just need to specify a row or column instead of the range that we have used in the earlier example.

'for the entire column A
Range("B1") = Application.WorksheetFunction.Sum(Range("A:A"))

'for entire row 1
Range("B1") = Application.WorksheetFunction.Sum(Range("1:1"))

Use VBA to Sum Values from the Selection

Now let’s say you want to sum value from the selected cells only in that you can use a code just like the following.

Sub vba_sum_selection()

Dim sRange As Range
Dim iSum As Long

On Error GoTo errorHandler

Set sRange = Selection

iSum = WorksheetFunction.Sum(Range(sRange.Address))
MsgBox iSum

errorHandler:
MsgBox "make sure to select a valid range of cells"

End Sub

In the above code, we have used the selection and then specified it to the variable “sRange” and then use that range variable’s address to get the sum.

The following code takes all the cells and sum values from them and enters the result in the selected cell.

Sub vba_auto_sum()

Dim iFirst As String
Dim iLast As String
Dim iRange As Range

On Error GoTo errorHandler

iFirst = Selection.End(xlUp).End(xlUp).Address
iLast = Selection.End(xlUp).Address

Set iRange = Range(iFirst & ":" & iLast)
ActiveCell = WorksheetFunction.Sum(iRange)

Exit Sub

errorHandler:
MsgBox "make sure to select a valid range of cells"

End Sub

Sum a Dynamic Range using VBA

And in the same way, you can use a dynamic range while using VBA to sum values.

Sub vba_dynamic_range_sum()

Dim iFirst As String
Dim iLast As String
Dim iRange As Range

On Error GoTo errorHandler

iFirst = Selection.Offset(1, 1).Address
iLast = Selection.Offset(5, 5).Address

Set iRange = Range(iFirst & ":" & iLast)
ActiveCell = WorksheetFunction.Sum(iRange)

Exit Sub

errorHandler:
MsgBox "make sure to select a valid range of cells"

End Sub

Sum a Dynamic Column or a Row

In the same way, if you want to use a dynamic column you can use the following code where it will take the column of the active cell and sum for all the values that you have in it.

Sub vba_dynamic_column()

Dim iCol As Long

On Error GoTo errorHandler

iCol = ActiveCell.Column
MsgBox WorksheetFunction.Sum(Columns(iCol))

Exit Sub

errorHandler:
MsgBox "make sure to select a valid range of cells"

End Sub

And for a row.

Sub vba_dynamic_row()

Dim iRow As Long

On Error GoTo errorHandler

iRow = ActiveCell.Row

MsgBox WorksheetFunction.Sum(Rows(iCol))

Exit Sub

errorHandler:
MsgBox "make sure to select a valid range of cells"

End Sub

Using SUMIF with VBA

Just like sum you can use the SUMIF function to sum values with criteria just like the following example.

sumif-with-vba
Sub vba_sumif()

Dim cRange As Range
Dim sRange As Range

Set cRange = Range("A2:A13")
Set sRange = Range("B2:B13")

Range("C2") = _
WorksheetFunction.SumIf(cRange, "Product B", sRange)

End Sub

Skip to content

На чтение 3 мин. Просмотров 1.6k.

Что делает макрос: При создании сводной таблицы Excel, по умолчанию, суммирует данные для подсчета или суммирования элементов. Если все ячейки в столбце содержат числовые данные, Excel выбирает сумму. Если поле, которые вы добавляете содержат пробел или текст, Excel выбирает Количество.
Хотя во многих случаях поля, которые должны быть суммированы на законных основаниях, содержат пробелы. В этих случаях мы вынуждены вручную изменять тип вычислений.
Макрос в этом разделе направлен на оказание помощи путем автоматической установки типа расчета каждого элемента данных на Sum.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

Этот макрос выполняет цикл по каждому полю данных в сводной таблице и изменяет свойство функции к xlSum. Вы можете изменить этот макрос, чтобы использовать один из вариантов расчета: xlCount, xlAverage, xlMin, xlMax и так далее. Когда вы идете в окно кода и вводите pf.Function =, вы видите выпадающий список вариантов.

Код макроса

Sub SummirovatZnacheniyaPoleiSvodnoi()
'Шаг 1: Объявляем переменные
Dim pt As PivotTable
Dim pf As PivotField
'Шаг 2: Наведите курсор на сводную таблицу в активной ячейке
On Error Resume Next
Set pt = ActiveSheet.PivotTables(ActiveCell.PivotTable.Name)
'Шаг 3: Выход, если ячейка находится не в сводной таблице
If pt Is Nothing Then
MsgBox "Вы должны поместить курсор в сводную таблицу."
Exit Sub
End If
'Шаг 4: Цикл по полям сводной с применением суммы
For Each pf In pt.DataFields
pf.Function = xlSum
Next pf
End Sub

Как этот код работает

  1. Шаг 1 объявляет две переменные объекта. Он использует РТ, как контейнер памяти для сводной таблицы и PF в качестве контейнера память для полей данных. Это позволяет перебрать
    все поля данных в сводной таблице.
  2. Этот макрос устроен так, что мы предполагаем, активную сводную таблицу на основе активной ячейки. Активная ячейка должна быть внутри сводной таблицы для этого макроса. Предполагается, что, когда курсор находится внутри определенной сводной таблицы, мы хотим выполнить макрос действий на этом уровне. Шаг 2 устанавливает переменную pt в имя сводной таблицы, в которой находится активная ячейка. Мы делаем это, используя свойство ActiveCell.PivotTable.Name, чтобы получить имя целевой сводной. Если активная ячейка не находится внутри сводной таблицы, выдается ошибка. Вот почему мы используем On Error Resume Next. Это говорит Excel продолжить макрос, если есть ошибка.
  3. Шаг 3 проверяет, заполнена ли переменная pt объектом PivotTable. Если переменная pt в значении Nothing, активная ячейка не была включена в сводную таблицу, поэтому сводной таблице не может быть присвоена переменная. Если это так, мы сообщаем пользователю в окне сообщения, а затем выходим.
  4. Если макрос достиг шага 4, он успешно указал на сводную таблицу. Он использует оператор For Each, чтобы перебрать каждое поле данных. Каждый раз, когда новое поле сводной выбрано, он изменяет свойство Function, чтобы установить вычисление, используемое полем. В этом случае, мы устанавливаем все поля данных в сводной таблице на сумму. После того, как имя было изменено, мы переходим к следующему полю данных. После того, как все поля данных
  5. были оценены, макрос заканчивается.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

Содержание

  • Итоговый рабочий лист
  • Присвоение результата суммы переменной
  • Суммировать объект диапазона
  • Суммировать несколько объектов диапазона
  • Суммировать весь столбец или строку
  • Суммировать массив
  • Использование функции SumIf
  • Формула суммы

Из этого туториала Вы узнаете, как использовать функцию Excel Sum в VBA.

Функция суммы — одна из наиболее широко используемых функций Excel и, вероятно, первая, которую пользователи Excel научились использовать. VBA фактически не имеет эквивалента — пользователь должен использовать встроенную функцию Excel в VBA, используя Рабочий лист объект.

Итоговый рабочий лист

Объект WorksheetFunction можно использовать для вызова большинства функций Excel, доступных в диалоговом окне «Вставить функцию» в Excel. Функция СУММ — одна из них.

123 Sub TestFunctionДиапазон («D33») = Application.WorksheetFunction.Sum («D1: D32»)Конец подписки

В функции СУММ может быть до 30 аргументов. Каждый из аргументов также может относиться к диапазону ячеек.

В этом примере ниже добавляются ячейки с D1 по D9.

123 Sub TestSum ()Диапазон («D10») = Application.WorksheetFunction.SUM («D1: D9»)Конец подписки

В приведенном ниже примере добавляется диапазон в столбце D и диапазон в столбце F. Если вы не введете объект Application, он будет принят.

123 Sub TestSum ()Диапазон («D25») = WorksheetFunction.SUM (Диапазон («D1: D24»), Диапазон («F1: F24»))Конец подписки

Обратите внимание, что для одного диапазона ячеек вам не нужно указывать слово «Диапазон» в формуле перед ячейками, это предполагается кодом. Однако, если вы используете несколько аргументов, вам нужно это сделать.

Присвоение результата суммы переменной

Возможно, вы захотите использовать результат своей формулы в другом месте кода, а не записывать его непосредственно обратно в Excel Range. В этом случае вы можете присвоить результат переменной, которая будет использоваться позже в вашем коде.

1234567 Sub AssignSumVariable ()Тусклый результат как двойной’Назначьте переменнуюрезультат = WorksheetFunction.SUM (Диапазон («G2: G7»), Диапазон («H2: H7»))’Показать результатMsgBox «Всего диапазонов» & результатКонец подписки

Суммировать объект диапазона

Вы можете назначить группу ячеек объекту Range, а затем использовать этот объект Range с Рабочий лист объект.

123456789 Sub TestSumRange ()Dim rng As Range’назначить диапазон ячеекУстановить rng = Range («D2: E10»)’используйте диапазон в формулеДиапазон («E11») = WorksheetFunction.SUM (rng)’отпустить объект диапазонаУстановить rng = ничегоКонец подписки

Суммировать несколько объектов диапазона

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

123456789101112 Sub TestSumMultipleRanges ()Dim rngA As ДиапазонDim rngB as Range’назначить диапазон ячеекУстановите rngA = Range («D2: D10»)Установите rngB = Range («E2: E10»)’используйте диапазон в формулеДиапазон («E11») = WorksheetFunction.SUM (rngA, rngB)’отпустить объект диапазонаУстановите rngA = NothingУстановить rngB = НичегоКонец подписки

Суммировать весь столбец или строку

Вы также можете использовать функцию Sum, чтобы сложить весь столбец или всю строку

Эта процедура ниже суммирует все числовые ячейки в столбце D.

123 Sub TestSum ()Диапазон («F1») = WorksheetFunction.SUM (Диапазон («D: D»)Конец подписки

В то время как эта процедура ниже суммирует все числовые ячейки в строке 9.

123 Sub TestSum ()Диапазон («F2») = WorksheetFunction.SUM (Диапазон («9: 9»)Конец подписки

Суммировать массив

Вы также можете использовать WorksheetFunction.Sum для суммирования значений в массиве.

123456789101112 Sub TestArray ()Dim intA (от 1 до 5) как целое числоDim SumArray как целое число’заполнить массивintA (1) = 15intA (2) = 20intA (3) = 25intA (4) = 30intA (5) = 40’сложите массив и покажите результатMsgBox WorksheetFunction.SUM (intA)Конец подписки

Использование функции SumIf

Еще одна функция рабочего листа, которую можно использовать, — это функция СУММЕСЛИ.

123 Sub TestSumIf ()Диапазон («D11») = WorksheetFunction.SUMIF (Диапазон («C2: C10»), 150, Диапазон («D2: D10»))Конец подписки

Приведенная выше процедура суммирует только ячейки в диапазоне (D2: D10), если соответствующая ячейка в столбце C = 150.

Формула суммы

Когда вы используете Рабочий лист Функция. СУММ чтобы добавить сумму к диапазону на листе, возвращается статическая сумма, а не гибкая формула. Это означает, что при изменении ваших цифр в Excel значение, возвращаемое Рабочий лист не изменится.

В приведенном выше примере процедура TestSum суммировала диапазон (D2: D10), и результат был помещен в D11. Как вы можете видеть в строке формул, это число, а не формула.

Если любое из значений изменится в диапазоне (D2: D10), результат в D11 будет НЕТ изменение.

Вместо использования Рабочий лист Функция. СУММ, вы можете использовать VBA для применения функции суммы к ячейке с помощью Формула или Формула R1C1 методы.

Формула Метод

Метод формулы позволяет указать конкретный диапазон ячеек, например: D2: D10, как показано ниже.

123 Sub TestSumFormulaДиапазон («D11»). Формула = «= СУММ (D2: D10)»Конец подписки

Метод FormulaR1C1

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

123 Sub TestSumFormula ()Диапазон («D11»). FormulaR1C1 = «= СУММ (R [-9] C: R [-1] C)»Конец подписки

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

123 Sub TestSumFormula ()ActiveCell.FormulaR1C1 = «= СУММ (R [-9] C: R [-1] C)»Конец подписки

Где бы вы ни находились на своем листе, формула складывает 8 ячеек прямо над ней и помещает ответ в вашу ActiveCell. На диапазон внутри функции SUM следует ссылаться с использованием синтаксиса Row (R) и Column (C).

Оба эти метода позволяют использовать динамические формулы Excel в VBA.

Теперь вместо значения в D11 будет формула.

Вы поможете развитию сайта, поделившись страницей с друзьями

Понравилась статья? Поделить с друзьями:
  • Макросы vba для таблиц excel
  • Макросы в excel для сравнения двух таблиц
  • Макросы в excel бухгалтер
  • Макросы в excel для сравнения двух столбцов
  • Макросы vba в excel что это такое