Страницы: 1
RSS
Сделать накопительный итог (количество позиций) по критерию
 
Здравствуйте, уважаемые планетяне!
Вопрос наверное не сложный и решаетсься, возможно, одной штатной формулой, но я давно не работал
с ексель и данная задача никак не дается.
Суть - сделать накопительный итог (количество позиций) по критерию.
Пример в файле, зарание спасибо  
 
=СУММПРОИЗВ(--(СЧЁТЕСЛИ($F$1:$F$3;$A$1:$A$7)>0);--($B$1:$B$7=G5))
 
Большое спасибо, vikttur, работает
 
Уважаемые друзья,
пробую вставить предложенную vikttur, формулу в VBA но она не отрабатывает ("Type mismatch")
Код
 v = Application.WorksheetFunction.SumProduct(--(Application.WorksheetFunction.CountIf(Sheets("5").Range("H4:H" & lr), Range("raw_stuff")) > 0), --(Range("raw_stuff2") = "text"))
именные диапазоны реально существуют с ними все в порядке
что делаю не так?
зарание спасибо
 
Цитата
Vitallic написал: именные диапазоны
Привязаны к книге или листу?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, область действия - рабочая книга

я склоняюсь к мысли что ошибка возникает в связи с двойным отрицанием (потому как именные диапазоны я заменял на адресно прописаные в остальном - точная копия формулы на листе)
эффект тот же - ошибка

если есть необходимость могу сделать пример  
 
Попробуйте убрать двойное отрицание и замените его на умножение:
Код
Application.WorksheetFunction.SumProduct((Application.WorksheetFunction.CountIf(Sheets("5").Range("H4:H" & lr), Range("raw_stuff")) > 0)*(Range("raw_stuff2") = "text"))

Или может так:
Код
Application.WorksheetFunction.SumProduct(1*(Application.WorksheetFunction.CountIf(Sheets("5").Range("H4:H" & lr), Range("raw_stuff")) > 0),1*(Range("raw_stuff2") = "text"))


ЗЫ: Если пишете код, почему не посчитать результат сразу в коде? Выигрыш от подсчета встроенной формулой - миллисекунды, в данном случае.
F1 творит чудеса
 
Максим Зеленский, спасибо за варианты.
Попробовал та же ошибка.
Цитата
Максим Зеленский написал:
ЗЫ: Если пишете код, почему не посчитать результат сразу в коде? Выигрыш от подсчета встроенной формулой - миллисекунды, в данном случае.
Честно говоря хотел решить задачу штатными средствами (формулой) в среде VBA,
как мне казалось что это простой вариант, но поскольку я с формулами на вы - обратился на форум.
А так кодом - без проблем.
Всем спасибо  
 
нет, проблема не в двойном отрицании
вот это тоже не будет работать:
Код
v = Application.WorksheetFunction.CountIf(ThisWorkbook.Sheets(1).Range("f1:f3"), Range("raw_stuff"))

CountIf в VBA не хочет принимать массив в качестве второго аргумента
F1 творит чудеса
 
Да, напрямую через WorksheetFunction работать не будет. А так будет:

Код
v = Evaluate("SumProduct(--(CountIf(" & Sheets("5").Range("H4:H" & lr).Address & "," & Range("raw_stuff").Address & ") > 0), --(" & Range("raw_stuff2").Address & "=""text""))")
Изменено: Влад - 17.08.2016 16:38:37
 
Влад, Ваше решение действительно работает, спасибо
Страницы: 1
Наверх