Макрос суммеслимн в excel

Содержание

  • Рабочий лист СУММЕСЛИ
  • Присвоение результата СУММЕСЛИ переменной
  • Использование СУММЕСЛИМН
  • Использование СУММЕСЛИ с объектом диапазона
  • Использование СУММЕСЛИМН для объектов с несколькими диапазонами
  • Формула СУММЕСЛИ

Из этого туториала Вы узнаете, как использовать функции 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 будет формула.

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

 

Добрый день.
Есть позиции и материалы по группам на определенную сумму. Сделал макросом конкатенацию 2 столбцов, другим макросом выбрал только уникальные значения, третьим делаю СуммЕсли но в поле «критерий» не могу подставить поочередно значения из массива уникальных позиций.
Пример прилагаю, в Модуле1 находятся мои попытки) чувствую что разгадка близка но увы, так что прошу помощи.
Если можно сделать 1 макросом не выгружая промежуточные данные на лист а только результаты буду благодарен!

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#2

16.02.2013 15:34:42

Вам нужна совместимость с 2003?
Для .xlsx (.xlsm) есть функция СУММЕСЛИМН:

Код
=СУММЕСЛИМН(N:N;E:E;E2;F:F;F2)

или обязательно макрос?

Прикрепленные файлы

  • СуммЕслиМн .xlsm (18.52 КБ)

Изменено: Михаил С.16.02.2013 15:35:51

 

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

 
 

Сасибо, посмотрел. Наверное Вас ввели в заблуждение вспомогательные данные которые я выгрузил на лист макросами. Суть в том чтоб проставить суммы под ячейкой со словом «получается» в примере. Т.е. в ячейке О23 должна быть сумма по позиции со столбца N — 2816,27 минус сумма по позиции со столбца K деленная на ячейку М23. Это я сделал, с помощью Cell.offset, пройдясь циклом for each для столбца Е.
в О22 должна быть сумма чисел столбца N соотв 4др в столбце F и ключу 5203222 в столбце Е минус сумма чисел столбца K соотв 4др в столбце F и ключу 5203222 деленная на ячейку М23
и так до О19, где вычисляются данные для типа 1ос и ключа 5203222
Прошу посмотреть макросы которые я мучил, там в SumIF в критерий поиска надо как то подставить поочередно значения массива с уникальными значениями и заработает (

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#6

16.02.2013 23:48:04

Цитата
Дмитрий Тарковский пишет:
Т.е. в ячейке О23 должна быть сумма по позиции со столбца N — 2816,27 минус сумма по позиции со столбца K деленная на ячейку М23. Это я сделал, с помощью Cell.offset, пройдясь циклом for eachдля столбца Е.
в О22 должна быть сумма чисел столбца N соотв 4др в столбце F и ключу 5203222 в столбце Е минус сумма чисел столбца K соотв 4др в столбце F и ключу 5203222 деленная на ячейку М23
и так до О19, где вычисляются данные для типа 1ос и ключа 5203222

Ни чего не понял, особенно про деленная на ячейку М23 — в М23 тескт…

Покажите, какие результаты вы хотите получить и чем они отличаются от моих.

 

Я просил выгрузить суммы в тех местах где я указал «формулой» и » надо». Мне б только чтоб правильно суммы выгружать научится а там дальше буду аналогично выгружать еще по другому столбцу также и делить, но там надеюсь сам справлюсь по методу аналогии.
Прикрепил чуть доработаный файлик.  Обратите внимание на макрос mb  и его работу. Только он выгружает одни и те же данные для всех итогов а надо чтоб менялись…

 

Опять не понял, что же вам нужно.
Уберите работу макросов и покажите вручную, что и где вы хотите получить.
как я вижу — мои результаты не отличаются от ваших… только, может быть, расположены не там..

 

Ваши результаты правильны, только расположены не там, выделил зеленым так и где надо

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#10

17.02.2013 00:28:27

вот так тоже самое, но чуть короче и читабельнее

Код
Sub mb()
    Dim myArr(), i As Long
    myArr() = Range("U2:U692").Value
For Each cell In [E2:E100]
n = 1
            MyStr = Right(cell.Value, 4)
        With WorksheetFunction
                If MyStr = "Итог" Then
                    cell.Offset(-4, 10).Value = .SumIf([V:V], myArr(n, 1), [N:N]):
                    cell.Offset(-3, 10).Value = .SumIf([V:V], myArr(n + 1, 1), [N:N]):
                    cell.Offset(-2, 10).Value = .SumIf([V:V], myArr(n + 2, 1), [N:N]):
                    cell.Offset(-1, 10).Value = .SumIf([V:V], myArr(n + 3, 1), [N:N])
                End If
         End With
         
n = n + 4
    Next cell
End Sub

Изменено: Михаил С.17.02.2013 00:29:40

 

Для всех итогов выгружает одни и те же данные — как для первого. Т.е. для первой позиции считает правильно а для остальных ставит те же данные что для первой., а надо чтоб в ячейке О43 было n =5 и дальше 5+1 и тд

 

Sergei_A

Пользователь

Сообщений: 443
Регистрация: 05.01.2013

 

Да! здорово, вот только нюанс  — у меня таких итогов 180 в другой день может быть 200. Для 180-ти макрос работал примерно 5 минут, но все равно главное результат. Огромное спасибо, буду вникать до чего сам не дошел :)

 

А как можно  вместо V:V в WorksheetFunction.SumIf([V:V], Line, [K:K]) подставить сам массив, чтоб не выгружать его на лист?

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#15

17.02.2013 02:06:04

Цитата
Дмитрий Тарковский пишет:
5 минут

попробуйте такой вариант:

Код
Sub t()
  Dim lc As Range, a(), n(), o(), d As Object, v, i&, j&, k&, l&, it()
  Set lc = Cells(Rows.Count, 5).End(xlUp)
  a = Range([e2], lc.Offset(, 1)).Value
  n = Range([n2], Cells(lc.Row, "n")).Value
  ReDim o(1 To UBound(a), 1 To 1)
  ReDim it(1 To UBound(a), 1 To 2)
  Set d = CreateObject("scripting.dictionary")
  
  For i = 1 To UBound(a)
    If Not IsEmpty(a(i, 2)) Then
      d.Item(a(i, 1) & a(i, 2)) = d.Item(a(i, 1) & a(i, 2)) + n(i, 1)
    Else
      k = k + 1: it(k, 1) = a(i, 1): it(k, 2) = i
    End If
  Next
  For j = 1 To k
    l = -4
    For Each v In d.keys
      If Left(v, 7) = Left(it(j, 1), 7) Then o(it(j, 2) + l, 1) = d.Item(v): l = l + 1
    Next
  Next
  [o2].Resize(UBound(a)).Value = o
End Sub

про квадратики перед Value помните?

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Да, я через нотпад++ пропустил ток так и увидел)
Опять Вы меня выручили ikki! Скорость мгновенная, но из предыдущего примера я понял как доработать результат, а тут возник вопрос.
Выгружается сумма из столбца N, в конечном итоге нужно чтоб выгружался результат действий сумма ключа+1ос по столбцу N  —  сумма ключа+1ос по K / на значение в столбце L с тем же ключем и типом.  например для ячейки О19: (1438,645 — 1438,645) / значение в столбце L (L23 например)

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#17

17.02.2013 02:40:14

Цитата
Дмитрий Тарковский пишет:
/ на значение в столбце L с тем же ключем и типом

у вас там одни черточки.  :oops:
в принципе, ничего невозможного нет.
но, наверное, надо будет еще один словарь завести и пару массивов.
вот только про

Цитата
L23 например

пойму чего-нибудь…  :)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

добавил y = Range([k2], Cells(lc.Row, «y»  ;)  ).Value
и заменил d.Item(a(i, 1) & a(i, 2)) = d.Item(a(i, 1) & a(i, 2)) + n(i, 1)
на d.Item(a(i, 1) & a(i, 2)) = d.Item(a(i, 1) & a(i, 2)) + n(i, 1) — y(i, 1)
метод тыка оправдывает себя! ) надо теперь еще поделить на «L»
Вот еще добавил
x= Range(a(i, 1) & a(i, 2), Cells(lc.Row, «L»  ;)  ).Value
d.Item(a(i, 1) & a(i, 2)) = d.Item(a(i, 1) & a(i, 2)) + (n(i, 1) — y(i, 1)) / x(i, 1) — теперь считает что надо!))
Эмоций капец — как будто сам придумал. Спасибо Вам огромное!

Изменено: Дмитрий Тарковский17.02.2013 02:49:48

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#19

17.02.2013 02:58:50

Цитата
Дмитрий Тарковский пишет:
добавил

Код
y = Range([k2], Cells(lc.Row, "y").Value

тот «y», который здесь в кавычках — это столбец листа.
вам столько не надо. достаточно «L».

Цитата
Дмитрий Тарковский пишет: надо теперь еще поделить на «L»

а там ещё проще
переписываем строчку:

Код
ReDim it(1 To UBound(a), 1 To 3)

добавляем одну команду:

Код
k = k + 1: it(k, 1) = a(i, 1): it(k, 2) = i: it(k,3)=y(i,2)

и, соответственно, переписываем так:

Код
o(it(j, 2) + l, 1) = d.Item(v) / it(j,3)

всё.

пс. данный макрос будет корректно работать только (sic !) для семизначных строк в столбце E. иначе нужно будет править код, повышая универсальность.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#20

17.02.2013 03:00:03

Цитата
Дмитрий Тарковский пишет:
Вот еще добавил

тоже вариант.
замечательно.

upd стоп. я как-то по-другому понял вашу хотелку. что вам надо итог суммы разниц делить на значение в столце L в итоговой строке…
а в вашем варианте получается сумма делений. это может быть не одно и то же. от цифр зависит.
ваша логика вам виднее, конечно, но всё же тестируйте результаты без эмоций, плиз  ;)

Изменено: ikki17.02.2013 03:05:25

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#21

17.02.2013 03:21:58

да, и кстати!

Цитата
Дмитрий Тарковский пишет:
Опять Вы меня выручили ikki! Скорость мгновенная

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

а ускорить готовый алгоритм — дело нехитрое  8)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#22

17.02.2013 03:43:46

Лично я просто психанул.   :o  
У меня такой вариант получился, по выданному примеру

Код
Sub Sum_Unic()
Dim Arr(), i&, Str$
Dim Unic()
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")
With Sheets("Лист1")
    Arr = Intersect(.UsedRange, .Range("E:N"))
        For i = 2 To UBound(Arr)
            If Arr(i, 1) Like "*Итог*" Then
               Unic = oDict.Items
               .Cells(i - oDict.Count, 15).Resize(oDict.Count) = WorksheetFunction.Transpose(Unic)
              oDict.RemoveAll
              i = i + 1
            End If
          Str = Arr(i, 1) & " " & Arr(i, 2)
  With oDict
            If .exists(Str) Then
                .Item(Str) = .Item(Str) + Arr(i, 10)
            Else
                On Error Resume Next
                .Add Key:=Str, Item:=Arr(i, 10)
            End If
     End With
   Next
End With
End Sub

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

Прикрепленные файлы

  • СуммЕслиМн (3).xlsm (21.66 КБ)

Изменено: Михаил С.17.02.2013 04:15:01

 

Дмитрий Тарковский

Пользователь

Сообщений: 204
Регистрация: 08.01.2013

#23

17.02.2013 03:44:47

Конечно спасибо всем! просто именно Вы уже второй раз выручили, а то сижу голову ломаю по пару дней)

суммеслимн макросом для динамических таблиц

alex808

Дата: Четверг, 08.09.2016, 15:09 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 47


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Добрый день Уважаемые форумчане.. Подскажите пожалуйста как записать формулу «суммеслимн» в макрос. По-сути из листа «отсюда» собираются уникальные фамилии в лист «сюда», затем создается отчет. Формулу в ячейки с аргументами поставить получилось, однако возникла проблема- исходная таблица постоянно растет, а вот формула, как вышло у меня, этого не учитывает, т.е.берет только заложенный в ней диапазон. Как учесть растущий диапазон на другом листе?..И еще один вопрос по такой вставке- Если данные для отчета находятся в соседних столбцах (январь,февраль, март и т.д.), то у меня вышло вставить ОДИНАКОВУЮ формулу для каждой колонки путем увеличения диапазона. А вот как быть, если одинаковая формула должна встать в несколько РАЗДЕЛЕННЫХ между собой колонках? Пробовал писать диапазоны через запятую, но ругается…Спасибо

К сообщению приложен файл:

2486332.xlsm
(18.7 Kb)

 

Ответить

китин

Дата: Четверг, 08.09.2016, 15:21 |
Сообщение № 2

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

а чем сводная не подходит?

К сообщению приложен файл:

33333.xlsm
(22.0 Kb)


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

alex808

Дата: Четверг, 08.09.2016, 15:29 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 47


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

китин, В данном примере она конечно поможет, НО в итоговую таблицу подгружаются данные еще и из других таблиц. Кроме того сами исходные таблицы формируются из нескольких, затем какие-то из них вообще сращиваются и после консолидации делаются дополнительные расчеты….Вообщем есть задача сделать не только отчеты, а еще загрузить систему некоторыми управляющими функциями… Так что нужен именно макрос..Спасибо за внимание к моему посту

 

Ответить

nilem

Дата: Четверг, 08.09.2016, 15:46 |
Сообщение № 4

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

может, как-то вот так?:

укеуке — похоже, самый удачливый продавец :)


Яндекс.Деньги 4100159601573

 

Ответить

alex808

Дата: Четверг, 08.09.2016, 16:03 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 47


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

nilem, Спасибо большое! Это волшебно..Работает. Даже успел вставить еще более удачливого продавца. Буду разбираться в коде, ибо у меня пока уровень очень низкий- только вставками формул промышляю…попробую разобраться.Спасибо!

 

Ответить

alex808

Дата: Четверг, 08.09.2016, 16:18 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 47


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

nilem, Простите, а что нужно делать, чтобы код еще и год учитывал? Я понял, что выделен Х по строке месяцы и берется У по фамилиям, но как я понимаю , при принятии во внимание параметра «год» необходим еще один Х?..Но как тогда изменится код?..Я еще в присвоении разных переменных , как и во взрослых кодах не бум=бум..

 

Ответить

nilem

Дата: Четверг, 08.09.2016, 19:06 |
Сообщение № 7

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

попробуйте так:

Вот здесь yr = Array(2015, 2016, 2017) напишите те годы, которые нужны, — за эти и получите отчет.


Яндекс.Деньги 4100159601573

 

Ответить

alex808

Дата: Пятница, 09.09.2016, 13:44 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 47


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

nilem, Спасибо за науку…буду сравнивать коды и пробовать понять логику..СПАСИБО!!!

 

Ответить

MikeVol

Дата: Суббота, 15.05.2021, 00:34 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 185


Репутация:

16

±

Замечаний:
0% ±


Excel 2021

[offtop] вот это глюки на форуме… Или это только у меня?
[url=

]My WebPage[/url]


Ученик.

Сообщение отредактировал MikeVolСуббота, 15.05.2021, 00:41

 

Ответить

Суммирование числовых значений ячеек в диапазоне с учетом нескольких условий в коде 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

Цитата
Сообщение от Alex77755
Посмотреть сообщение

А где находятся эти столбцы?

Допустим, столбец 1 — это столбец А, а столбец 2 — это столбец С.
Вася 35
Петя 40
Вася 40
В данном примере, если в InputBox завести «Вася», то в MsgBox должно отобразиться 75



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

Visual Basic
1
MsgBox Application.SumIf([A:A], InputBox("Введите имя"), [C:C])



1



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

04.02.2016, 20:12

 [ТС]

6

Цитата
Сообщение от pashulka
Посмотреть сообщение

1
MsgBox Application.SumIf([A:A], InputBox(«Введите имя»), [C:C])

Суммесли мне известна, но не в 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

Как вариант, просто суммировать каждый столбец, т.е.

Visual Basic
1
2
iText = InputBox("Введите имя", , "Вася")
MsgBox Application.SumIf([A:A], iText, [B:B]) + Application.SumIf([A:A], iText, [D:D])

Если столбцов более двух

Visual Basic
1
2
3
4
5
iText = InputBox("Введите имя", , "Вася")
For Each iColumn In Array("B", "D", "F")
    iResult = iResult + Application.SumIf(Columns("A"), iText, Columns(iColumn))
Next
MsgBox iResult

Или программно вычислять формулу :

Visual Basic
1
2
=СУММ((A1:A10="Вася")*(B1:B10+D1:D10))
=СУММПРОИЗВ((A1:A10="Вася")*(B1:B10+D1:D10))



1



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

04.02.2016, 22:09

 [ТС]

12

Цитата
Сообщение от pashulka
Посмотреть сообщение

Visual BasicВыделить код
1
2
3
4
5
iText = InputBox(«Введите имя», , «Вася»)
For Each iColumn In Array(«B», «D», «F»)
* * iResult = iResult + Application.SumIf(Columns(«A»), iText, Columns(iColumn))
Next
MsgBox iResult

Прошу прощения, а выйти из цикла так?
If cells(i,1) = iText Then exit For

Добавлено через 1 минуту
Это правда для цикла типа For i = 1 to 10



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

04.02.2016, 22:13

13

А не нужно никуда выходить т.к. цикл в моём примере предназначен для перебора столбцов («B», «D», «F»), а не строк.

P.S. С какой целью Вы перебираете строки ?



0



teplovdl

13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

04.02.2016, 22:20

 [ТС]

14

А если пример вот такой

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub zarplata()
lastrow = Cells.SpecialCells(xlLastCell).Row
Temp1 = (InputBox("Укажите начало периода"))
Temp2 = (InputBox("Укажите конец периода"))
Temp3 = (InputBox("Введите Ф.И.О. работника"))
For i = 3 To lastrow
        If Cells(i, 1) >= Temp1 Or Cells(i, 1) <= Temp2 Then
            MsgBox "Зарплата за период " & " с " & Temp1 & " по " & Temp2 & " составила " & Application.SumIf([C:C], Temp3, [Z:Z]) + Application.SumIf([C:C], Temp3, [AA:AA]) & " руб", , "Зарплата"
        
        End If
        If Cells(i, 3) = Temp3 Then Exit For
Next
End Sub

Это реальный пример. Все работает хорошо, но нужно, чтобы цикл прерывался как только в столбце 1 повстречается Temp3. Иначе бесконечно много раз вылезает MsgBox. Вроде все правильно написано, но че то цикл не прерывается.



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

04.02.2016, 22:55

15

Если воспользуетесь функцией СУММЕСЛИМН (Excel 2007 и старше), то сможете отказаться от цикла.

P.S. В более ранних версиях — можно использовать другие возможности.

Добавлено через 16 минут
Если же для подсчёта зарплаты использовать именно перебор ячеек, то можно и так :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Option Compare Text
 
Private Sub Zarplata()
    On Error GoTo ErrHandler
    
    Dim LastRow&, Row&, Zarplata#
    Dim Temp1 As Date, Temp2 As Date, Temp3$
 
    LastRow = Cells.SpecialCells(xlLastCell).Row
    Temp1 = CDate(InputBox("Укажите начало периода"))
    Temp2 = CDate(InputBox("Укажите конец периода"))
    Temp3 = Trim(InputBox("Введите Ф.И.О. работника"))
 
    For Row = 3 To LastRow
        If Cells(Row, 3) = Temp3 Then
           Select Case Cells(Row, 1)
               Case Temp1 To Temp2
               Zarplata = Zarplata + Cells(Row, 26) + Cells(Row, 27)
           End Select
       End If
    Next
    MsgBox Zarplata: Exit Sub
    
ErrHandler:
    MsgBox Err.Description, vbCritical, Err.Number
End Sub



2



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

04.02.2016, 22:55

15

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