![]() |
Внесение изменений во все листы книги Excel при помощи VB макросов
Доброго времени суток!
Название темы не полностью раскрывает поставленную задачу, поэтому я расскажу подробнее. Прошу извинить, если подробность окажется излишней, но детали иногда имеют значение. Вопросы сосредоточены в конце поста. Исходная задача Требуется отслеживать производительность труда работников и выдавать результаты еженедельно и кумулятивно с начала года. Из базы данных при помощи некой проприетарной программы снимаются соответствующие отчеты, однако база данных хранит информацию только за последние несколько недель и соответственно получить кумулятивную информацию за год невозможно. Кроме того, на основе полученных данных нужно вывести дополнительные критерии производительности, не фигурирущие в оригинальном отчете, но которые можно подсчитать на основе исходных данных. Помимо этого, требуется вывешивать отчеты на всеобщее обозрение обеспечивая при этом конфиденциальность - имя работника не должно фигурировать в отчете, а вместо имени используется номер, известный только работнику. Проприетарный отчет можно экспортировать в HTML (oчень криво), JPEG (бесполезно) и Excel (тоже криво). Для реализации поставленной задачи был выбран Excel, т.к. это единственное из доступных приложений способное работать с экспортированными отчетами. Ну и напоследок, отчетами должна заниматься менеджер, которая обладает очень слабыми компьютерными знаниями и не имеет понятия что такое формула в Excel :) Проблемы, с которыми я столкнулся 1. В оригинальном ежендельном отчете фигурируют работники, чью производительность подсчитывать не надо: это могут быть люди, которые редко выполняют данную работу, мендежеры, сисадмины и т.д. 2. В оригинальном ежендельном отчете фигурируют только работники, выполнявшие работу за отчетный период. Иными словами, если человек был в отпуске или не делал данную работу, его имени в отчете не будет. 3. В кумулятивный и модифицрованный отчеты может понадобиться добавить или убрать работника (нанали / уволили). Что было сделано Я создал книгу Excel с 53 листами. 52 листа для ежендельных отчетов и один лист для кумулятивного отчета. Понятно, что кумулятивный отчет суммирует данные из 52 еженедельных. Был записан макрос, приводящий исходный экспортированный отчет (привожу фрагмент) ![]() к нужному виду. Макрос убирает ненужные столбцы и строки, заменяет имена работников на назначенные им номера (левый столбец) и сортирует по левому столбцу A-Z, так что вверху столбца остаются только нужные для отчета люди и данные. Таким образом я худо-бедно справился с первой из возникших проблем - сортировка по возрастанию отметает всех ненужных в отчете людей. ![]() для последующего копирования в еженедельный отчет. Что хотелось бы реализовать Проблема #2 автоматизирована не была. Всего числится больше работников, чем выполняло работу за отчетный период, следовательно скопировать данные и вставить их в лоб не получится. Обхдное решение на которое я оказался способен таково. После обработки оригинального отчета макросом мендежер копирует данные и вставляет в книгу в один из 52 листов. ![]() А затем начинает выравнивать строки таким образом, что цифры столбца Analyst в каждой строке должны иметь такое же значение как цифры в столбца TempColumn. Выравнивание достигается выделением ячеек и вставкой со сдвигом вниз. ![]() После чего ненужная более столбец TempColumn удаляется. И получается вот такой отчет: ![]() Вопрос #1: можно ли автоматизировать операцию выравнивания строк при помощи макроса? Я никак не могу сообразить как это "записать", а написать соотв. скрипт не могу из-за отсуствия знаний :) Т.е. нужен LOOP в указанном диапазоне строк с примерно таким алгоритмом: Если ячейка B7 равна C7 идем дальше (сравниваем B8 и C8) Если ячейка B7 не равна C7 выделяем ячейки C7:F7 и сдвигаем их вниз и повторяем операцию в заданном заранее диапазоне строк Вопрос #2: Едем дальше, а именно задаемся третьей проблемой. Нужен макрос который а) Интерактивно добавит / удалит работника в список б) внесет изменения в уже имеющийся макрос обработки отчета Под "Интерактивно" понимается следующее. Нужна серия вопросов с возможностью введения отвта "Введите имя и фамилию работника точно так, как они отображаются в оригинальном отчете" "Введите номер работника" "Введите номер строки в которую вы хотите добавить работника" После того как данные внесены, макрос должен добавить строку после указанной пользователем, внести в одну из ячеек строки имя и фамилию, в соседнюю номер работника и внести/скопировать формулы (такие же как в других строках листа) и выполнить все это во всех листах книги. Помимо этого макрос должен добавить строку в уже существующий макрос, который выполняет замену имен на номера. Сейчас это там выглядит примерно так Код:
Cells.Replace What:="Фамилия1, Имя1", Replacement:="27", LookAt:=xlPart, _ Сорри за длинное описание и спасибо за внимание! |
Цитата:
Внесение изменения в таблицу(в ячейку со столбцом "B" и строкой "10", на листе "Лист3") Sheets("Лист3").Range("B10").Value = "Данные" Цитата:
Dim A as string 'Переменная для принятия ответа A= InputBox("Вопрос", "Заголовок окна", "Текст по умолчанию") Решение №2 Ещё вариант добавить форму с соответствуюшими полями: Может ещё где понадобится!!! Вывод сообщения, или вопроса по типу да/нет Dim M 'Переменная для принятия ответа(тип не помню) M = MsgBox("Сообщение или вопрос",здесь константы (через "+") , "Заголовок") Например: M = MsgBox("Руки мыл??? :+)", vbQuestion + vbOKCancel, "") Извени если что не так, просто может вопрос нетак понял!!! |
Vovchick1
Спасибо за ответы. Цитата:
По поводу InputBox, спасибо. Это просто, и я наверное устрою добавление нужных мне строк в лист(ы). Сложнее внести в один из уже имеющихся макросов изменения на основе переменных полученных из ответов на серию вопросов. Это вообще осуществимо? |
Гляну, может ещё что-нибудь придумаю!!!
Цитата:
|
Цитата:
1. Ты сначала добавляеш строки; 2. Потом выравниваеш; 3. Потом удаляеш столбец. А можно сразу записать определённую строку на определённое место!!!(см. файл) Цитата:
|
Время: 06:34. |
Время: 06:34.
© OSzone.net 2001-