Функция СУММЕСЛИ()

Программирование на Visual Basic for Applications
Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Функция СУММЕСЛИ()

Сообщение Calvin » 04.06.2007 (Пн) 10:14

Здраствуйте, уважаемые. Как просчитать с помощью СУММЕСЛИ сумму сразу по нескольким критериям?
Вот так вот не получается, хотя странно:
Код: Выделить всё
=СУММЕСЛИ(A1:A10;ИЛИ("1700";"3000");B1:B10)
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Re: Функция СУММЕСЛИ()

Сообщение KL » 04.06.2007 (Пн) 10:30

Calvin писал(а):Здраствуйте, уважаемые. Как просчитать с помощью СУММЕСЛИ сумму сразу по нескольким критериям?
Вот так вот не получается, хотя странно:
Код: Выделить всё
=СУММЕСЛИ(A1:A10;ИЛИ("1700";"3000");B1:B10)


=СУММ(СУММЕСЛИ(A1:A10;{1700;3000};B1:B10))
Привет,
KL

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 04.06.2007 (Пн) 10:31

Calvin
Введи в любую ячейку =ИЛИ("1700";"3000) и посмотри, что возвращает это выражение и что в нём странного

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.06.2007 (Пн) 10:35

Забавно...
Если ввести в поиск слово СУММЕСЛИ, то первый же найденный топик содержит тот самый ответ, который приведён KL выше...

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

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 04.06.2007 (Пн) 10:46

Ну во-первых поиск мне ничего не выдал, а во-вторых пример KL работает не корректно, т.к. считает сумму только по одному из критериев .....GSerg ты не прав
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.06.2007 (Пн) 10:55

Потому что он немного напутал с символом-разделителем или кавычками, в зависимости от того, в какую сторону исправлять формулу.

Вот тебе и домашнее задание: ввести в поиск слово СУММЕСЛИ и найти корректную версию в первом результате поиска.

Я всё-таки прав.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 04.06.2007 (Пн) 11:10

GSerg писал(а):Потому что он немного напутал с символом-разделителем или кавычками, в зависимости от того, в какую сторону исправлять формулу.


Скорее не я напутал, а именно из-за отсутствия файла неясны три (две косвенно указанные GSerg) вещи:

- какой в системе разделитель для строк массива
- действительно ли "1700" и "3000" текст
- если текст, то нет ли в них случайных пробелов или иного мусора

А у меня формула работает очень даже корректно;-)
Вложения
Book1.xls
(14.5 Кб) Скачиваний: 315
Последний раз редактировалось KL 04.06.2007 (Пн) 11:15, всего редактировалось 1 раз.
Привет,
KL

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 04.06.2007 (Пн) 11:12

GSerg, ну нет в результатах поиска ответа на мой вопрос.....сбрось ссылку плиз, и не устраивай мне домашних заданий
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.06.2007 (Пн) 11:18

KL писал(а):- какой в системе разделитель для строк массива

Для строковых констант это запятая и точка с запятой, для числовых это двоеточие и точка с запятой, что, в принципе, бредово. Издержки лоКАЛизации.

KL писал(а):- действительно ли "1700" и "3000" текст

Применительно к данному случаю однофигственно. Excel разберётся.

KL писал(а):- если текст, то нет ли в них случайных пробелов или иного мусора

Не, дело не в этом...

Calvin писал(а):ну нет в результатах поиска ответа на мой вопрос

Ну что можно сказать, значит тест не пройден на пригодность. Раз первого результата поиска в результатах поиска нет.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 04.06.2007 (Пн) 11:31

GSerg писал(а):Для...числовых это двоеточие и точка с запятой...
Ну так значит разделитель верный, т.к. столбцы или строки для СУММЕСЛИ значения не имеет.

GSerg писал(а):
KL писал(а):- действительно ли "1700" и "3000" текст
Применительно к данному случаю однофигственно. Excel разберётся.
Не совсем. Действительно, СУММЕСЛИ разберется в формате, но с текстом больше проблем, одна из которых - третий пункт моего списка.

GSerg писал(а):
KL писал(а):- если текст, то нет ли в них случайных пробелов или иного мусора

Не, дело не в этом...

???

Calvin писал(а):ну нет в результатах поиска ответа на мой вопрос

См. мои ответы здесь: http://bbs.vbstreets.ru/viewtopic.php?t=32348&start=0
Привет,
KL

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 04.06.2007 (Пн) 11:32

KL извини, я не увидел вначале СУММ()...все работает, спасибо (я так понял, что сумм() нужен для суммирования по каждому критерию....не сталкивался еще с этим)....GSerg и тебе спасибо
-Whose the motocycle, is this? -It`s a chopper, baby! -Whose chopper is this? -Zed`s! -Who is Zed? -Zed`s dead, baby, Zed`s dead! :-D

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.06.2007 (Пн) 11:41

Ну так значит разделитель верный

Да.
Я почему-то вместо 3000 смотрел 1300.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 04.06.2007 (Пн) 11:42

Calvin писал(а):...я так понял, что сумм() нужен для суммирования по каждому критерию....


Да, т.к. СУММЕСЛИ (как и многие др. функции листа) с массивом критериев возвращает массив результатов, которые нужно суммировать.
Привет,
KL

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 04.06.2007 (Пн) 11:46

GSerg писал(а):...Я почему-то вместо 3000 смотрел 1300.


:-) Ну все равно проблема оказалась не там, где предполагал каждый из нас :-(
Привет,
KL

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 05.06.2007 (Вт) 14:06

А можно ещё так:
{=СУММ(((A1:A10=1700)+(A1:A10=3000))*B1:B10)}
или, как в примере у KL с {1700;3000}:
{=СУММ((A1:A10={1700;3000})*B1:B10)}

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 05.06.2007 (Вт) 16:03

еще один ответ (модификация ответа KL в другом топике :-) )

=СУММПРОИЗВ(((A1:A10=1700)+(A1:A10=3000))*B1:B10)
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 05.06.2007 (Вт) 16:38

@Nik писал(а):А можно ещё так:
{=СУММ(((A1:A10=1700)+(A1:A10=3000))*B1:B10)}
или, как в примере у KL с {1700;3000}:
{=СУММ((A1:A10={1700;3000})*B1:B10)}


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

{=СУММ((A1:A10={1700;3000})*B1:B10)}
[разделитель столбцов массива исправлен по подсказке GSerg с запятой на точку запятой]

Krasnaja Shapka писал(а):еще один ответ (модификация ответа KL в другом топике :-) )

=СУММПРОИЗВ(((A1:A10=1700)+(A1:A10=3000))*B1:B10)


можно еще и так:

=СУММПРОИЗВ((A1:A10={1700;3000})*B1:B10)
[разделитель столбцов массива исправлен по подсказке GSerg с запятой на точку запятой]

только вот все четыре формулы будут на порядок медленнее в диапазоне, где счет строк идет на тысячи :-) У меня в 5,000 строк формула =СУММ(СУММЕСЛИ(A1:A5000;{1700;3000};B1:B5000)) приблизительно в 5 раз быстрее каждого из четырех указанных вариантов ;-)
Последний раз редактировалось KL 13.06.2007 (Ср) 12:24, всего редактировалось 3 раз(а).
Привет,
KL

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.06.2007 (Вт) 16:48

KL писал(а):если опять ничего не путаю с разделителями русской локали, то:

{=СУММ((A1:A10={1700,3000})*B1:B10)}

Хе хе :)

Запятая -- русская десятичная точка, поэтому 1700,3000 будет воспринято как 1700 целых 3 десятых. Вот здесь и надо двоеточие.
Либо числа в кавычки...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 05.06.2007 (Вт) 17:17

GSerg писал(а):
KL писал(а):если опять ничего не путаю с разделителями русской локали, то:

{=СУММ((A1:A10={1700,3000})*B1:B10)}

Хе хе :)

Запятая -- русская десятичная точка, поэтому 1700,3000 будет воспринято как 1700 целых 3 десятых. Вот здесь и надо двоеточие.
Либо числа в кавычки...


...!!! ...!!! ...!!! (здесь идет непристойная брань) Ну дайте еще один шанс и преодолею этот пунктуационный идиотизм. Ну право слово, в каждой из 5 локалей, с которыми мне приходится сталкиваться пунктуация не похожа на остальные. Ну не тянет мой PC пять виртуальных машин одновременно :-(
Привет,
KL

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.06.2007 (Вт) 17:27

KL писал(а):Ну не тянет мой PC пять виртуальных машин одновременно :-(

Прямо даже как-то неловко объяснять :)

Пишем формулу в английской локали, выполняем код activecell.formula="=sum(...)" и наслаждаемся формулой, переведённой в русскую локаль :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 05.06.2007 (Вт) 17:41

GSerg писал(а):Прямо даже как-то неловко объяснять :)

Пишем формулу в английской локали, выполняем код activecell.formula="=sum(...)" и наслаждаемся формулой, переведённой в русскую локаль :)


Ну и отлично: невеста согласна, осталось всего лишь Рокфеллера уговорить! Хорошо тебе говорить, так для этого нужно как минимум находиться в русской локали :-) Я работаю с Windows и MSO на английском. MUI пришлось снести из экономии места на диске. Вот и приходиться загружать VMWare с локальными версиями всякий раз как надо тестировать решения.
Привет,
KL

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 06.06.2007 (Ср) 9:17

Чёт я не понял с вашими разделителями... ?? {=СУММ((A1:A10={1700:3000})*B1:B10)}
У меня правильно отрабатывается только ";". Даже когда в параметрах на вкладке "Международные" разделитель рядов явно задал ":", всё равно не работало.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 06.06.2007 (Ср) 11:22

@Nik писал(а):Чёт я не понял с вашими разделителями... ?? {=СУММ((A1:A10={1700:3000})*B1:B10)}
У меня правильно отрабатывается только ";". Даже когда в параметрах на вкладке "Международные" разделитель рядов явно задал ":", всё равно не работало.


В приложенном файле [A1] и [B1] содержат горизонтальные, а [A2] и [B2] вертикальные массивы. Какие разделители видишь ты?
Вложения
Book1.xls
(13.5 Кб) Скачиваний: 191
Привет,
KL

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 06.06.2007 (Ср) 11:56

Горизонтальные - ";"
Вертикальные - ":"

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 06.06.2007 (Ср) 12:59

@Nik писал(а):Горизонтальные - ";"
Вертикальные - ":"


тогда прав ты с разделителем ";" :-)
Привет,
KL

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 13.06.2007 (Ср) 12:00

Столкнулся с одной из модификаций данной задачи: проссумировать те значения в диапазоне А1:А10, которые больше 5 но меньше 10. Что-то с помощью СУММЕСЛИ() не получается никак составить... :-( Единственный синтаксис, который принимается, это:
{=СУММЕСЛИ(ИНДЕКС((A1:A10>5)*A1:A10;);"<10")}, но он не хотит работать :-(
Единственный вариант, который мне удалось придумать - это:
{=СУММ((A1:A10>5)*(A1:A10<10)*A1:A10)}

Есть ли ещё какие-либо интересные способы..... ?

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 13.06.2007 (Ср) 12:14

@Nik писал(а):Столкнулся с одной из модификаций данной задачи: проссумировать те значения в диапазоне А1:А10, которые больше 5 но меньше 10. Что-то с помощью СУММЕСЛИ() не получается никак составить... :-( Единственный синтаксис, который принимается, это:
{=СУММЕСЛИ(ИНДЕКС((A1:A10>5)*A1:A10;);"<10")}, но он не хотит работать :-(
Единственный вариант, который мне удалось придумать - это:
{=СУММ((A1:A10>5)*(A1:A10<10)*A1:A10)}

Есть ли ещё какие-либо интересные способы..... ?


Самый эффективный:

=СУММЕСЛИ(A1:A10;">5")-СУММЕСЛИ(A1:A10;">=10")

С извращением (слегка покороче):

=СУММ(СУММЕСЛИ(A1:A10;{">5";">=10"})*{1;-1})

P.S. функция ИНДЕКС с массивами не работает :-(
Последний раз редактировалось KL 13.06.2007 (Ср) 14:14, всего редактировалось 1 раз.
Привет,
KL

kopai
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 27.09.2007 (Чт) 14:38

Сообщение kopai » 27.09.2007 (Чт) 15:11

Здравствуйте!
Подскажите, как применить функцию СУММЕСЛИ одновременно для нескольких диапазонов?... т.е. данные в ячейке суммируются только те, которые соответствуют критерию№1 по одному диапазону и критерию№2 по другому диапазону ОДНОВРЕМЕННО...

Pavel55
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 27.10.2006 (Пт) 20:11

Сообщение Pavel55 » 27.09.2007 (Чт) 15:37

Точно не знаю, но думаю так, как пример

=СУММПРОИЗВ(($A$2:$A$20=10)*($B$2:$B$20=20)*$D$2:$D$20)

т.е. ещем 10 в столбце А и 20 в столбце В и суммируем столбец D

kopai
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 27.09.2007 (Чт) 14:38

Сообщение kopai » 01.10.2007 (Пн) 10:03

Pavel55 писал(а):Точно не знаю, но думаю так, как пример

=СУММПРОИЗВ(($A$2:$A$20=10)*($B$2:$B$20=20)*$D$2:$D$20)

т.е. ещем 10 в столбце А и 20 в столбце В и суммируем столбец D

работает в виде
=СУММПРОИЗВ(($A$2:$A$20=10)*($B$2:$B$20=20);$D$2:$D$20)
т.е. ";" вместо "*"
СПАСИБО!!!

След.

Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList