Задача не представляет практического интереса (можно ручками график поправить, если что), но и в раздел "мозгового штурма" не подходит из-за свое простоты
график дежурства, где каждый день новый дежурный следующий плюсик - дежурство, минус - отсутствие человека, значит дежурит следующий на первом листе строится график по простой формуле, имеющий недостатки "размножения" плюсиков при наличия не одного минусика
на втором листе удалось победить размножение (но не до конца)
не получилось закольцевать дежурство - эксел жалуется на кольцевую ссылку как сделать из кольца спираль?
вторая подзадача - если человека нет один день (или два), то он не должен пропускать дежурство, а должен отдежурить вне очереди, отодвинув следующего в сдвинутом из-за его отсутствия графике. т.е. его плюсик в день его выхода после прогула
приложенный файл приложен в качестве иллюстрации
Задача не представляет практического интереса (можно ручками график поправить, если что), но и в раздел "мозгового штурма" не подходит из-за свое простоты
график дежурства, где каждый день новый дежурный следующий плюсик - дежурство, минус - отсутствие человека, значит дежурит следующий на первом листе строится график по простой формуле, имеющий недостатки "размножения" плюсиков при наличия не одного минусика
на втором листе удалось победить размножение (но не до конца)
не получилось закольцевать дежурство - эксел жалуется на кольцевую ссылку как сделать из кольца спираль?
вторая подзадача - если человека нет один день (или два), то он не должен пропускать дежурство, а должен отдежурить вне очереди, отодвинув следующего в сдвинутом из-за его отсутствия графике. т.е. его плюсик в день его выхода после прогула
приложенный файл приложен в качестве иллюстрациикарандаш
есть список сотрудников - по вертикали есть список дней (исключая выходные) - по горизонтали клетки диапазона [сотрудники, дни] может принимать три значения: - пусто - сотрудник на работе - плюс - сотрудник дежурит - минус - сотрудник отсутствует в этот день по какой-либо причине и поэтому дежурить не может
необходимые условия: - в один день дежурит только один сотрудник - сотрудник дежурит не более "одного раз за круг". Т.е. отдежурив один день, он не дежурит пока не отдежурят остальные - сотрудник дежурит не менее "одного раз за круг". Т.е. не может пропустить дежурство в круге. Если он пропустил назначенный ему день по какой-то причине (в клетке стоит минус), то он дежурит как только выходит на работу (если длина его прогула в днях больше, чем кол-во сотрудников (т.е. пока его не было один круг дежурства прошëл), то он дежурит по обычной схеме, т.е. пропученные дежурства не накапливаются, т.е. пропустив два круга он потом по выходе на работу не имеет долга в два дежурства. (условие дежурит не менее 1 раза за круг можно видоизменить для более общего решения на "не менее 1 раза за полкруга" (или 5 дней), например. Ведь если сотрудника не было, то он не пользовался плодами дежурства других, значит не имеет перед ними обязательств, значит может не отрабатывать пропущенное дежурство по выходу на работу)
пуск задачи: - выставляем + в любой ячейке первого столбца диапазона и остальные автоматом заполняются
эксплуатаци графика: - ставим минус в некоторый день для некоторого сотрудника и если минус стоит там, где расчитался плюс-дежурство, то график автомтически переставляет плюсики (регенерация поврежденных участков - если надо убрать минусы (сотрудник все же решил выйти на работу), то можно * - просто скопировать пустые ячейки с формулой на место минусов ** - можно стереть минусы, а затем запустить макрос, который проверит все клетки диапазона и заполнит пустые ячейки формулой алгоритма) ---------------------------------------------
все
проблемы: - первая и главная (даже без прогулов-минусов) - замкнуть круг дежурства - т.е. назначить дежурным первого по списку сотрудника после дня дежурства последнего (это борьба с цикличностью ссылки) - при долгом отсутствии сотрудников двух рядом "плюсики" разможаются (в том алгоритме, что в приложенном файле)
В принципе, было бы логично написать макрос для диапазона (а не формулу в каждую ячейку) а в диапазоне допустить пользователя только ставить и стирать только минусы - остальную картинку пусть рисует макрос каждый раз после внесения изменения (кликнул в пустую ячейку мышой - поставил минус, кликнул в ячейку с минусом - убрал его)
описание сути задачи попытка номер раз
есть список сотрудников - по вертикали есть список дней (исключая выходные) - по горизонтали клетки диапазона [сотрудники, дни] может принимать три значения: - пусто - сотрудник на работе - плюс - сотрудник дежурит - минус - сотрудник отсутствует в этот день по какой-либо причине и поэтому дежурить не может
необходимые условия: - в один день дежурит только один сотрудник - сотрудник дежурит не более "одного раз за круг". Т.е. отдежурив один день, он не дежурит пока не отдежурят остальные - сотрудник дежурит не менее "одного раз за круг". Т.е. не может пропустить дежурство в круге. Если он пропустил назначенный ему день по какой-то причине (в клетке стоит минус), то он дежурит как только выходит на работу (если длина его прогула в днях больше, чем кол-во сотрудников (т.е. пока его не было один круг дежурства прошëл), то он дежурит по обычной схеме, т.е. пропученные дежурства не накапливаются, т.е. пропустив два круга он потом по выходе на работу не имеет долга в два дежурства. (условие дежурит не менее 1 раза за круг можно видоизменить для более общего решения на "не менее 1 раза за полкруга" (или 5 дней), например. Ведь если сотрудника не было, то он не пользовался плодами дежурства других, значит не имеет перед ними обязательств, значит может не отрабатывать пропущенное дежурство по выходу на работу)
пуск задачи: - выставляем + в любой ячейке первого столбца диапазона и остальные автоматом заполняются
эксплуатаци графика: - ставим минус в некоторый день для некоторого сотрудника и если минус стоит там, где расчитался плюс-дежурство, то график автомтически переставляет плюсики (регенерация поврежденных участков - если надо убрать минусы (сотрудник все же решил выйти на работу), то можно * - просто скопировать пустые ячейки с формулой на место минусов ** - можно стереть минусы, а затем запустить макрос, который проверит все клетки диапазона и заполнит пустые ячейки формулой алгоритма) ---------------------------------------------
все
проблемы: - первая и главная (даже без прогулов-минусов) - замкнуть круг дежурства - т.е. назначить дежурным первого по списку сотрудника после дня дежурства последнего (это борьба с цикличностью ссылки) - при долгом отсутствии сотрудников двух рядом "плюсики" разможаются (в том алгоритме, что в приложенном файле)
В принципе, было бы логично написать макрос для диапазона (а не формулу в каждую ячейку) а в диапазоне допустить пользователя только ставить и стирать только минусы - остальную картинку пусть рисует макрос каждый раз после внесения изменения (кликнул в пустую ячейку мышой - поставил минус, кликнул в ячейку с минусом - убрал его)карандаш
Сообщение отредактировал карандаш - Пятница, 15.02.2013, 07:14
карандаш, Вы догадываетесь зачем нужен файл-пример? Для того что бы видеть исходные данные и результат, которого необходимо достигнуть В Вашем примере есть только исходные данные Если Вам нужно решение, то необходимо видеть что должно быть в итоге Этот итог Вы проставляете вручную, а мы пишем формулы/макросы для его достижения
Даже читать не стал
карандаш, Вы догадываетесь зачем нужен файл-пример? Для того что бы видеть исходные данные и результат, которого необходимо достигнуть В Вашем примере есть только исходные данные Если Вам нужно решение, то необходимо видеть что должно быть в итоге Этот итог Вы проставляете вручную, а мы пишем формулы/макросы для его достиженияSerge_007
рисунок может быть и другой и раскладка расписания дежурства тоже может быть иная представление информации не ограничено просто необходимо, чтобы выполнялись условия дежурства по порядку, а в случае пропуска должник отдежурил пропущенное дежурство а будет это шахматка или ещ§ что-то - это не важно
Serge_007, файл-рисунок прикрепляю
рисунок может быть и другой и раскладка расписания дежурства тоже может быть иная представление информации не ограничено просто необходимо, чтобы выполнялись условия дежурства по порядку, а в случае пропуска должник отдежурил пропущенное дежурство а будет это шахматка или ещ§ что-то - это не важнокарандаш
Итог в моëм файле - это картинка из файла-примера gd-cl-simple.xls если, как там нарисовано, поставить плюс в ячейку с желтым фоном (исходное, первое дежурство в произвольную дату произвольного человека), то алгоритм должен расставить зеленые плюсики поочередного дежурства. А если у него на пути появляются красные минусы (расставленные вручную), то он должен их обойти и расставить зелëные плюсы согласно логике рассуждения в задании. Картинка - иллюстрация правильной работы алгоритма при входных условиях: один плюс (желтый) и какое угодно кол-во и расположение минусов в диапазоне {фамилии:дни} программа должна сама нарисовать зеленые плюсы дежурства как на на картинке
я просто не понимаю как еще объяснить по другому Словами написал, картинку приложил моя программа не работает как надо и показать она ничего не может. Она в первом файле на первом листе. Работает по упрощ§нному алгоритму на втором листе я попробовал еë усовершенствовать - не получилось, вообще сломалась Требуемый результат нарисовал в файле примере.
Как и просили, нарисовал от руки итог - как должен выглядеть график, если бы алгоритм работал как описано словами в развернутом пояснении.
если не к месту - убейте тему в описании задачи написал - Академический интерес в первых же строках поста написал, что практического применения особого нет - если что, то ручками перерисовывают график, т.к. это проще, чем заставить комп как-то изголяться (точнее самому свернуть мозги, заставив комп правильно рисовать график)
Итог в моëм файле - это картинка из файла-примера gd-cl-simple.xls если, как там нарисовано, поставить плюс в ячейку с желтым фоном (исходное, первое дежурство в произвольную дату произвольного человека), то алгоритм должен расставить зеленые плюсики поочередного дежурства. А если у него на пути появляются красные минусы (расставленные вручную), то он должен их обойти и расставить зелëные плюсы согласно логике рассуждения в задании. Картинка - иллюстрация правильной работы алгоритма при входных условиях: один плюс (желтый) и какое угодно кол-во и расположение минусов в диапазоне {фамилии:дни} программа должна сама нарисовать зеленые плюсы дежурства как на на картинке
я просто не понимаю как еще объяснить по другому Словами написал, картинку приложил моя программа не работает как надо и показать она ничего не может. Она в первом файле на первом листе. Работает по упрощ§нному алгоритму на втором листе я попробовал еë усовершенствовать - не получилось, вообще сломалась Требуемый результат нарисовал в файле примере.
Как и просили, нарисовал от руки итог - как должен выглядеть график, если бы алгоритм работал как описано словами в развернутом пояснении.
если не к месту - убейте тему в описании задачи написал - Академический интерес в первых же строках поста написал, что практического применения особого нет - если что, то ручками перерисовывают график, т.к. это проще, чем заставить комп как-то изголяться (точнее самому свернуть мозги, заставив комп правильно рисовать график)карандаш
В приложенном файле на листе 1 в А1:А2 (10 и 15) - исходные данные, в В1 (25) - результат, потому что А1 и А2 надо сложить между собой"
Что мешает Вам нормально объяснять?
это невозможно (по крайней мере, для меня) у меня не получается рассуждать в категориях содержимого ячеек, если неясен сам алгоритм я не могу сказать, что должно быть в ячейке В1, потому, что его содержимое зависит от содержимого столбца, в котором находится эта ячейка и от содержимого столбцов, которые предшествовали по дате данную ячейку вариантов очень много и описать их в категории содержимого ячеек я не знаю как. поэтому попробовал объяснить "правила расчета" в "общем виде" и проиллюстрировал "итог" картинкой, где запечатлена некая ситуация, по которой можно понять суть алгоритма (если можно, конечно, понять)
но я попробую
Цитата (Serge_007)
В приложенном файле на листе 1 в А1:А2 (10 и 15) - исходные данные, в В1 (25) - результат, потому что А1 и А2 надо сложить между собой"
Что мешает Вам нормально объяснять?
это невозможно (по крайней мере, для меня) у меня не получается рассуждать в категориях содержимого ячеек, если неясен сам алгоритм я не могу сказать, что должно быть в ячейке В1, потому, что его содержимое зависит от содержимого столбца, в котором находится эта ячейка и от содержимого столбцов, которые предшествовали по дате данную ячейку вариантов очень много и описать их в категории содержимого ячеек я не знаю как. поэтому попробовал объяснить "правила расчета" в "общем виде" и проиллюстрировал "итог" картинкой, где запечатлена некая ситуация, по которой можно понять суть алгоритма (если можно, конечно, понять)
попробую так: имеем произвольный диапазон (например, R5C4:R24C120) содержимое ячеек диапазона может принимать три состояния: +, -, пусто + должен быть только один в каждом столбце диапазона (если все ячейки столбца не заняты минусом) (кол-во 1 на один столбец диапазона) - может быть в любой ячейке диапазона (кол-во не ограничено) пусто может быть в любой ячейке диапазона (кол-во не ограничено)
- устанавливается и удаляется (заменяется на пусто) пользователем + устанавливается пользователем в произвольной (т.н. "начальной") ячейке только в крайнем левом (т.н. "начальном") столбце диапазона
"текущая" строка - строка, с которой производится действие. Соответственно именуется "текущим" столбец. "следующая" строка - строка на один номер больше "текущей". Если "текущая" строка последняя в диапазоне, то "следующая" строка - первая строка диапазона. Т.к. строки замкнуты в "цикл" "следующий" столбец - столбец на номер больше "текущего". "следующая" ячейка - ячека на пересечении соответствующих столбца и строки.
Правило установки +:
[vba]
Код
если нет строк с "долгом", то М: если "следующая ячейка"<> - то "следующая ячейка"=+; перейти к следующему столбцу иначе строка ="долг"+1 "следующей ячейкой" становится ячейка на строку ниже (с учетом замкнутости строк по циклу) если "цикл" не закончился, то М: иначе перейти на следующий столбец и на М: (и так до конца диапазона) иначе найти первую строку с долгом N: если "ячейка"<> - то "долг" списать; если "долг">"долг макс" то перейти Н: иначе "ячейка"=+; перейти к следующему столбцу и на М: иначе Н: найти следущую строку с "долгом"; перейти на N: если не удалось списать "долг" ни с одной строки, то на перейти на М:
[/vba]
"долг" образуется при условии, когда надо в ячейку поставить плюс, а там стоит минус "долг" наращивается при выполнении предыдущего условия и когда он достигает некоторого значения, то перестает быть долгом, т.е обнуляется
где-то так
прим.*** а может лт эксел послать сообщение в аську?
попробую так: имеем произвольный диапазон (например, R5C4:R24C120) содержимое ячеек диапазона может принимать три состояния: +, -, пусто + должен быть только один в каждом столбце диапазона (если все ячейки столбца не заняты минусом) (кол-во 1 на один столбец диапазона) - может быть в любой ячейке диапазона (кол-во не ограничено) пусто может быть в любой ячейке диапазона (кол-во не ограничено)
- устанавливается и удаляется (заменяется на пусто) пользователем + устанавливается пользователем в произвольной (т.н. "начальной") ячейке только в крайнем левом (т.н. "начальном") столбце диапазона
"текущая" строка - строка, с которой производится действие. Соответственно именуется "текущим" столбец. "следующая" строка - строка на один номер больше "текущей". Если "текущая" строка последняя в диапазоне, то "следующая" строка - первая строка диапазона. Т.к. строки замкнуты в "цикл" "следующий" столбец - столбец на номер больше "текущего". "следующая" ячейка - ячека на пересечении соответствующих столбца и строки.
Правило установки +:
[vba]
Код
если нет строк с "долгом", то М: если "следующая ячейка"<> - то "следующая ячейка"=+; перейти к следующему столбцу иначе строка ="долг"+1 "следующей ячейкой" становится ячейка на строку ниже (с учетом замкнутости строк по циклу) если "цикл" не закончился, то М: иначе перейти на следующий столбец и на М: (и так до конца диапазона) иначе найти первую строку с долгом N: если "ячейка"<> - то "долг" списать; если "долг">"долг макс" то перейти Н: иначе "ячейка"=+; перейти к следующему столбцу и на М: иначе Н: найти следущую строку с "долгом"; перейти на N: если не удалось списать "долг" ни с одной строки, то на перейти на М:
[/vba]
"долг" образуется при условии, когда надо в ячейку поставить плюс, а там стоит минус "долг" наращивается при выполнении предыдущего условия и когда он достигает некоторого значения, то перестает быть долгом, т.е обнуляется
где-то так
прим.*** а может лт эксел послать сообщение в аську?карандаш
Сообщение отредактировал карандаш - Воскресенье, 17.02.2013, 23:41