Суммирование

Программирование на Visual Basic for Applications
panchos
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 05.03.2007 (Пн) 9:45

Суммирование

Сообщение panchos » 25.04.2007 (Ср) 8:22

Всем привет. У меня возникла проблема. Не получается подсчитать совпадающие элементы. Пример

1
2
1
4
3
5
3
Совпадений 2

Спасибо

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 25.04.2007 (Ср) 9:49

А проблема-то в чем? Закинуть в массив и 'попересравнивать'?

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Re: Суммирование

Сообщение Genyaa » 25.04.2007 (Ср) 9:55

panchos писал(а):Не получается подсчитать совпадающие элементы.

Может быть так?:
Вложения
Книга1.zip
(6 Кб) Скачиваний: 124
Всякое решение плодит новые проблемы.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 25.04.2007 (Ср) 10:05

Отсортировать и один раз пройтись циклом, проверяя равенство i-ого элемента и i+1.
Быть... или не быть. Вот. В чём вопрос?

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

Сообщение Pavel55 » 25.04.2007 (Ср) 10:34

'для поиска задвоений в столбце А
=ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ(A2;$A$1:$A1;0))=ИСТИНА;"Задвоение! Надо удалить!";"")
или
=ЕСЛИ(СЧЁТЕСЛИ($A$1:$A1;A2)>0=ИСТИНА;"Задвоение! Надо удалить!";"")

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

Сообщение Krasnaja Shapka » 25.04.2007 (Ср) 10:46

ну, я бы только удалил у Pavel55 не обязательные "=ИСТИНА"
Последний раз редактировалось Krasnaja Shapka 25.04.2007 (Ср) 12:18, всего редактировалось 1 раз.
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 25.04.2007 (Ср) 11:06

Krasnaja Shapka
а я бы еще удалил не обязательные ">0"
У-у-у!!

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

Re: Суммирование

Сообщение KL » 25.04.2007 (Ср) 16:19

panchos писал(а):Всем привет. У меня возникла проблема. Не получается подсчитать совпадающие элементы. Пример

1
2
1
4
3
5
3
Совпадений 2

Спасибо


Если нужно именно то, что описано в вопросе, то...

Вар 1: Только для чисел
=СУММ(--(ЧАСТОТА(A1:A10;A1:A10)>1))

Вар 2: Универсальный
=СУММ(--(ЧАСТОТА(ПОИСКПОЗ(""&A1:A10;""&A1:A10;0);ПОИСКПОЗ(""&A1:A10;""&A1:A10;0))>1))
Привет,
KL

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

Сообщение Krasnaja Shapka » 25.04.2007 (Ср) 17:11

:shock: офигеть... а что означает "--"?
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

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

Сообщение Krasnaja Shapka » 25.04.2007 (Ср) 17:32

нашел что "--" аналогично если(...;1;0)... но блин в два раза удобнее, хотябы тем что вводится не как формула массива... абалдеть... :))
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

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

Сообщение KL » 25.04.2007 (Ср) 20:06

Krasnaja Shapka писал(а):нашел что "--" аналогично если(...;1;0)... но блин в два раза удобнее, хотябы тем что вводится не как формула массива... абалдеть... :))


На всякий пожарный все же поясню :-)

1) кусок ЧАСТОТА(A1:A10;A1:A10)>1 возвращает массив из логических значений ИСТИНА/ЛОЖЬ, например:

{ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ}

2) функция СУММ() [как впрочем большинство функций] неспособна сама превратить логические значения ИСТИНА/ЛОЖЬ в их числовые эквиваленты 1/0

3) зато это могут делать элементарные арифметические операторы и функция Ч(), например:


=--{ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ}
=Ч({ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ})
=1*{ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ}
={ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ}/1
=0+{ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ}
={ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ;ЛОЖЬ;ЛОЖЬ}^1

все возвращают:

{0;0;1;0;0;0;0;1;0;0;0}

4) но быстрее всех это делает двойной минус (--)
Привет,
KL

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.04.2007 (Чт) 8:07

Быстрее даже, чем 0+?
Сложение это одна операция, а двойная смена знака две операции.
Lasciate ogni speranza, voi ch'entrate.

panchos
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 05.03.2007 (Пн) 9:45

Сообщение panchos » 26.04.2007 (Чт) 11:14

а как это в воде будет.

panchos
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 05.03.2007 (Пн) 9:45

Сообщение panchos » 26.04.2007 (Чт) 11:16

в коде

panchos
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 05.03.2007 (Пн) 9:45

Сообщение panchos » 26.04.2007 (Чт) 11:55

panchos писал(а):
Не получается подсчитать совпадающие элементы.

Может быть так?:

А что это такое

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

Сообщение GSerg » 26.04.2007 (Чт) 12:36

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

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

Сообщение KL » 26.04.2007 (Чт) 13:27

alibek писал(а):Быстрее даже, чем 0+?
Сложение это одна операция, а двойная смена знака две операции.


Да, быстрее даже, чем 0+ :-)

вот мои промеры для полного пересчета в XL2003:

=--A1:A65000

первый раз 1,64 мс
последующие 5 раз среднее время 1,0533 мс

=0+A1:A65000

первый раз 2,21 мс
последующие 5 раз среднее время 1,6433 мс
Привет,
KL

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

Сообщение Krasnaja Shapka » 26.04.2007 (Чт) 15:21

спасибо :)) суперовая штука :))
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

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

Re: Суммирование

Сообщение @Nik » 11.06.2007 (Пн) 11:22

KL писал(а):Вар 1: Только для чисел
=СУММ(--(ЧАСТОТА(A1:A10;A1:A10)>1))

Решение, конечно, суперовое... просто нет слов !!! :thumleft: И задачка тоже, ничё так... мне понравилась... Только чёт я не мог успокоиться, пока не решил эту задачу без функции ЧАСТОТА()... Вот что у меня получилось:

{=СУММ(--(СЧЁТЕСЛИ(A2:A10;Ч(СМЕЩ(A1;ПОИСКПОЗ(СТРОКА(A2:A10)-СТРОКА(A1); ПОИСКПОЗ(A2:A10;A2:A10;0);0); )))>1))}

Исх. данные в диапазоне A2:A10

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

Re: Суммирование

Сообщение KL » 11.06.2007 (Пн) 13:49

@Nik писал(а):Только чёт я не мог успокоиться, пока не решил эту задачу без функции ЧАСТОТА()... Вот что у меня получилось:

{=СУММ(--(СЧЁТЕСЛИ(A2:A10;Ч(СМЕЩ(A1;ПОИСКПОЗ(СТРОКА(A2:A10)-СТРОКА(A1); ПОИСКПОЗ(A2:A10;A2:A10;0);0); )))>1))}


Теперь используем исходные данные в [A1:A5000] и засекаем время. На моей относительно быстрой машине и Excel2003 получилось следующее:

=СУММ(--(ЧАСТОТА(A1:A5000;A1:A5000)>1))
среднее время полного пересчета (4 промера): 166,84 миллисек


=СУММ(--(ЧАСТОТА(ПОИСКПОЗ(""&A1:A5000;""&A1:A5000;0);ПОИСКПОЗ(""&A1:A5000;""&A1:A5000;0))>1))
среднее время полного пересчета (4 промера): 445,12 миллисек


{=СУММ(--(СЧЁТЕСЛИ(A2:A5000;Ч(СМЕЩ(A1;ПОИСКПОЗ(СТРОКА(A2:A5000)-СТРОКА(A1); ПОИСКПОЗ(A2:A5000;A2:A5000;0);0); )))>1))}
среднее время полного пересчета (4 промера): 1585,26 миллисек

Добавим к этому то, что последняя формула еще и летучая и впору прослезиться :-)
Привет,
KL

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

Сообщение @Nik » 11.06.2007 (Пн) 15:50

KL, да ты не так понял.... Разумеется, что твой способ более рациональный по всем показателям.... Это ж очевидно... Мне просто захотелось решить эту задачу другим способом, не используя ф-цию ЧАСТОТА()... Делать мне просто нечего, понимаешь.... хочется мозги посушить.... :-)

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

Сообщение KL » 11.06.2007 (Пн) 17:11

@Nik писал(а):...да ты не так понял.... Разумеется, что твой способ более рациональный по всем показателям....

Это ты не так понял ;-) Я не нападаю на тебя, а даю рецензию на твою формулу и объясняю, что при создании формул (особенно массива) надо как минимум следить за...

- кол-вом выполняемых ею операций
- выбором функций для нее
- ее летучестью

@Nik писал(а):Мне просто захотелось решить эту задачу другим способом, не используя ф-цию ЧАСТОТА()... :-)

Это-то как раз мне и непонятно! Функция ЧАСТОТА в разы быстрее, чем СЧЁТЕСЛИ, да и формула с ней в конечном итоге короче и быстрее...
Привет,
KL

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

Сообщение @Nik » 11.06.2007 (Пн) 17:26

Тю, да говорю тебе, что мне просто захотелось решить другим способом, без ЧАСТОТА() и неважно как он по быстродействию... Просто для разминки мозгов, понимаешь....? Я вообще думал, что формула получится гораздо более корявая, а эта ещё куда ни шло...
И потом, задача такого типа, как правило, одна на всю таблицу (столбец), а не в каждой строке всего столбца :-)

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

Сообщение KL » 11.06.2007 (Пн) 18:32

@Nik писал(а):Тю, да говорю тебе, что мне просто захотелось решить другим способом, без ЧАСТОТА() и неважно как он по быстродействию... Просто для разминки мозгов, понимаешь....? Я вообще думал, что формула получится гораздо более корявая, а эта ещё куда ни шло...

тогда я бы сделал так:

=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000&"")>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))

@Nik писал(а):И потом, задача такого типа, как правило, одна на всю таблицу (столбец), а не в каждой строке всего столбца :-)

А кто говорил про это? Чтобы "задушить" файл одной такой формулой, достаточно уже того, чтобы диапазон используемый в этой единственной формуле состоял из тысяч ячеек.[/b]
Привет,
KL

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

Сообщение @Nik » 12.06.2007 (Вт) 11:05

Я так понял, ты попытался разложить функцию ЧАСТОТА() на составные части.... Прикольно..... :-) Однако, я смотрю, некорректно отрабатывает пустые ячейки ф-ция СЧЁТЕСЛИ(). Погоняй свою формулу на новом листе, где ещё не было данных и ты увидишь, что она выдаёт бред... А если начинаешь чем-то подменять пустоты, тогда не хочет приниматься СЧЁТЕСЛИ() :-( (у меня Офис ХР рус.)

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

Сообщение KL » 12.06.2007 (Вт) 13:51

@Nik писал(а):Я так понял, ты попытался разложить функцию ЧАСТОТА() на составные части.... Прикольно..... :-) Однако, я смотрю, некорректно отрабатывает пустые ячейки ф-ция СЧЁТЕСЛИ(). Погоняй свою формулу на новом листе, где ещё не было данных и ты увидишь, что она выдаёт бред... А если начинаешь чем-то подменять пустоты, тогда не хочет приниматься СЧЁТЕСЛИ() :-( (у меня Офис ХР рус.)


У меня версия Офис 2003 англ.
Не уверен, но наверное дело в том, как понимать "некорректно отрабатывает" и "выдаёт бред". В моем понимании пусто - это значение ячейки и имеет такое же право быть учтенным. Другое дело это то, что в зависимости от конкретной ситуации это может быть нужно или нет, но в данном случае никто не говорил, что пустые ячейки не должны учитываться. У меня при наличии более одной пустой ячейки формула прибавляет к результату один. Если этого не нужно, то:

=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000)>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))

или так:

=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000&"")>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))-(СЧЁТЕСЛИ(A1:A5000;"")>1)

или так:

=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000&"")>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))-(СЧЁТЕСЛИ(A1:A5000;"=")>1)

Если я не угадал с причинами "некорректно отрабатывает" и "выдаёт бред", то объясни поподробнее, что конкретно означают эти выражения.
Привет,
KL

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

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

Формула:
=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000&"")>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))
в экселе 2000 и ХР если, скажем, а яч. А1 и А10 поставить по "1", то результат выдаст 625,75

Формула:
=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000)>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))
корректно работает везде... Чудеса - да и только :-)

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

Сообщение KL » 12.06.2007 (Вт) 14:54

@Nik писал(а):Формула:
=СУММПРОИЗВ((СЧЁТЕСЛИ(A1:A5000;A1:A5000&"")>1)/СЧЁТЕСЛИ(A1:A5000;A1:A5000&""))
в экселе 2000 и ХР если, скажем, а яч. А1 и А10 поставить по "1", то результат выдаст 625,75


Интересно! Что-то подобное я услышал недели две назад на испанском форуме, но как-то не сопоставил с этим случаем. Возможно существует "bug" в неанглийских версиях Excel.
Привет,
KL


Вернуться в VBA

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

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

    TopList