Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подсчет положения в столбце место в таблице(волейбол) - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Подсчет положения в столбце место в таблице(волейбол)
Oka08 Дата: Пятница, 02.02.2018, 15:43 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

2013
Помогите настроить формулу подсчета места (столбец AS) в таблице, должно считать сначала по очкам(AR) - затем если у двух и более команд одинаковое количество очков по разнице сетов(AR), далее по разнице очков сетах(AJ). Перерыл весь форум такого не нашел, пробовал подогнать другие формулы ничего пока не выходит.
по ссылке второй лист:
https://docs.google.com/spreads....sharing


Сообщение отредактировал Oka08 - Пятница, 02.02.2018, 15:47
 
Ответить
СообщениеПомогите настроить формулу подсчета места (столбец AS) в таблице, должно считать сначала по очкам(AR) - затем если у двух и более команд одинаковое количество очков по разнице сетов(AR), далее по разнице очков сетах(AJ). Перерыл весь форум такого не нашел, пробовал подогнать другие формулы ничего пока не выходит.
по ссылке второй лист:
https://docs.google.com/spreads....sharing

Автор - Oka08
Дата добавления - 02.02.2018 в 15:43
Pelena Дата: Пятница, 02.02.2018, 16:11 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19403
Репутация: 4555 ±
Замечаний: ±

Excel 365 & Mac Excel
Oka08, а здесь ответ не устроил?


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеOka08, а здесь ответ не устроил?

Автор - Pelena
Дата добавления - 02.02.2018 в 16:11
Oka08 Дата: Пятница, 02.02.2018, 16:35 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

2013
Pelena, там слишком все подогнано под футбол, я мучился с ним мучился и решил полностью новый сделать.
 
Ответить
СообщениеPelena, там слишком все подогнано под футбол, я мучился с ним мучился и решил полностью новый сделать.

Автор - Oka08
Дата добавления - 02.02.2018 в 16:35
Gustav Дата: Пятница, 02.02.2018, 20:23 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
В той моей теме, ссылку на которую дала Елена, в сообщении N 3 исчерпывающе изложено как построить подобную формулу, особенно во фрагментах со степенями 100 и 20.
[p.s.]ну, видимо, пока сам не покажу, никто не покажет (тэг vba вместо формульного применяю сознательно - для лучшего форматирования в целях наглядности)[/p.s.]
Итак, в соответствии с моим подходом могу предложить следующие формулы для Вашего листа "таблица".

В ячейку AV2 - "Суммарный ранг" по трём показателям (очкам, разницам сетов, разницам очков в партиях):
[vba]
Код
=100^3 * RANK(AS2;$AS$2:$AS$11;1)
+100^2 * RANK(AR2;$AR$2:$AR$11;1)
+100^1 * RANK(AJ2;$AJ$2:$AJ$11;1)
[/vba]Понятно, что это просто некий искусственно созданный показатель, ранжирование по которому, тем не менее, обеспечит правильное определение мест команд.

После ввода в ячейку AV2 протягиваем формулу на все команды в диапазоне AV2:AV11 и далее вводим формулу определения мест в ячейку AW2 (и также протягиваем в AW2:AW11):
[vba]
Код
=RANK(AV2;$AV$2:$AV$11)
[/vba]

Формула для "Суммарного ранга", приведенная выше, не обеспечивает полной однозначности места при совпадении всех трёх составляющих показателей. Особенно часто это возможно на старте турнира, когда некоторые команды еще просто ни разу не сыграли и имею нули по всем показателям. При этом, чисто математически, они не находятся на последнем месте, а занимают некоторое общее место в середине таблице, оставляя места ниже командам, которые уже успели сыграть и проиграть.

Для обеспечения полной однозначности мест в таблице можно прибегнуть к двум простым приёмам.
1. Добавление случайного числа в конец "Суммарного ранга" (в два младших разряда):
[vba]
Код
=100^3 * RANK(AS2;$AS$2:$AS$11;1)
+100^2 * RANK(AR2;$AR$2:$AR$11;1)
+100^1 * RANK(AJ2;$AJ$2:$AJ$11;1)
+RANDBETWEEN(0;99)
[/vba]
2. Добавление номера строки таблицы в конец "Суммарного ранга" (в два младших разряда) - в этом случае гарантируется абсолютная однозначность:
[vba]
Код
=100^3 * RANK(AS2;$AS$2:$AS$11;1)
+100^2 * RANK(AR2;$AR$2:$AR$11;1)
+100^1 * RANK(AJ2;$AJ$2:$AJ$11;1)
+100-ROW()
[/vba]
Поскольку номер строки вычитается из 100, то "преимуществом" будут обладать команды, располагающиеся выше в исходной таблице. Что может быть логичным, например, в связи с тем, что исходная таблица для записи результатов могла быть сформирована по результатам прошлого розыгрыша, когда прошлый чемпион располагается на первой строке.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Суббота, 03.02.2018, 15:36
 
Ответить
СообщениеВ той моей теме, ссылку на которую дала Елена, в сообщении N 3 исчерпывающе изложено как построить подобную формулу, особенно во фрагментах со степенями 100 и 20.
[p.s.]ну, видимо, пока сам не покажу, никто не покажет (тэг vba вместо формульного применяю сознательно - для лучшего форматирования в целях наглядности)[/p.s.]
Итак, в соответствии с моим подходом могу предложить следующие формулы для Вашего листа "таблица".

В ячейку AV2 - "Суммарный ранг" по трём показателям (очкам, разницам сетов, разницам очков в партиях):
[vba]
Код
=100^3 * RANK(AS2;$AS$2:$AS$11;1)
+100^2 * RANK(AR2;$AR$2:$AR$11;1)
+100^1 * RANK(AJ2;$AJ$2:$AJ$11;1)
[/vba]Понятно, что это просто некий искусственно созданный показатель, ранжирование по которому, тем не менее, обеспечит правильное определение мест команд.

После ввода в ячейку AV2 протягиваем формулу на все команды в диапазоне AV2:AV11 и далее вводим формулу определения мест в ячейку AW2 (и также протягиваем в AW2:AW11):
[vba]
Код
=RANK(AV2;$AV$2:$AV$11)
[/vba]

Формула для "Суммарного ранга", приведенная выше, не обеспечивает полной однозначности места при совпадении всех трёх составляющих показателей. Особенно часто это возможно на старте турнира, когда некоторые команды еще просто ни разу не сыграли и имею нули по всем показателям. При этом, чисто математически, они не находятся на последнем месте, а занимают некоторое общее место в середине таблице, оставляя места ниже командам, которые уже успели сыграть и проиграть.

Для обеспечения полной однозначности мест в таблице можно прибегнуть к двум простым приёмам.
1. Добавление случайного числа в конец "Суммарного ранга" (в два младших разряда):
[vba]
Код
=100^3 * RANK(AS2;$AS$2:$AS$11;1)
+100^2 * RANK(AR2;$AR$2:$AR$11;1)
+100^1 * RANK(AJ2;$AJ$2:$AJ$11;1)
+RANDBETWEEN(0;99)
[/vba]
2. Добавление номера строки таблицы в конец "Суммарного ранга" (в два младших разряда) - в этом случае гарантируется абсолютная однозначность:
[vba]
Код
=100^3 * RANK(AS2;$AS$2:$AS$11;1)
+100^2 * RANK(AR2;$AR$2:$AR$11;1)
+100^1 * RANK(AJ2;$AJ$2:$AJ$11;1)
+100-ROW()
[/vba]
Поскольку номер строки вычитается из 100, то "преимуществом" будут обладать команды, располагающиеся выше в исходной таблице. Что может быть логичным, например, в связи с тем, что исходная таблица для записи результатов могла быть сформирована по результатам прошлого розыгрыша, когда прошлый чемпион располагается на первой строке.

Автор - Gustav
Дата добавления - 02.02.2018 в 20:23
Oka08 Дата: Понедельник, 05.02.2018, 10:38 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

2013
Gustav, спасибо большое, все теперь считает правильно, да и само направление теперь более понятно.
 
Ответить
СообщениеGustav, спасибо большое, все теперь считает правильно, да и само направление теперь более понятно.

Автор - Oka08
Дата добавления - 05.02.2018 в 10:38
Oka08 Дата: Среда, 07.02.2018, 12:00 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

2013
еще вопрос по той же таблице, как привязать значение ячейки на одном листе к значению ячейки в другом листе, чтобы при сортировке другого листа значения не терялись. Сейчас к примеру у меня на листе "Таблица" значения ячеек $C2$AF11 берутся через "=" с листа "игры" и если на листе игры сделать сортировку строк, то значения в листе "Таблица" сбиваются???? Просто туры расписывают организаторы и я так понял они это начали делать от балды, теперь вот под них подстраиваю таблицу.


Сообщение отредактировал Oka08 - Среда, 07.02.2018, 12:03
 
Ответить
Сообщениееще вопрос по той же таблице, как привязать значение ячейки на одном листе к значению ячейки в другом листе, чтобы при сортировке другого листа значения не терялись. Сейчас к примеру у меня на листе "Таблица" значения ячеек $C2$AF11 берутся через "=" с листа "игры" и если на листе игры сделать сортировку строк, то значения в листе "Таблица" сбиваются???? Просто туры расписывают организаторы и я так понял они это начали делать от балды, теперь вот под них подстраиваю таблицу.

Автор - Oka08
Дата добавления - 07.02.2018 в 12:00
Gustav Дата: Среда, 07.02.2018, 19:27 | Сообщение № 7
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Oka08, так Вы бы доступ к своей таблице не закрывали - глядишь, кто-то бы и помог уже. А так всё очень в уме надо представлять, не все готовы... Но даже в такую "слепую" рискну предположить, что Вам, скорее всего, нужно сочетание функций ИНДЕКС и ПОИСКПОЗ.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеOka08, так Вы бы доступ к своей таблице не закрывали - глядишь, кто-то бы и помог уже. А так всё очень в уме надо представлять, не все готовы... Но даже в такую "слепую" рискну предположить, что Вам, скорее всего, нужно сочетание функций ИНДЕКС и ПОИСКПОЗ.

Автор - Gustav
Дата добавления - 07.02.2018 в 19:27
Oka08 Дата: Четверг, 08.02.2018, 09:38 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

2013


Сообщение отредактировал Oka08 - Четверг, 08.02.2018, 09:40
 
Ответить
СообщениеGustav, https://docs.google.com/spreads....sharing

Автор - Oka08
Дата добавления - 08.02.2018 в 09:38
Gustav Дата: Четверг, 08.02.2018, 17:17 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Oka08, ну, вот, у меня родилось следующее решение. На листе "таблица" в диапазоне F2:H2 делаете шаблон из трёх ячеек с таким содержанием:
[vba]
Код
Ячейка F2: =IFERROR(--SUBSTITUTE(MAX(
            IFERROR( INDEX( 'игры'!$T$4:$T$48; ArrayFormula(MATCH($B2 & "_" & INDEX($B$2:$B$11;F$1); 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99);
            IFERROR( INDEX( 'игры'!$U$4:$U$48; ArrayFormula(MATCH(INDEX($B$2:$B$11;F$1) & "_" & $B2; 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99)
            );"-99";" ");"")

Ячейка G2: -

Ячейка H2: =IFERROR(--SUBSTITUTE(MAX(
            IFERROR( INDEX( 'игры'!$U$4:$U$48; ArrayFormula(MATCH($B2 & "_" & INDEX($B$2:$B$11;F$1); 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99);
            IFERROR( INDEX( 'игры'!$T$4:$T$48; ArrayFormula(MATCH(INDEX($B$2:$B$11;F$1) & "_" & $B2; 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99)
            );"-99";" ");"")
[/vba]
Далее совместно выделяете эти три ячейки, копируете их и вставляете в диапазон C2:AF11, после чего восстанавливаете синюю диагональ, стирая формулы в её ячейках. -99 - это произвольное заведомо минимальное число для участия в сравнениях по MAX, при желании можно самостоятельно "уменьшить", скажем, до -9 или даже -1 (но не 0 - по понятной причине).

[p.s.]Зарядил формулы в Вашу таблицу по ссылке[/p.s.]

P.P.S. Протягиваемые формулы для колонок "В 3","В 2","П 1","П" (отличаются только условиями):

[vba]
Код
Ячейка AK2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});">1")

Ячейка AL2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});"=1")

Ячейка AM2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});"=-1")

Ячейка AN2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});"<-1")
[/vba]
Формула для колонки "И" (игры) при этом становится совершенно банальной суммой:

[vba]
Код
Ячейка AG2: =SUM(AK2:AN2)
[/vba]

Формулы для колонок "С" (сеты выигранные и проигранные) тоже можно заменить на единообразные протягиваемые суммы, если (и это ключевой момент для всех формул) также НЕ исключать пустые ячейки диагонали:

[vba]
Код
Ячейка AO2: =SUM(C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2)

Ячейка AQ2: =SUM(E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2)
[/vba]

И, наконец, для суммарных очков в сетах "Ов" и "Оп" (выигранные и проигранные):

[vba]
Код
Ячейка AH2: =SUMIF('игры'!$C$4:$C$48; B2; 'игры'!$R$4:$R$48) + SUMIF('игры'!$D$4:$D$48; B2; 'игры'!$S$4:$S$48)

Ячейка AI2: =SUMIF('игры'!$C$4:$C$48; B2; 'игры'!$S$4:$S$48) + SUMIF('игры'!$D$4:$D$48; B2; 'игры'!$R$4:$R$48)
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Четверг, 08.02.2018, 21:18
 
Ответить
СообщениеOka08, ну, вот, у меня родилось следующее решение. На листе "таблица" в диапазоне F2:H2 делаете шаблон из трёх ячеек с таким содержанием:
[vba]
Код
Ячейка F2: =IFERROR(--SUBSTITUTE(MAX(
            IFERROR( INDEX( 'игры'!$T$4:$T$48; ArrayFormula(MATCH($B2 & "_" & INDEX($B$2:$B$11;F$1); 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99);
            IFERROR( INDEX( 'игры'!$U$4:$U$48; ArrayFormula(MATCH(INDEX($B$2:$B$11;F$1) & "_" & $B2; 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99)
            );"-99";" ");"")

Ячейка G2: -

Ячейка H2: =IFERROR(--SUBSTITUTE(MAX(
            IFERROR( INDEX( 'игры'!$U$4:$U$48; ArrayFormula(MATCH($B2 & "_" & INDEX($B$2:$B$11;F$1); 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99);
            IFERROR( INDEX( 'игры'!$T$4:$T$48; ArrayFormula(MATCH(INDEX($B$2:$B$11;F$1) & "_" & $B2; 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99)
            );"-99";" ");"")
[/vba]
Далее совместно выделяете эти три ячейки, копируете их и вставляете в диапазон C2:AF11, после чего восстанавливаете синюю диагональ, стирая формулы в её ячейках. -99 - это произвольное заведомо минимальное число для участия в сравнениях по MAX, при желании можно самостоятельно "уменьшить", скажем, до -9 или даже -1 (но не 0 - по понятной причине).

[p.s.]Зарядил формулы в Вашу таблицу по ссылке[/p.s.]

P.P.S. Протягиваемые формулы для колонок "В 3","В 2","П 1","П" (отличаются только условиями):

[vba]
Код
Ячейка AK2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});">1")

Ячейка AL2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});"=1")

Ячейка AM2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});"=-1")

Ячейка AN2: =COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});"<-1")
[/vba]
Формула для колонки "И" (игры) при этом становится совершенно банальной суммой:

[vba]
Код
Ячейка AG2: =SUM(AK2:AN2)
[/vba]

Формулы для колонок "С" (сеты выигранные и проигранные) тоже можно заменить на единообразные протягиваемые суммы, если (и это ключевой момент для всех формул) также НЕ исключать пустые ячейки диагонали:

[vba]
Код
Ячейка AO2: =SUM(C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2)

Ячейка AQ2: =SUM(E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2)
[/vba]

И, наконец, для суммарных очков в сетах "Ов" и "Оп" (выигранные и проигранные):

[vba]
Код
Ячейка AH2: =SUMIF('игры'!$C$4:$C$48; B2; 'игры'!$R$4:$R$48) + SUMIF('игры'!$D$4:$D$48; B2; 'игры'!$S$4:$S$48)

Ячейка AI2: =SUMIF('игры'!$C$4:$C$48; B2; 'игры'!$S$4:$S$48) + SUMIF('игры'!$D$4:$D$48; B2; 'игры'!$R$4:$R$48)
[/vba]

Автор - Gustav
Дата добавления - 08.02.2018 в 17:17
Gustav Дата: Воскресенье, 11.02.2018, 21:06 | Сообщение № 10
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Добавил динамическую шахматку на лист "положение" и стало совсем по-взрослому :) :
https://docs.google.com/spreads....PUNESeQ

Это ссылка на мою копию таблицы. В учебных целях я убрал всю "конфиденциальную" информацию (типа фамилий игроков, судей, мест проведения). Лист "положение" без труда можно скопировать в первоначальную оригинальную таблицу.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеДобавил динамическую шахматку на лист "положение" и стало совсем по-взрослому :) :
https://docs.google.com/spreads....PUNESeQ

Это ссылка на мою копию таблицы. В учебных целях я убрал всю "конфиденциальную" информацию (типа фамилий игроков, судей, мест проведения). Лист "положение" без труда можно скопировать в первоначальную оригинальную таблицу.

Автор - Gustav
Дата добавления - 11.02.2018 в 21:06
Gustav Дата: Воскресенье, 16.10.2022, 21:45 | Сообщение № 11
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Хочу поделиться новым опытом. Помогаю одному из участников нашего Форума построить удобную турнирную таблицу. За основу взяли таблицу этого топика. В процессе работы удалось применить новомодные функции таблиц Гугл, введенные совсем недавно в августе 2022. Это функции LAMBDA, MAP, SCAN, REDUCE, BYROW, BYCOL, MAKEARRAY, а также появившаяся возможность создания именованных пользовательских функций, составленных из других функций (не путать с функциями UDF, которые пишутся как скрипты).

Microsoft в некоторых особо продвинутых версиях Excel (по подписке, типа 365 или Web) ввел эти функции уже достаточно давно. Но в том-то и дело, что при проводимой им в последние годы политике, совершенно непонятно, когда пользователь конкретной версии получит их в своё активное распоряжение - ведь далеко не все имеют возможность пользования подписочной версией. Поэтому и получается, что теоретически оно, вроде, и есть, но не всегда "про нашу честь".

Google - другое дело: уж коли добавили, то всем и навсегда и, соответственно, новшествами можно начинать активно пользоваться. С нетерпением жду добавления Гуглом функции LET, хотя, как показала первая практика, и с LAMBDA уже можно творить довольно интересно, на новом уровне.

В общем, создал я две именованные функции (доступны в файле по ссылке выше, по команде меню "Данные \ Именованные функции"):
* ZCOUNT_GAME_RESULTS(range; condition) - Подсчет исходов матчей, удовлетворяющих заданному условию
* ZTOURN_CROSSTAB_CELL(teama; teambidx; rngteams; rngteamab; rngpointsab) - Вычисление содержимого ячейки турнирной таблицы ("шахматки") - счёт матча с активным разделителем (массив из 3-х ячеек)

Функции применяются на новом добавленном листе "таблица (именованные формулы)". Это копия листа "таблицы", но с новыми функциями.

Фукция ZCOUNT_GAME_RESULTS применяется в четырех колонках AK:AN ("В3","В2","П1","П"). Например, вызов в ячейке AK2 выглядит так:
[vba]
Код
=ZCOUNT_GAME_RESULTS($C2:$AF2;">1")
[/vba]
Для сравнения - на старом листе "таблицы" в аналогичной ячейке формула была такой:
[vba]
Код
=COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});">1")
[/vba]

Налицо прогресс уже хотя бы в том, что вместо утомительного перечисления ячеек по отдельности (потому что не подряд идут, а с шагом) теперь указывается просто сплошной диапазон $C2:$AF2, а уж нужные ячейки выбираются "под капотом" функции с помощью "зубодробительных" конструкций:
[vba]
Код
=ArrayFormula(COUNTIF(MAP(
HLOOKUP(FILTER(SEQUENCE(1;COLUMNS(range);1;3);SEQUENCE(1;COLUMNS(range);1;3)<=COLUMNS(range));{SEQUENCE(1;COLUMNS(range));range};2;0);
HLOOKUP(FILTER(SEQUENCE(1;COLUMNS(range);3;3);SEQUENCE(1;COLUMNS(range);3;3)<=COLUMNS(range));{SEQUENCE(1;COLUMNS(range));range};2;0);
LAMBDA(points1; points2; points1-points2)
);condition))
[/vba]
Особый кайф - в использовании внутри формулы имен параметров - range и condition, а не ссылок на ячейки. Очень удобно при разработке.

Вторая моя функция ZTOURN_CROSSTAB_CELL применяется на том же листе "таблица (именованные формулы)" в каждой третьей ячейке диапазона C2:AF11. Вызов в ячейке F2:
[vba]
Код
=ZTOURN_CROSSTAB_CELL($B2; F$1; $B$2:$B$11; 'игры'!$C:$D; 'игры'!$T:$V)
[/vba]
Формула хорошо протягивается по всему диапазону C2:AF11. При копировании фактически меняются только два первых параметра - команда строки и команда столбца (копировать нужно сразу три ячейки подряд - первую с формулой и две следующие справа. Один указанный вызов формулы заменяет две старых формулы вида (тоже для F2):
[vba]
Код
=IFERROR(--SUBSTITUTE(MAX(
            IFERROR( INDEX( 'игры'!$T$4:$T$48; ArrayFormula(MATCH($B2 & "_" & INDEX($B$2:$B$11;F$1); 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99);
            IFERROR( INDEX( 'игры'!$V$4:$V$48; ArrayFormula(MATCH(INDEX($B$2:$B$11;F$1) & "_" & $B2; 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99)
            );"-99";" ");"")
[/vba]

Под капотом же у функции ZTOURN_CROSSTAB_CELL еще более серьезная картина:
[vba]
Код
=SPLIT(REDUCE(JOIN("|";
IFERROR(FILTER({rngTeamAB\rngPointsAB};
               (INDEX(rngTeamAB;0;1) & INDEX(rngTeamAB;0;2) = teamA & INDEX(rngTeams;teamBidx)) +
               (INDEX(rngTeamAB;0;1) & INDEX(rngTeamAB;0;2) = INDEX(rngTeams;teamBidx) & teamA)
        );
        {""\""\""\""\""}
));"";LAMBDA(tot;val;
IF(INDEX(SPLIT(tot;"|";;);1)=teamA;
   IF(AND(INDEX(SPLIT(tot;"|";;);3)<>"";INDEX(SPLIT(tot;"|";;);4)="";INDEX(SPLIT(tot;"|";;);5)<>"");
      CONCATENATE(INDEX(SPLIT(tot;"|";;);3);"|-|";INDEX(SPLIT(tot;"|";;);5));
      CONCATENATE(INDEX(SPLIT(tot;"|";;);3);"|";INDEX(SPLIT(tot;"|";;);4);"|";INDEX(SPLIT(tot;"|";;);5))
   );
   IF(AND(INDEX(SPLIT(tot;"|";;);3)<>"";INDEX(SPLIT(tot;"|";;);4)="";INDEX(SPLIT(tot;"|";;);5)<>"");
      CONCATENATE(INDEX(SPLIT(tot;"|";;);5);"|-|";INDEX(SPLIT(tot;"|";;);3));
      CONCATENATE(INDEX(SPLIT(tot;"|";;);5);"|";INDEX(SPLIT(tot;"|";;);4);"|";INDEX(SPLIT(tot;"|";;);3)))
)));"|";;)
[/vba]
Но это ж "внутренности", а снаружи - всего лишь идентификатор функции и пять параметров. А на внутренности практикующему пользователю таблицы можно и "забить", оставив их разработчику.

В общем, рекомендую новшествами увлечься. Как минимум, это не скучно.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 16.10.2022, 21:46
 
Ответить
СообщениеХочу поделиться новым опытом. Помогаю одному из участников нашего Форума построить удобную турнирную таблицу. За основу взяли таблицу этого топика. В процессе работы удалось применить новомодные функции таблиц Гугл, введенные совсем недавно в августе 2022. Это функции LAMBDA, MAP, SCAN, REDUCE, BYROW, BYCOL, MAKEARRAY, а также появившаяся возможность создания именованных пользовательских функций, составленных из других функций (не путать с функциями UDF, которые пишутся как скрипты).

Microsoft в некоторых особо продвинутых версиях Excel (по подписке, типа 365 или Web) ввел эти функции уже достаточно давно. Но в том-то и дело, что при проводимой им в последние годы политике, совершенно непонятно, когда пользователь конкретной версии получит их в своё активное распоряжение - ведь далеко не все имеют возможность пользования подписочной версией. Поэтому и получается, что теоретически оно, вроде, и есть, но не всегда "про нашу честь".

Google - другое дело: уж коли добавили, то всем и навсегда и, соответственно, новшествами можно начинать активно пользоваться. С нетерпением жду добавления Гуглом функции LET, хотя, как показала первая практика, и с LAMBDA уже можно творить довольно интересно, на новом уровне.

В общем, создал я две именованные функции (доступны в файле по ссылке выше, по команде меню "Данные \ Именованные функции"):
* ZCOUNT_GAME_RESULTS(range; condition) - Подсчет исходов матчей, удовлетворяющих заданному условию
* ZTOURN_CROSSTAB_CELL(teama; teambidx; rngteams; rngteamab; rngpointsab) - Вычисление содержимого ячейки турнирной таблицы ("шахматки") - счёт матча с активным разделителем (массив из 3-х ячеек)

Функции применяются на новом добавленном листе "таблица (именованные формулы)". Это копия листа "таблицы", но с новыми функциями.

Фукция ZCOUNT_GAME_RESULTS применяется в четырех колонках AK:AN ("В3","В2","П1","П"). Например, вызов в ячейке AK2 выглядит так:
[vba]
Код
=ZCOUNT_GAME_RESULTS($C2:$AF2;">1")
[/vba]
Для сравнения - на старом листе "таблицы" в аналогичной ячейке формула была такой:
[vba]
Код
=COUNTIF(ARRAYFORMULA({C2;F2;I2;L2;O2;R2;U2;X2;AA2;AD2}-{E2;H2;K2;N2;Q2;T2;W2;Z2;AC2;AF2});">1")
[/vba]

Налицо прогресс уже хотя бы в том, что вместо утомительного перечисления ячеек по отдельности (потому что не подряд идут, а с шагом) теперь указывается просто сплошной диапазон $C2:$AF2, а уж нужные ячейки выбираются "под капотом" функции с помощью "зубодробительных" конструкций:
[vba]
Код
=ArrayFormula(COUNTIF(MAP(
HLOOKUP(FILTER(SEQUENCE(1;COLUMNS(range);1;3);SEQUENCE(1;COLUMNS(range);1;3)<=COLUMNS(range));{SEQUENCE(1;COLUMNS(range));range};2;0);
HLOOKUP(FILTER(SEQUENCE(1;COLUMNS(range);3;3);SEQUENCE(1;COLUMNS(range);3;3)<=COLUMNS(range));{SEQUENCE(1;COLUMNS(range));range};2;0);
LAMBDA(points1; points2; points1-points2)
);condition))
[/vba]
Особый кайф - в использовании внутри формулы имен параметров - range и condition, а не ссылок на ячейки. Очень удобно при разработке.

Вторая моя функция ZTOURN_CROSSTAB_CELL применяется на том же листе "таблица (именованные формулы)" в каждой третьей ячейке диапазона C2:AF11. Вызов в ячейке F2:
[vba]
Код
=ZTOURN_CROSSTAB_CELL($B2; F$1; $B$2:$B$11; 'игры'!$C:$D; 'игры'!$T:$V)
[/vba]
Формула хорошо протягивается по всему диапазону C2:AF11. При копировании фактически меняются только два первых параметра - команда строки и команда столбца (копировать нужно сразу три ячейки подряд - первую с формулой и две следующие справа. Один указанный вызов формулы заменяет две старых формулы вида (тоже для F2):
[vba]
Код
=IFERROR(--SUBSTITUTE(MAX(
            IFERROR( INDEX( 'игры'!$T$4:$T$48; ArrayFormula(MATCH($B2 & "_" & INDEX($B$2:$B$11;F$1); 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99);
            IFERROR( INDEX( 'игры'!$V$4:$V$48; ArrayFormula(MATCH(INDEX($B$2:$B$11;F$1) & "_" & $B2; 'игры'!$C$4:$C$48 & "_" & 'игры'!$D$4:$D$48;0)) ); -99)
            );"-99";" ");"")
[/vba]

Под капотом же у функции ZTOURN_CROSSTAB_CELL еще более серьезная картина:
[vba]
Код
=SPLIT(REDUCE(JOIN("|";
IFERROR(FILTER({rngTeamAB\rngPointsAB};
               (INDEX(rngTeamAB;0;1) & INDEX(rngTeamAB;0;2) = teamA & INDEX(rngTeams;teamBidx)) +
               (INDEX(rngTeamAB;0;1) & INDEX(rngTeamAB;0;2) = INDEX(rngTeams;teamBidx) & teamA)
        );
        {""\""\""\""\""}
));"";LAMBDA(tot;val;
IF(INDEX(SPLIT(tot;"|";;);1)=teamA;
   IF(AND(INDEX(SPLIT(tot;"|";;);3)<>"";INDEX(SPLIT(tot;"|";;);4)="";INDEX(SPLIT(tot;"|";;);5)<>"");
      CONCATENATE(INDEX(SPLIT(tot;"|";;);3);"|-|";INDEX(SPLIT(tot;"|";;);5));
      CONCATENATE(INDEX(SPLIT(tot;"|";;);3);"|";INDEX(SPLIT(tot;"|";;);4);"|";INDEX(SPLIT(tot;"|";;);5))
   );
   IF(AND(INDEX(SPLIT(tot;"|";;);3)<>"";INDEX(SPLIT(tot;"|";;);4)="";INDEX(SPLIT(tot;"|";;);5)<>"");
      CONCATENATE(INDEX(SPLIT(tot;"|";;);5);"|-|";INDEX(SPLIT(tot;"|";;);3));
      CONCATENATE(INDEX(SPLIT(tot;"|";;);5);"|";INDEX(SPLIT(tot;"|";;);4);"|";INDEX(SPLIT(tot;"|";;);3)))
)));"|";;)
[/vba]
Но это ж "внутренности", а снаружи - всего лишь идентификатор функции и пять параметров. А на внутренности практикующему пользователю таблицы можно и "забить", оставив их разработчику.

В общем, рекомендую новшествами увлечься. Как минимум, это не скучно.

Автор - Gustav
Дата добавления - 16.10.2022 в 21:45
Oka08 Дата: Пятница, 31.03.2023, 12:53 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

2013
Здравствуйте, столкнулся с проблемой при настройке нового турнира, по положению почему то они сделали фактор личной встречи главнее разницы очков в сетах. Теперь не могу добавить ранжирование для личной встречи. Не могли бы помочь?
В таблице лист "Таблица"

https://docs.google.com/spreads....9612340
 
Ответить
СообщениеЗдравствуйте, столкнулся с проблемой при настройке нового турнира, по положению почему то они сделали фактор личной встречи главнее разницы очков в сетах. Теперь не могу добавить ранжирование для личной встречи. Не могли бы помочь?
В таблице лист "Таблица"

https://docs.google.com/spreads....9612340

Автор - Oka08
Дата добавления - 31.03.2023 в 12:53
Gustav Дата: Пятница, 31.03.2023, 18:13 | Сообщение № 13
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
сделали фактор личной встречи главнее разницы очков в сетах. Теперь не могу добавить ранжирование для личной встречи

Надо же, 5 лет прошло! Это говорит о том, что вопросы турнирных таблиц - вечные вопросы! Как "Всемирная история, банк Империал" :)

Вопрос учета встреч между собой при равенстве турнирных очков у двух и более участников подробно рассмотрен в сообщении №3 в теме Турнирная таблица, ссылка на которую дана Еленой (Pelena) в этом топике чуть выше (в сообщении №2). Вот моя цитата оттуда (сейчас я лучше не скажу):

Итак, по поводу мини-чемпионатов среди команд, набравших равное количество очков. Оказалось, что надо к основной шахматке добавить еще одну, в которой отобразить только матчи среди команд с одинаковыми очками. По ней посчитать показатели и добавить в общую формулу ранга (на соответствующих позициях).

Эта дополнительная шахматка будет общей и единой (и вот в это не сразу верится!) для всех команд, имеющих равные очки с еще какими-нибудь командами. И неважно, какие равноочковые группы встретятся в ней. В примере из файла в дополнительную шахматку вынесены только матчи между командами, имеющими по 8 очков (4 команды) и по 6 очков (2 команды). Поначалу же казалось, что для каждой равноочковой группы нужно завести по отдельной таблице (и даже были громоздкие попытки реализации).

Там, в сообщении № 3, есть прикрепленный файл архива HockeyTab_EW.rar. Внутри архива - файл Excel с турнирной таблицей чемпионата отдела по настольному хоккею. В таблице чётко наблюдается основная шахматка (красочно расцвеченная, с черной главной диагональю). А справа от основной шахматки - ещё одна (блеклая, с серой главной диагональю), очень неполная по результатам, но именно в этом ее смысл. Вот эту дополнительную "серую" шахматку Вам и надо изучить и по аналогии воспроизвести в своей таблице. Понятно, что её всегда можно скрыть от посторонних глаз (скрыть столбцы).


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
сделали фактор личной встречи главнее разницы очков в сетах. Теперь не могу добавить ранжирование для личной встречи

Надо же, 5 лет прошло! Это говорит о том, что вопросы турнирных таблиц - вечные вопросы! Как "Всемирная история, банк Империал" :)

Вопрос учета встреч между собой при равенстве турнирных очков у двух и более участников подробно рассмотрен в сообщении №3 в теме Турнирная таблица, ссылка на которую дана Еленой (Pelena) в этом топике чуть выше (в сообщении №2). Вот моя цитата оттуда (сейчас я лучше не скажу):

Итак, по поводу мини-чемпионатов среди команд, набравших равное количество очков. Оказалось, что надо к основной шахматке добавить еще одну, в которой отобразить только матчи среди команд с одинаковыми очками. По ней посчитать показатели и добавить в общую формулу ранга (на соответствующих позициях).

Эта дополнительная шахматка будет общей и единой (и вот в это не сразу верится!) для всех команд, имеющих равные очки с еще какими-нибудь командами. И неважно, какие равноочковые группы встретятся в ней. В примере из файла в дополнительную шахматку вынесены только матчи между командами, имеющими по 8 очков (4 команды) и по 6 очков (2 команды). Поначалу же казалось, что для каждой равноочковой группы нужно завести по отдельной таблице (и даже были громоздкие попытки реализации).

Там, в сообщении № 3, есть прикрепленный файл архива HockeyTab_EW.rar. Внутри архива - файл Excel с турнирной таблицей чемпионата отдела по настольному хоккею. В таблице чётко наблюдается основная шахматка (красочно расцвеченная, с черной главной диагональю). А справа от основной шахматки - ещё одна (блеклая, с серой главной диагональю), очень неполная по результатам, но именно в этом ее смысл. Вот эту дополнительную "серую" шахматку Вам и надо изучить и по аналогии воспроизвести в своей таблице. Понятно, что её всегда можно скрыть от посторонних глаз (скрыть столбцы).

Автор - Gustav
Дата добавления - 31.03.2023 в 18:13
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!