Доброго всем времени суток! Много раз меня выручал этот форум. Потому прибываю в неоплатном долгу перед всеми кто мне помогал. Не смею рассчитывать на то, что кто то снова будет тратить свое время на меня за "Спасибо". Однако, если кто из консультантов решит, что те вопросы которые я ставлю на обсуждение достаточно трудозатратны и требуют денежного вознаграждения, я не исключаю и такой вариант. Задача которую мне предстоит описать для знатоков VBA не сложна, но для того что бы понять чего я ожидаю от неравнодушного сообщества мне необходим много слов. Возлагаю надежды на лояльность модераторов, чтобы сия тема была все таки допущена на форум.
Итак, на моей "славной" работе руководство, видимо посчитав, что я за зря ем "хлеб" фирмы поручило мне наряду с моей непосредственной работой (вообще я специалист договорных отношений, т.е. юрист) в нагрузку одно довольно "геморройное" занятие. А именно - теперь я еще должен проверять (контролировать) сдачу графиков посещений нашего обслуживающего персонала среди Клиентов компании. Всё это дело ведется в Эксель 2003. Обилие ручной работы при этом контроле меня "убивает". Естественно никого не заботит как я это буду делать, хотя по хорошему здесь нужен толковый "прог" на уровне VBA. Но это не реально, ему же надо платить зарплату, а мне можно не платить. Ну вот, пожалился... вроде полегчало...
Итак суть. Есть обслуживающий персонал - специалисты. У каждого спеца есть свои Клиенты. Спецы обязаны еженедельно заполнять в Эксель График посещений Клиентов. То есть, книга (файл) содержит листы. Один из листов содержит Плановый график, а другие листы - текущие графики. Моя задача проверить достоверность всех графиков (Плановый и текущие). Я додумался создать некий шаблон с правилами, и при импорте данных из графика специалиста в мой шаблон правила "подсветят" косяки, если таковые имеются. Прилагаю свой подопытный образец. Первый лист "План" - это и есть проект шаблона (по сути лист Получатель данных). Далее листы содержащие графики специалистов (листы Источники данных). График представляет собой две таблицы (верхняя и нижняя). Условно верхняя таблица называется "Плановый на март", нижняя - "Дополнительные визиты". Обе таблицы разделены на 5 дней недели. Здесь по тексту я решил, что диапазон строк и столбцов в таблице в границах одного рабочего дня назвать микромассивом. То есть, в каждой таблице есть 5 микромассивов: понедельник, вторник, среда, четверг, пятница. Скажем так, верхняя таблица (Плановый на март) является Первичной, нижняя таблица (Дополнительные визиты) - вторична и задействуется для обработки макросом только при условии наличия обоюдных связей в формулах по столбцу "Н". Пример итогового результата - кнопка Пятница. Если связи нет, то макрос обрабатывает только верхнюю таблицу Пример итогового результата - Все кнопки с понедельника по четверг. Я уже сделал кучу кнопок с макросами для импорта данных из листа Источника в лист Получатель. Разумеется пользовал макро рекодер В результате макросы примитивны и корректно работают только при фиксированном и неизменном размере массивов на листе Источнике, а это невозможно. Более того не исключено и небрежное форматирование таблицы самим специалистом (где то есть пустые строки, или разрыв формул). Предполагается, что массив на листе Источнике будет динамичным, т.е. количество строк внутри дня недели не лимитируется и м.б большего либо меньше чем в примере. Нужен умный "макрос" чтобы он умел выделять на листе Источнике только тот диапазон массива (микромассив), который относится к конкретному дню недели. Очевидно, что необходимо задать границы микромассива на листе Источник по некоторым условиям. Для наглядности конечного результата можно понажимать мои кнопки. Так кнопки "понедельник", "вторник" и т.д. на листе Источник выделяют нужные микромассивы и копируют их в заданные диапазоны на лист Получатель. Замечу, что для простоты на листе Получателе предполагается, что размер микромассивов (диапазон строк и их количество) фиксирован и число строк постоянно (26 строк на один день, микромассив). Это избыточно, но зато, на мой взгляд, упрощает импорт данных и не нужно беспокоиться о размере микромассива на листе Источнике. Вряд ли будет ситуация, где количество строк в источнике на один день превысит значение 26.
Кнопка DeleteData - очищает мой шаблон (лист Получатель) от старых данных. Кнопка "Все рабочие дни" запускает поочередно все макросы начиная с понедельника по пятницу.
По умолчанию на листе Получатель в столбце "H" в каждой первой ячейке микромассива указывается значение "8:45" - это отправная точка отсчета времени. Начиная с каждой второй ячейки микромассива и по последнюю строку (понедельник H6:H30, вторник H32:H56, среда H58:H82, четверг H84:H108, пятница H110: H134) забита формула на прирост рабочего времени. В самом простом случае предполагается, что формулы по столбцу "H" на листе Получателе недолжны изменяться, то есть макрос их "не трогает". Для наглядности: в результате работы макроса на листе Источник должны быть корректно выделены и скопированы 5 микромассивов с несмежными диапазонами из верхней таблицы. В примере получается, что несмежные диапазоны понедельника - C5:G12 и I5:J12, вторника - C16:G28 и I16:G28, среды - C29:G40 и I29:J40, четверга - C41:G50 и I41:J50, пятницы - C51:G61 и I51:J61.
Я определил два основных условия определения границ микромассива и одно дополнительное условие для определения относимости данных (какие данные можно отнести к понедельнику, вторнику, среде, четвергу и пятнице):
1. Условие. Думаю, что в моем примере верхней границей микромассива на листе Источник должна быть каждая строка, где в столбце "Н" содержится значение времени "8:45". Именно это значение указывают все специалисты вначале своего дня. К другим критериям привязаться проблематично. Например, столбец "А" содержит текстовые значения - понедельник, вторник, среда, четверг, пятница по всему своему диапазону (в пределах обеих таблиц, конечно) и логичнее было бы привязать верхнюю границу к ячейке с текстом понедельник, вторник и т.д.. Однако, в результате небрежного форматирования, ячейка с днем недели может быть выше или ниже строки со значением "8:45" по столбцу "H" (начало рабочего дня), что приведет к неправильному определению верхней границы микромассива. Обратите внимание на лист Источник, в верхней таблице - вторник (пример небрежного форматирования). В тоже время нужно чтобы макрос определял верхнюю границу микромассива именно по первому встретившемуся значению "8:45", которое вводится вручную. На примере образца на листе Источник в четверг первым значением "8:45" макрос должен считать ячейку "H41", а не ячейку "H42". Не знаю имеет ли это значение для дела, но предполагается, что в графиках в столбце "H" в первой строке микромассива (это начало дня) всегда значение равное "8:45" специалист выставляет вручную, это не результат вычислений формулы. В итоге значение "8:45" введенное вручную в столбце "H" - это верхняя граница каждого микромассива.
2. Условие. Нижняя граница микромассива должна определяться строкой, которая содержит группу формул. Например, в понедельник эта группа формул содержится в строке 12 (диапазон N12:Q12). Опять же, если это имеет значение для дела, то указанная группа формул (суммы по столбцам) в каждом микромассиве повторяется и, конечно, при изменении числа строк внутри микромассива динамически изменяется диапазон вычислений внутри этих формул.
3. Условие. Соответствие дня недели Источника и Получателя. Иногда рабочая неделя состоит из трех дней. На примере образца - лист 3. Необходимо чтобы макрос на листе Источник скопировал данные по оставшимся микромассивам (у нас это среда, четверг, пятница) и результат помещался на листе п
Получатель в соответствующий диапазон. В нашем примере с листа Источника данные со среды должны перейти на лист получатель также в среду, четверг в четверг ну и пятница в пятницу. Полагаю, что здесь каким то образом необходима проверка условия на наличие текстового значения в диапазоне столбца "A". То есть, макрос должен проверить - какое текстовое значение он найдет в диапазоне микромассива (между верхней строкой и нижней строкой) по столбцу "А". Если в заданных диапазонах по столбцу "A" он найдет "понедельник", то весь микромассив, в границах которого нашлось это слово он должен скопировать соответственно в лист Получатель, в начало диапазона Понедельник. И так далее. В случае если на листе Источнике обнаружится микромассив, который не имеет в столбце "А" текста "понедельник", "вторник", "среда", "четверг", "пятница", то необходимо чтобы макрос выдал сообщение что-то типа: "Не могу определить вторник". А в случае, если специалист ошибочно по столбцу "А" в пределах одного дня указал два и более текстовых значения (например, понедельник и вторник) то необходимо сообщение что то типа "Не правильно задан день недели".
Написано очень много, даже страшно продолжать. Но если у кого-то хватило терпения, мне остается только благодарить этого человека и надеяться, что будут предложены варианты. Итак я уже делал оговорку, что в самом простом случае макрос обрабатывает только верхнюю таблицу. В более сложном варианте (посмотрите Пятницу) предполагается, что макрос должен определить по связям в формулах (если такое вообще возможно) по столбцу "Н" наличие дополнительных данных в нижней таблице "Дополнительные визиты" и также аккуратно выделить обнаруженный диапазон и скопировать его в лист Получатель тоже в нижнюю таблицу. При этом макрос должен внести соответствующие изменения на листе Получатель в те формулы, о которых я раньше говорил, что они не должны изменяться макросам в простых случаях. Если нажмете на кнопку "Пятница" то вы сможете увидеть, что из-за несогласованности формул результат вычислений по времени в столбце "Н" на листе Получателе не верный. То есть при переносе данных он (макрос) должен на листе Получателе (План) привести в соответствие формулу с той же логикой вычислений как на самом листе Источнике данных. Опасаюсь, что мой трактат "трещит" по швам. Дополнительные текстовые пояснения содержатся непосредственно в самом файле на первом листе (Получатель). Друзья понимаю, что многого хочу, но надеюсь, что возможно проект удастся воплотить в жизнь, если Вы примите свое участие хотя бы по кусочку. Возможно вместо одного большого макроса можно сделать много маленьких. Например был бы рад маленькому макросу как определить и выделить микромассив "понедельник" для последующего копирования на лист Получатель. По аналогии сделаю макросы для других дней, если одним макросом сразу на все дни сделать сложно.
В любом случае спасибо всем, кто потратил своем время и дочитал до конца. Уповаю на Вас и внемлю .