Копировать сумму выделенных ячеек в Буфер обмена
Иногда на то, чтобы придумать некоторые вещи, уходит очень много времени. Но когда их УЖЕ придумали, то постфактум они кажутся очевидными и даже банальными. Из серии «а что, так можно было?».
С самых первых версий в строке состояния внизу окна Microsoft Excel традиционно отображались итоги по выделенным ячейкам:
При желании, можно было даже щёлкнуть по этим итогам правой кнопкой мыши и выбрать в контекстном меню, какие именно функции мы хотим видеть:
И только совсем недавно в последних обновлениях Excel разработчики Microsoft добавили простую, но гениальную фишку — теперь при щелчке мышью по этим итогам они копируются в буфер!
Красота.
Но что делать тем, у кого пока (или уже?) нет такой версии Excel? Тут могут помочь несложные макросы.
Копирование суммы выделенных ячеек в Буфер с помощью макроса
Откройте на вкладке Разработчик (Developer) редактор Visual Basic или воспользуйтесь для этого сочетанием клавиш Alt+F11. Вставьте новый пустой модуль через меню Insert — Module и скопируйте туда следующий код:
Sub SumSelected() If TypeName(Selection) <> "Range" Then Exit Sub With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText WorksheetFunction.Sum(Selection) .PutInClipboard End With End Sub
Логика его работы проста:
- Сначала идёт «защита от дурака» — мы проверяем что именно выделено. Если выделены не ячейки (а, например, диаграмма), то выходим из макроса.
- Затем при помощи команды GetObject мы создаем новый объект данных, где будет храниться впоследствии наша сумма выделенных ячеек. Длинный и непонятный буквенно-цифровой код — это, на самом деле, ссылка на ветку реестра Windows, где лежит библиотека Microsoft Forms 2.0 Object Library, которая умеет создавать такие объекты. Иногда такой трюк ещё называют неявным поздним связыванием. Если его не использовать, то пришлось бы заранее делать в файле ссылку на эту библиотеку через меню Tools — References.
- Сумма выделенных ячеек считается командой WorksheetFunction.Sum(Selection), а затем полученная сумма помещается в буфер обмена командой PutInClipboard
Для удобства использования можно, конечно же, повесить этот макрос на сочетание клавиш с помощью кнопки Макросы на вкладке Разработчик (Developer — Macros).
А если хочется видеть, что именно скопировалось после выполнения макроса, то можно включить панель Буфер обмена с помощью маленькой стрелки в правом нижнем углу соответствующей группы на Главной (Home) вкладке:
Не только сумма
Если кроме банальной суммы хочется что-то ещё, то можно воспользоваться любой из функций, которую нам предоставляет объект WorksheetFunction:
Например, там есть:
- Sum — сумма
- Average — среднее арифметическое
- Count — количество ячеек с числами
- CountA — количество заполненных ячеек
- CountBlank — количество пустых ячеек
- Min — минимальное значение
- Max — максимальное значение
- Median — медиана (центральное значение)
- … и т.д.
С учетом фильтров и скрытых строк-столбцов
Что если в выделенном диапазоне окажутся скрытые (вручную или фильтром) строки или столбцы? Чтобы не учитывать их в итогах, нужно будет чуть-чуть модифицировать наш код, добавив к объекту Selection свойство SpecialCells(xlCellTypeVisible):
Sub SumVisible() If TypeName(Selection) <> "Range" Then Exit Sub With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText WorksheetFunction.Sum(Selection.SpecialCells(xlCellTypeVisible)) .PutInClipboard End With End Sub
В этом случае подсчет любой функции итога будет применён только к видимым ячейкам.
Если нужна живая формула
Если пофантазировать, то можно придумать сценарии, когда в буфер лучше скопировать не число (константу), а именно живую формулу, которая подсчитывает нужные нам итоги по выделенным ячейкам. В этом случае придётся склеить формулу из фрагментов, добавив к ней дополнительно удаление знаков доллара и замену запятой (которая используется как разделитель адресов нескольких выделенных диапазонов в VBA) на точку с запятой:
Sub SumFormula() If TypeName(Selection) <> "Range" Then Exit Sub With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText "=СУММ(" & Replace(Replace(Selection.Address, ",", ";"), "$", "") & ")" .PutInClipboard End With End Sub
Суммирование с дополнительными условиями
Ну и, наконец, для совсем уже маньяков можно написать макрос, который будет суммировать не все выделенные ячейки, а только те, что удовлетворяют заданным условиям. Так, например, будет выглядеть макрос помещающий в Буфер сумму выделенных ячеек, если их значения больше 5 и при этом они залиты любым цветом:
Sub CustomCalc() Dim myRange As Range If TypeName(Selection) <> "Range" Then Exit Sub For Each cell In Selection If cell.Value > 5 And cell.Interior.ColorIndex <> xlNone Then If myRange Is Nothing Then Set myRange = cell Else Set myRange = Union(myRange, cell) End If End If Next cell With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText WorksheetFunction.Sum(myRange) .PutInClipboard End With End Sub
Как легко сообразить, условия можно задать абсолютно любые — вплоть до форматов ячеек — и в любых количествах (в том числе, связывая их между собой логическими операторами or или and). Простор для фантазии большой.
Ссылки по теме
- Преобразование формул в значения (6 способов)
- Что такое макросы, как их использовать, куда вставлять код на Visual Basic
- Полезная информация в строке состояния Microsoft Excel
1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
|
1 |
|
12.01.2015, 12:22. Показов 13818. Ответов 43
помогите пожалуйста! совсем не помню как программировать в экселе.
0 |
Ушел с CyberForum совсем! 873 / 182 / 25 Регистрация: 04.05.2011 Сообщений: 1,020 Записей в блоге: 110 |
|
12.01.2015, 12:32 |
2 |
а где должна быть кнопочка: на форме или на листе ? Не по теме: подскажите с какого момента помните, а с какого не помните ?
0 |
AirLiss 1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
||||
12.01.2015, 12:36 [ТС] |
3 |
|||
вот моя ранняя работа, на основе нее пытаюсь вспомнить. здесь находится интеграл. подобно этому надо считать массив и вывести сумму.
0 |
Surrogate Ушел с CyberForum совсем! 873 / 182 / 25 Регистрация: 04.05.2011 Сообщений: 1,020 Записей в блоге: 110 |
||||
12.01.2015, 12:43 |
4 |
|||
все просто отлично. замените интегрирование на суммирование и будет вам счастье ?
0 |
1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
|
12.01.2015, 12:51 [ТС] |
5 |
Surrogate, сиё я уже не помню =) Добавлено через 4 минуты Кликните здесь для просмотра всего текста
Sub сумма() ‘вывод суммы
0 |
Заблокирован |
||||
12.01.2015, 13:05 |
6 |
|||
1 |
AirLiss 1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
||||
12.01.2015, 13:10 [ТС] |
7 |
|||
Апострофф, пишет синтаксическая ошибка…
немного не понимаю что происходит. можно как то для чайников из моего сделать?
0 |
Ушел с CyberForum совсем! 873 / 182 / 25 Регистрация: 04.05.2011 Сообщений: 1,020 Записей в блоге: 110 |
|
12.01.2015, 13:12 |
8 |
можно как то для чайников из моего сделать? дык делайте же Добавлено через 26 секунд
0 |
AirLiss 1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
||||
12.01.2015, 13:13 [ТС] |
9 |
|||
Surrogate, выдает — синтаксическая ошибка. конкретно красным выделяет строку
0 |
Surrogate Ушел с CyberForum совсем! 873 / 182 / 25 Регистрация: 04.05.2011 Сообщений: 1,020 Записей в блоге: 110 |
||||
12.01.2015, 13:14 |
10 |
|||
не смогли скопипастить по людски. вставьте d Добавлено через 35 секунд
0 |
Заблокирован |
|
12.01.2015, 13:14 |
11 |
if isnumeric (rn.value) then
0 |
1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
|
12.01.2015, 13:16 [ТС] |
12 |
Surrogate, не, там правильно, просто я не докопировала. а именно эта строка красным светится
0 |
Ушел с CyberForum совсем! 873 / 182 / 25 Регистрация: 04.05.2011 Сообщений: 1,020 Записей в блоге: 110 |
|
12.01.2015, 13:19 |
13 |
Апострофф, у меня и без скобок все работало
0 |
1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
|
12.01.2015, 13:20 [ТС] |
14 |
спасибо — работает!
0 |
Заблокирован |
|
12.01.2015, 13:20 |
15 |
Можно даже пересчитать обычным способом,
0 |
Surrogate |
12.01.2015, 13:23
|
Не по теме:
а как валенку студент вы наше будущее, а не валенок !
0 |
1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
|
12.01.2015, 13:26 [ТС] |
17 |
Surrogate, сама можно сказать дедушка =)
0 |
Surrogate |
12.01.2015, 13:30
|
Не по теме: AirLiss, другу или внуку ? я что-то запутался !
0 |
1 / 1 / 1 Регистрация: 06.06.2014 Сообщений: 115 |
|
12.01.2015, 13:35 [ТС] |
19 |
Surrogate, скажем так. я своевременно закрыла сессию и уже ни сном ни духом, благополучно все забыла. приходит сокурсник и просит помочь закрыть сессию — 1 предмет остался. логику выполнения программы я помню, а вот синтаксис — все, забыла. сейчас сижу вспоминаю. поэтому и прошу из моей бывшей работы сделать новую, что б я могла потом обьяснить что там твориться.
0 |
Заблокирован |
||||
12.01.2015, 13:41 |
20 |
|||
РешениеВот исправленный кусок маразма —
за логику в первой строке не отвечаю — Вам виднее.
0 |
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.
Let sum values from the range A1:A10.
- First, enter the worksheet function property and then select the SUM function from the list.
- Next, you need to enter starting parenthesis as you do while entering a function in the worksheet.
- After that, we need to use the range object to refer to the range for which we want to calculate the sum.
- In the end, type closing parenthesis and assign the function’s returning value to cell B1.
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.
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.
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
Вычисление суммы числовых аргументов или значений диапазона ячеек с помощью кода 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 (суммирование с несколькими условиями).
Содержание
- Копировать сумму выделенных ячеек в Буфер обмена
- Копирование суммы выделенных ячеек в Буфер с помощью макроса
- Не только сумма
- С учетом фильтров и скрытых строк-столбцов
- Если нужна живая формула
- Суммирование с дополнительными условиями
- VBA Excel. Метод WorksheetFunction.Sum – сумма аргументов
- Метод WorksheetFunction.Sum
- Примеры вычисления сумм в коде VBA
- Пример 1
- Пример 2
- Функция суммы VBA (диапазоны, столбцы и т. Д.)
- Итоговый рабочий лист
- Присвоение результата суммы переменной
- Суммировать объект диапазона
- Суммировать несколько объектов диапазона
- Суммировать весь столбец или строку
- Суммировать массив
- Использование функции SumIf
- Формула суммы
- Формула Метод
- Метод FormulaR1C1
Копировать сумму выделенных ячеек в Буфер обмена
Иногда на то, чтобы придумать некоторые вещи, уходит очень много времени. Но когда их УЖЕ придумали, то постфактум они кажутся очевидными и даже банальными. Из серии «а что, так можно было?».
С самых первых версий в строке состояния внизу окна Microsoft Excel традиционно отображались итоги по выделенным ячейкам:
При желании, можно было даже щёлкнуть по этим итогам правой кнопкой мыши и выбрать в контекстном меню, какие именно функции мы хотим видеть:
И только совсем недавно в последних обновлениях Excel разработчики Microsoft добавили простую, но гениальную фишку — теперь при щелчке мышью по этим итогам они копируются в буфер!
Но что делать тем, у кого пока (или уже?) нет такой версии Excel? Тут могут помочь несложные макросы.
Копирование суммы выделенных ячеек в Буфер с помощью макроса
Откройте на вкладке Разработчик (Developer) редактор Visual Basic или воспользуйтесь для этого сочетанием клавиш Alt + F11 . Вставьте новый пустой модуль через меню Insert — Module и скопируйте туда следующий код:
Логика его работы проста:
- Сначала идёт «защита от дурака» — мы проверяем что именно выделено. Если выделены не ячейки (а, например, диаграмма), то выходим из макроса.
- Затем при помощи команды GetObject мы создаем новый объект данных, где будет храниться впоследствии наша сумма выделенных ячеек. Длинный и непонятный буквенно-цифровой код — это, на самом деле, ссылка на ветку реестра Windows, где лежит библиотека Microsoft Forms 2.0 Object Library, которая умеет создавать такие объекты. Иногда такой трюк ещё называют неявным поздним связыванием. Если его не использовать, то пришлось бы заранее делать в файле ссылку на эту библиотеку через меню Tools — References.
- Сумма выделенных ячеек считается командой WorksheetFunction.Sum(Selection), а затем полученная сумма помещается в буфер обмена командой PutInClipboard
Для удобства использования можно, конечно же, повесить этот макрос на сочетание клавиш с помощью кнопки Макросы на вкладке Разработчик (Developer — Macros) .
А если хочется видеть, что именно скопировалось после выполнения макроса, то можно включить панель Буфер обмена с помощью маленькой стрелки в правом нижнем углу соответствующей группы на Главной (Home) вкладке:
Не только сумма
Если кроме банальной суммы хочется что-то ещё, то можно воспользоваться любой из функций, которую нам предоставляет объект WorksheetFunction:
Например, там есть:
- Sum — сумма
- Average — среднее арифметическое
- Count — количество ячеек с числами
- CountA — количество заполненных ячеек
- CountBlank — количество пустых ячеек
- Min — минимальное значение
- Max — максимальное значение
- Median — медиана (центральное значение)
- . и т.д.
С учетом фильтров и скрытых строк-столбцов
Что если в выделенном диапазоне окажутся скрытые (вручную или фильтром) строки или столбцы? Чтобы не учитывать их в итогах, нужно будет чуть-чуть модифицировать наш код, добавив к объекту Selection свойство SpecialCells(xlCellTypeVisible):
В этом случае подсчет любой функции итога будет применён только к видимым ячейкам.
Если нужна живая формула
Если пофантазировать, то можно придумать сценарии, когда в буфер лучше скопировать не число (константу), а именно живую формулу, которая подсчитывает нужные нам итоги по выделенным ячейкам. В этом случае придётся склеить формулу из фрагментов, добавив к ней дополнительно удаление знаков доллара и замену запятой (которая используется как разделитель адресов нескольких выделенных диапазонов в VBA) на точку с запятой:
Суммирование с дополнительными условиями
Ну и, наконец, для совсем уже маньяков можно написать макрос, который будет суммировать не все выделенные ячейки, а только те, что удовлетворяют заданным условиям. Так, например, будет выглядеть макрос помещающий в Буфер сумму выделенных ячеек, если их значения больше 5 и при этом они залиты любым цветом:
Как легко сообразить, условия можно задать абсолютно любые — вплоть до форматов ячеек — и в любых количествах (в том числе, связывая их между собой логическими операторами or или and). Простор для фантазии большой.
Источник
VBA Excel. Метод WorksheetFunction.Sum – сумма аргументов
Вычисление суммы числовых аргументов или значений диапазона ячеек с помощью кода VBA Excel. Метод WorksheetFunction.Sum – синтаксис, примеры.
Метод WorksheetFunction.Sum
Метод Sum объекта WorksheetFunction возвращает сумму значений своих аргументов. Аргументы могут быть числами, переменными и выражениями, возвращающими числовые значения.
Синтаксис метода 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 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 будет формула.
Источник