Содержание
- Рабочий лист СУММЕСЛИ
- Присвоение результата СУММЕСЛИ переменной
- Использование СУММЕСЛИМН
- Использование СУММЕСЛИ с объектом диапазона
- Использование СУММЕСЛИМН для объектов с несколькими диапазонами
- Формула СУММЕСЛИ
Из этого туториала Вы узнаете, как использовать функции Excel СУММЕСЛИ и СУММЕСЛИМН в VBA.
VBA не имеет эквивалента функций СУММЕСЛИ или СУММЕСЛИМН, которые вы можете использовать — пользователь должен использовать встроенные функции Excel в VBA, используя Рабочий лист объект.
Рабочий лист СУММЕСЛИ
Объект WorksheetFunction можно использовать для вызова большинства функций Excel, доступных в диалоговом окне «Вставить функцию» в Excel. Функция СУММЕСЛИ — одна из них.
123 | Sub TestSumIf ()Диапазон («D10») = Application.WorksheetFunction.SumIf (Range («C2: C9»), 150, Range («D2: D9»))Конец подписки |
Приведенная выше процедура суммирует только ячейки в диапазоне (D2: D9), если соответствующая ячейка в столбце C = 150.
Присвоение результата СУММЕСЛИ переменной
Возможно, вы захотите использовать результат своей формулы в другом месте кода, а не записывать его непосредственно обратно в Excel Range. В этом случае вы можете присвоить результат переменной, которая будет использоваться позже в вашем коде.
1234567 | Sub AssignSumIfVariable ()Тусклый результат как двойной’Назначьте переменнуюresult = WorksheetFunction.SumIf (Range («C2: C9»), 150, Range («D2: D9»))’Показать результатMsgBox «Суммарный результат, соответствующий коду продажи 150:» & resultКонец подписки |
Использование СУММЕСЛИМН
Функция СУММЕСЛИМН аналогична функции рабочего листа СУММЕСЛИ, но позволяет проверять более одного критерия. В приведенном ниже примере мы пытаемся сложить продажную цену, если код продажи равен 150 И Себестоимость больше 2. Обратите внимание, что в этой формуле диапазон ячеек для суммирования находится перед критериями, тогда как в функции СУММЕСЛИ — позади.
123 | Sub MultipleSumIfs ()Range («D10») = WorksheetFunction.SumIfs (Range («D2: D9»), Range («C2: C9»), 150, Range («E2: E9»), «> 2»)Конец подписки |
Использование СУММЕСЛИ с объектом диапазона
Вы можете назначить группу ячеек объекту Range, а затем использовать этот объект Range с Рабочий лист объект.
123456789101112 | Sub TestSumIFRange ()Dim rngCriteria As RangeDim rngSum as Range’назначить диапазон ячеекУстановить rngCriteria = Range («C2: C9»)Установить rngSum = Range («D2: D9»)’используйте диапазон в формулеДиапазон («D10») = WorksheetFunction.SumIf (rngCriteria, 150, rngSum)’освободить объекты диапазонаУстановить rngCriteria = NothingУстановить rngSum = NothingКонец подписки |
Использование СУММЕСЛИМН для объектов с несколькими диапазонами
Точно так же вы можете использовать СУММЕСЛИМН для нескольких объектов диапазона.
123456789101112131415 | Sub TestSumMultipleRanges ()Dim rngCriteria1 As ДиапазонDim rngCriteria2 as RangeDim rngSum as Range’назначить диапазон ячеекУстановить rngCriteria1 = Range («C2: C9»)Установить rngCriteria2 = Range («E2: E10»)Установить rngSum = Range («D2: D10»)’используйте диапазоны в формулеДиапазон («D10») = WorksheetFunction.SumIfs (rngSum, rngCriteria1, 150, rngCriteria2, «> 2»)’отпустить объект диапазонаУстановить rngCriteria1 = NothingУстановить rngCriteria2 = NothingУстановить rngSum = NothingКонец подписки |
Обратите внимание: поскольку вы используете знак «больше», критерии больше 2 должны быть заключены в круглые скобки.
Формула СУММЕСЛИ
Когда вы используете Рабочий лист Функция СУММЕСЛИ чтобы добавить сумму к диапазону на листе, возвращается статическая сумма, а не гибкая формула. Это означает, что при изменении ваших цифр в Excel значение, возвращаемое Рабочий лист не изменится.
В приведенном выше примере процедура суммировала Range (D2: D9), где SaleCode равняется 150 в столбце C, а результат был помещен в D10. Как вы можете видеть в строке формул, это число, а не формула.
Если любое из значений изменится в диапазоне (D2: D9) или в диапазоне (C2: D9), результат в D10 будет НЕТ изменение.
Вместо использования Рабочий лист Функция. Сумма Если, вы можете использовать VBA для применения функции СУММЕСЛИ к ячейке с помощью Формула или Формула R1C1 методы.
Формула Метод
Метод формулы позволяет указать конкретный диапазон ячеек, например: D2: D10, как показано ниже.
123 | Sub TestSumIf ()Диапазон («D10»). FormulaR1C1 = «= СУММЕСЛИ (C2: C9,150, D2: D9)»Конец подписки |
Метод FormulaR1C1
Метод FormulaR1C1 более гибкий, поскольку он не ограничивает вас заданным диапазоном ячеек. Пример ниже даст нам тот же ответ, что и приведенный выше.
123 | Sub TestSumIf ()Диапазон («D10»). FormulaR1C1 = «= СУММЕСЛИ (R [-8] C [-1]: R [-1] C [-1], 150, R [-8] C: R [-1] C ) «Конец подписки |
Однако, чтобы сделать формулу более гибкой, мы могли бы изменить код, чтобы он выглядел так:
123 | Sub TestSumIf ()ActiveCell.FormulaR1C1 = «= СУММЕСЛИ (R [-8] C [-1]: R [-1] C [-1], 150, R [-8] C: R [-1] C)»Конец подписки |
Где бы вы ни находились на своем листе, формула складывает ячейки, соответствующие критериям, прямо над ней и помещает ответ в вашу ActiveCell. На диапазон внутри функции СУММЕСЛИ необходимо ссылаться с использованием синтаксиса строки (R) и столбца (C).
Оба эти метода позволяют использовать динамические формулы Excel в VBA.
Теперь вместо значения в D10 будет формула.
Вы поможете развитию сайта, поделившись страницей с друзьями
Добрый день. |
|
Михаил С. Пользователь Сообщений: 10514 |
#2 16.02.2013 15:34:42 Вам нужна совместимость с 2003?
или обязательно макрос? Прикрепленные файлы
Изменено: Михаил С. — 16.02.2013 15:35:51 |
||
Да, суть в том что после обработки данных я делаю промежуточные итоги, и неизвестно в каких ячейках надо будет вставлять сумму. поэтому обязательно макросом. |
|
Сасибо, посмотрел. Наверное Вас ввели в заблуждение вспомогательные данные которые я выгрузил на лист макросами. Суть в том чтоб проставить суммы под ячейкой со словом «получается» в примере. Т.е. в ячейке О23 должна быть сумма по позиции со столбца N — 2816,27 минус сумма по позиции со столбца K деленная на ячейку М23. Это я сделал, с помощью Cell.offset, пройдясь циклом for each для столбца Е. |
|
Михаил С. Пользователь Сообщений: 10514 |
#6 16.02.2013 23:48:04
Ни чего не понял, особенно про деленная на ячейку М23 — в М23 тескт… Покажите, какие результаты вы хотите получить и чем они отличаются от моих. |
||
Я просил выгрузить суммы в тех местах где я указал «формулой» и » надо». Мне б только чтоб правильно суммы выгружать научится а там дальше буду аналогично выгружать еще по другому столбцу также и делить, но там надеюсь сам справлюсь по методу аналогии. |
|
Опять не понял, что же вам нужно. |
|
Ваши результаты правильны, только расположены не там, выделил зеленым так и где надо |
|
Михаил С. Пользователь Сообщений: 10514 |
#10 17.02.2013 00:28:27 вот так тоже самое, но чуть короче и читабельнее
Изменено: Михаил С. — 17.02.2013 00:29:40 |
||
Для всех итогов выгружает одни и те же данные — как для первого. Т.е. для первой позиции считает правильно а для остальных ставит те же данные что для первой., а надо чтоб в ячейке О43 было n =5 и дальше 5+1 и тд |
|
Sergei_A Пользователь Сообщений: 443 |
|
Да! здорово, вот только нюанс — у меня таких итогов 180 в другой день может быть 200. Для 180-ти макрос работал примерно 5 минут, но все равно главное результат. Огромное спасибо, буду вникать до чего сам не дошел |
|
А как можно вместо V:V в WorksheetFunction.SumIf([V:V], Line, [K:K]) подставить сам массив, чтоб не выгружать его на лист? |
|
ikki Пользователь Сообщений: 9709 |
#15 17.02.2013 02:06:04
попробуйте такой вариант:
про квадратики перед Value помните? фрилансер Excel, VBA — контакты в профиле |
||||
Да, я через нотпад++ пропустил ток так и увидел) |
|
ikki Пользователь Сообщений: 9709 |
#17 17.02.2013 02:40:14
у вас там одни черточки.
пойму чего-нибудь… фрилансер Excel, VBA — контакты в профиле |
||||
добавил y = Range([k2], Cells(lc.Row, «y» Изменено: Дмитрий Тарковский — 17.02.2013 02:49:48 |
|
ikki Пользователь Сообщений: 9709 |
#19 17.02.2013 02:58:50
тот «y», который здесь в кавычках — это столбец листа.
а там ещё проще
добавляем одну команду:
и, соответственно, переписываем так:
всё. пс. данный макрос будет корректно работать только (sic !) для семизначных строк в столбце E. иначе нужно будет править код, повышая универсальность. фрилансер Excel, VBA — контакты в профиле |
||||||||||||
ikki Пользователь Сообщений: 9709 |
#20 17.02.2013 03:00:03
тоже вариант. upd стоп. я как-то по-другому понял вашу хотелку. что вам надо итог суммы разниц делить на значение в столце L в итоговой строке… Изменено: ikki — 17.02.2013 03:05:25 фрилансер Excel, VBA — контакты в профиле |
||
ikki Пользователь Сообщений: 9709 |
#21 17.02.2013 03:21:58 да, и кстати!
ничего бы не получилось, если бы Михаил С. и Sergei_A не вытрясли бы из вас вашу же задачу во всей её неповторимой красоте. а ускорить готовый алгоритм — дело нехитрое фрилансер Excel, VBA — контакты в профиле |
||
Михаил С. Пользователь Сообщений: 10514 |
#22 17.02.2013 03:43:46 Лично я просто психанул.
Если показать, где еще находятся числа, что на что делить и куда выгружать, то легко переделать. Прикрепленные файлы
Изменено: Михаил С. — 17.02.2013 04:15:01 |
||
Дмитрий Тарковский Пользователь Сообщений: 204 |
#23 17.02.2013 03:44:47 Конечно спасибо всем! просто именно Вы уже второй раз выручили, а то сижу голову ломаю по пару дней) |
суммеслимн макросом для динамических таблиц |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Суммирование числовых значений ячеек в диапазоне с учетом нескольких условий в коде VBA Excel. Метод WorksheetFunction.SumIfs – синтаксис, параметры, примеры.
WorksheetFunction.SumIfs – это метод VBA Excel, который вычисляет сумму числовых значений в диапазоне ячеек с учетом нескольких условий (критериев).
WorksheetFunction.SumIfs (ДСумм, ДУсл_1, Усл_1, ДУсл_2, Усл_2, ..., ДУсл_14, Усл_14)
- ДСумм – диапазон суммирования, представляющий из себя часть таблицы, в ячейках которого, соответствующих условиям (критериям), суммируются значения.
- ДУсл – диапазон условия, представляющий из себя часть обрабатываемой таблицы, в ячейках которого ищется совпадение с условием (критерием) суммирования.
- Усл – это условие, которое применимо к диапазону, указанному перед ним, и определяющее критерий суммирования.
Первые три аргумента являются обязательными, остальные – необязательные. Всего выражение может содержать один диапазон суммирования (ДСумм) и четырнадцать пар диапазон+условие (ДУсл+Усл).
Диапазоны условий не должны повторяться – повторение приведет к ошибке. Диапазон суммирования можно один раз использовать как диапазон условия.
В параметре «Усл» метода WorksheetFunction.SumIfs можно использовать знаки подстановки:
- вопросительный знак (?) – заменяет один любой символ;
- звездочка (*) – заменяет любую последовательность символов (в том числе ни одного символа);
- тильда (~) – ставится перед вопросительным знаком или звездочкой, чтобы они обозначали сами себя.
Вычисление сумм с несколькими условиями
Таблица, которая использовалась для реализации примеров в коде VBA Excel:
Дата | Магазин | Продавец | Выручка |
---|---|---|---|
01.11.2019 | Липка | Лыкова | 20000 |
01.11.2019 | Берёзка | Серёжкина | 18000 |
01.11.2019 | Дубок | Бочкина | 23000 |
02.11.2019 | Липка | Лаптева | 30000 |
02.11.2019 | Берёзка | Брунькина | 25000 |
02.11.2019 | Дубок | Жёлудева | 17000 |
03.11.2019 | Липка | Лыкова | 24000 |
03.11.2019 | Берёзка | Серёжкина | 19000 |
03.11.2019 | Дубок | Бочкина | 35000 |
04.11.2019 | Липка | Лаптева | 27000 |
04.11.2019 | Берёзка | Брунькина | 31000 |
04.11.2019 | Дубок | Жёлудева | 26000 |
05.11.2019 | Липка | Лыкова | 16000 |
05.11.2019 | Берёзка | Серёжкина | 22000 |
05.11.2019 | Дубок | Бочкина | 33000 |
06.11.2019 | Липка | Лаптева | 16000 |
06.11.2019 | Берёзка | Брунькина | 28000 |
06.11.2019 | Дубок | Жёлудева | 29000 |
Если хотите повторить примеры, скопируйте эту таблицу и вставьте на рабочий лист Excel в ячейку A1. Таблица займет диапазон A1:D19.
Пример 1
Применение двух числовых условий в качестве критериев суммирования и использование диапазона суммирования в качестве диапазона условия:
Sub Primer1() Dim a As Double a = WorksheetFunction.SumIfs(Range(«D2:D19»), _ Range(«A2:A19»), DateValue(«03.11.2019»), _ Range(«D2:D19»), «>20000») MsgBox a End Sub |
В этом примере кода VBA Excel складываются все значения в диапазоне D2:D19, которые соответствуют дате 03.11.2019 в диапазоне A2:A19 и превышают 20000 в диапазоне D2:D19. Обратите внимание, что условие «>20000» заключено в прямые кавычки.
Диапазон D2:D19 используется одновременно как диапазон суммирования и как диапазон условия.
Столбец «Дата» в исходной таблице содержит даты в числовом формате, поэтому мы текстовое отображение нужной даты преобразовали в число: DateValue(«03.11.2019»). Если ячейкам этого столбца присвоить текстовый формат, то в условии суммирования дату необходимо будет указать как строку: «03.11.2019».
Пример 2
Использование в условиях суммирования переменных и подстановочных знаков:
Sub Primer2() Dim a As Double, b As String, c As String b = «>=» & CLng(DateValue(«04.11.2019»)) c = «*ина» a = WorksheetFunction.SumIfs(Range(«D2:D19»), _ Range(«A2:A19»), b, Range(«B2:B19»), «Берёзка», _ Range(«C2:C19»), c) MsgBox a End Sub |
В коде второго примера переменные в строке с методом WorksheetFunction.SumIfs можно заменить выражениями, которые присваиваются этим переменным.
Переменная «b» содержит условие, которое помогает отобрать из диапазона A2:A19 все даты, начиная с 04.11.2019 по 06.11.2019. Функция преобразования типа данных CLng необходима для того, чтобы при записи в строковую переменную дата записалась в виде числа, а не в формате «ДД.ММ.ГГГГ».
Из диапазона B2:B19 отбираются строки, содержащие текст «Берёзка».
Переменная «c» позволяет выбрать в диапазоне C2:C19 все фамилии, оканчивающиеся на «ина».
Третье условие на результаты выполнения кода примера 2 не влияет, так как фамилии всех продавцов «Берёзки» оканчиваются на «ина»: Серёжкина, Брунькина. Но вот если исключить второе условие, то к ним добавится Бочкина.
Смотрите также статьи о методах WorksheetFunction.Sum (суммирование без условия) и WorksheetFunction.SumIf (суммирование с одним условием).
13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
|
1 |
|
Суммирование по условию04.02.2016, 19:45. Показов 16731. Ответов 14
Доброго дня, уважаемые. Подскажите, не могу сообразить, как просуммировать изменяющийся диапазон по условию. Что вроде суммесли. Условие подразумевается вводить через InputBox, а результат выводить через MsgBox. Т.е. есть два столбца (допустим 1 и 2). Через InputBox вводится значение, и если оно встречается в столбце 1, то суммируются значения из столбца 2 для строк, в которых это значение встречается. В MsgBox выводятся общая сумма всех значений. Количество заполненных строк в столбце 1 равно количеству заполненных строк в столбце 1 и это количество периодически добавляется.
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
04.02.2016, 19:49 |
2 |
и если оно встречается в столбце 1, А где находятся эти столбцы?
0 |
13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
|
04.02.2016, 19:59 [ТС] |
3 |
А где находятся эти столбцы? Допустим, столбец 1 — это столбец А, а столбец 2 — это столбец С.
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
04.02.2016, 20:05 |
4 |
А, допустим: Добавлено через 2 минуты Допустим, столбец 1 — это столбец А, а столбец 2 — это столбец С. Типа макрос должен обладать способностями искусственного интеллекта и сам догадаться где что находится?
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
04.02.2016, 20:05 |
5 |
|||
A что =СУММЕСЛИ() уже исчезла из Excel
1 |
13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
|
04.02.2016, 20:12 [ТС] |
6 |
1 Суммесли мне известна, но не в VBA
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
04.02.2016, 20:21 |
7 |
teplovdl, Сорри, прочитал в Вашем сообщение, как счётесли
0 |
13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
|
04.02.2016, 20:25 [ТС] |
8 |
Это нормально… Добавлено через 1 минуту
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
04.02.2016, 20:54 |
9 |
Результат для товарища Вася должен быть 105 ? Миниатюры
0 |
13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
|
04.02.2016, 20:57 [ТС] |
10 |
Да
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||||||||||
04.02.2016, 21:32 |
11 |
|||||||||||
Как вариант, просто суммировать каждый столбец, т.е.
Если столбцов более двух
Или программно вычислять формулу :
1 |
13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
|
04.02.2016, 22:09 [ТС] |
12 |
Visual BasicВыделить код Прошу прощения, а выйти из цикла так? Добавлено через 1 минуту
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
04.02.2016, 22:13 |
13 |
А не нужно никуда выходить P.S. С какой целью Вы перебираете строки ?
0 |
teplovdl 13 / 13 / 0 Регистрация: 24.10.2015 Сообщений: 267 |
||||
04.02.2016, 22:20 [ТС] |
14 |
|||
А если пример вот такой
Это реальный пример. Все работает хорошо, но нужно, чтобы цикл прерывался как только в столбце 1 повстречается Temp3. Иначе бесконечно много раз вылезает MsgBox
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
04.02.2016, 22:55 |
15 |
|||
Если воспользуетесь функцией СУММЕСЛИМН (Excel 2007 и старше), то сможете отказаться от цикла. P.S. В более ранних версиях — можно использовать другие возможности. Добавлено через 16 минут
2 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
04.02.2016, 22:55 |
15 |