Подскажите пожалуйста, у кого есть идея алгоритма как сформировать заплывы на соревнованиях. нужна идея.
задача: (реализовывать буду через макрос- нажал кнопку и получил результат.)
Есть таблица с реквизитами пловцов (файл приложу). Заплывы формируются по группам, дистанциям, полу, из сортированной таблицы по группам, дистанциям, полу и заявленному результату. При этом бассейны могут быть с 4, 6, 8 дорожками (задаем в параметре) мне надо придумать как разбить спортсменов чтобы заплывы формировались так: берем 6 дорожек бассейн, для первого заплыва топ шесть спортсменов выставляем первого на 3 дорожку, второго на 4, третьего на 2, четверного на 5, пятого на 1 и шестого на 6. берем следующие 6 записей с 7 и расставляем порядок дорожек с максимума до минимума 3 4, 2 5, 1 6. для бассейна на 4 дорожки расставлять 2 3, 1 4 для восьми дорожек 4 5, 3 6, 2 7, 1 8. и так до конца списка девочек отдельно, мальчиков отдельно. Но если остается 1 человек в остатке, то 1 и 6 дорожку забрать на последний заплыв или хотя бы одну 6ую или 4ую или 8ую.
А уже эту таблицу сортировать по заплывам и дорожкам 3 строки кода.
Пошагово делать на мой взгляд не очень красиво. А хочется красиво и лаконично например как поиск и выборка данных по многим ячейкам способом сложения поисковых ячеек в одну ключевую и поиск по этому ключу. просто и удобно и кода мало. Рассматриваю такую идею с ключевыми полями, но может кто предложит интереснее?
А так тренера заставляют родителей и спортсменов ждать 20-30 минут пока вручную сведут данные и распределят места.
Sub Sort_ID()
Dim lr&, fr&, r As Range
fr = Range("A8").Row: lr = Cells(Rows.Count, "A").End(xlUp).Row
Set r = Range("A" & fr & ":W" & lr)
With r: .Sort .Cells(1, 1): End With
End Sub
Sub Заплывы()
Dim d, i&, k&, lr&, fr&, r As Range
fr = Range("A8").Row: lr = Cells(Rows.Count, "A").End(xlUp).Row
Set r = Range("A" & fr & ":W" & lr)
d = InputBox("Сколько дорожек в бассейне"): If d = 0 Or d > 8 Then Exit Sub
[B3] = d
Application.ScreenUpdating = 0
With r
.Sort .Cells(1, "C"), , .Cells(1, "F"), , , .Cells(1, "L")
.Cells(1, "W") = 1: k = 1
For i = 1 To lr - fr + 1
If .Cells(i, "F") <> .Cells(i + 1, "F") Or k >= d Then 'вспомогательный столбец W
k = 1: .Cells(i + 1, "W") = k
If .Cells(i, "W") = 1 Then .Cells(i, "W") = 2: .Cells(i - 1, "W") = 1 'исключение одиночного заплыва
Else
k = k + 1: .Cells(i + 1, "W") = k
End If
Select Case .Cells(i, "W") 'дорожки
Case 1: .Cells(i, "U") = 3
Case 2: .Cells(i, "U") = 4
Case 3: .Cells(i, "U") = 2
Case 4: .Cells(i, "U") = 5
Case 5: .Cells(i, "U") = 1
Case 6: .Cells(i, "U") = 6
End Select
Next
.Cells(i, "W") = "" 'затереть лишнее окончание
.Cells(1, "V") = 1: k = 1 'заплыв
For i = 2 To lr - fr + 1
.Cells(i, "V") = k
If .Cells(i, "W") = 1 Then k = k + 1: .Cells(i, "V") = k
Next
End With
End Sub
Маугли, Коллега, для 6 дорожек получилось, что в 4 заплыве только один участник. Да и число заплывов 7 не многовато ли? По идее, можно и в 5 вписаться.
Добрый день,Андрей!Я так понял задачу.Мальчики отдельно-девочки отдельно в каждой категории. Что поделаешь, если в этой категории одна девушка: придеться плыть одной. В категории VD - девочки получилось два заплыва 6 и 7 Автору виднее, посмотрим..
Маугли написал: В категории VD - девочки получилось два заплыва 6 и 7
А да, упустил, что нужно сначала сгруппировать участников по возможности совместного заплыва по категориям и полу. Приношу свои извинения. Решал задачу относительно уже выполненнего отбора.
Вариант Маугли хорош. Уточнил у тренера, да, Андрей Вы правы, по регламенту соревнований в последнем заплыве группы если остается один участник, то надо оставить в предыдущем 5 участников (для 6 дорожек), а в последнем будет 2 участника. (моменты где есть один участник в группе невозможен по регламенту т.к. участников всегда больше чем в тестовом файле, но код эту ситуацию обрабатывает и это хорошо). Девочки и мальчики плывут отдельно, у них таблица разрядов разная, Правда бывают случаи, сам наблюдал с балкона, когда делали отступления и совмещали два заплыва в один, но это редкость и уже будет ручная корректировка. Да и ближайшие соревнования будут через неделю попробую обкатать и выложу, что получится. Сейчас при создании массива участников добавил ключевое поле, которое складывается по формуле "Категория &100+дистанция&пол". потом по этому полю и по заявленному времени сортирую и в коде Маугли дописал Case на выбранный бассейн с 4 и 8 дорожками. Сейчас разберусь еще с подсчетом участников одного заплыва, чтобы не оставался сирота в последнем заплыве и все будет хорошо. Спасибо за помощь и за готовый код.
Насколько я понял какие бы критерии не учитывались при разделении на группы, самое главное это правильно раздать дорожки согласно заявкам. Если нужно учитывать критерии для разделения на группы, то отметьте столбцы с критериями "+" (как в приложенном файле). Раздача дорожек по двойному клику на заголовке "Дорожки". Сирот не будет по принципу добавки одного из предыдущих. При добавлении/удалении столбцов, работоспособность должна сохраняться Количество дорожек любое, при 10-ти нумерация с нуля.
Здравствуйте. Загорелся разобраться в формировании стартовых и итоговых протоколов в эксель, но мало что понимаю в этом (к моему сожалению) . И наткнулся на этот сайт, уже увидел тут готовые файлы с кодами. но не могу понять как нужно вбивать время, чтобы автоматически всё редактировалось, и как сделать чтобы сначала указывался один раз заплыв, потом номера дорожек. и чтобы потом при вводе итогового результата автоматически редактировалось. ( как на всероссийских соревнованиях). Знаю, что у них есть специальная программа, но интересно как это работает через эксель. если можно, то какое-нибудь обучающее видео или запись экрана как этим всем пользоваться. Надеюсь мне кто-нибудь ответит)