Всем привет! Мешкал в какую ветку разместить данный пост, но решил все же разместить тут. Если ему место все же в "Мозговом штурме", прошу перенести туда. Изо дня в день приходится воспроизводить одни и те же действия, которые, часом, уже осточертели и решил написать скрипт в VBA. Но по мере изучения темы возможностей завел сам себя в тупик. Поэтому решил написать сюда и узнать ваше мнение, как было бы лучше поступить. Если кратко, то нужно взять таблицу с выгрузкой данных, сравнить с такой же таблицей прошлого дня, на основании результата создать таблицу с отображением этих данных в различном разрезе с помощью сводных таблиц. Вопрос в подходе сборки и обработки данных. Сначала опишу текущие ежедневные действия:
Каждый день выгружается файл с данными. Его я сохраняю -> беру от него имя файла -> открываю файл с расчетными данными за вчерашний день -> пересохраняю под новым именем -> удаляю расчетные строки с 3 по последнюю, так как они за вчерашний день (2 строка остается как шаблон для протягивания формул) -> копирую значения из таблицы со свежей выгрузкой и вставляю данные в расчетную таблицу. Протягиваю формулы в расчетной таблице (в основном расчет изменений от расчетной таблицы вчерашнего дня) -> Проверяю данные в столбцах на наличие ошибок по фильтрам некоторых столбцов -> Копирую все данные из расчетной таблицы и вставляю в вторую расчетную таблицу, в которой хранятся расчетные данные за -1 и -2 день (так как за основу взят вчерашний файл) -> добавляю скопированные строки сегодняшнего расчета -> присваиваю этим данным сегодняшнюю дату -> удаляю строки с данными за -2 день как лишние. -> перехожу в сводную таблицу, которая суммирует данные по определенным ключам и сравнивает сумму с предыдущем днем за каждую дату в отчете; обновляю ее и меняю парараметр сравнения дат (через "дополнительные вычисления" - отличие) -> Копирую всю сводную и вставляю на новый лист (эти основе этих данных строятся другие сводные таблицы и построить сводную на основании значений сводной нельзя) -> Дублирую эти же данные в конец отдельного файла Базы Данных и сохраняю их. -> В таблице расчетов обновляю все сводные таблицы, копирую итоги общей сводной таблицы и заношу в отдельную вкладку, в которой отображается хронология общих итогов за каждый день. Далее открываю другой файл, который лишь обновляется данными, а не создается новый как в предыдущем. В нем необходимо лишь обновить все сводные таблицы, которые черпают информацию из файла Базы Данных и убираю лишние галоки в параметрах отображения сводных таблиц (данные да последние 7 дней нужны). После этого данные из первого файла с расчетами копируются в конец второй Базы Данных. Захожу в еще один файл с анализом и обновляю сводные таблицы в нем. Сразу скажу, данный метод обработки данных был создан не мной, как и алгоритм, поэтому прошу к нему особо не придираться. Когда я с ним столкнулся, мне удалось его немного лишь упростить, создав бесконечные ссылки вместо постоянного изменения "источника данных" в параметрах каждой сводной таблицы, а так же дополнения некоторых формул. Это позволило использовать "обновить всё" и ускорить процесс
Выгружаемых файлов сейчас три каждый день: текущий месяц (июль), следующий месяц (август) и определенный период с особыми параметрами. Каждый отправляется в свою папку и обновляет только свою область. Каждый файл выгрузки занимает примерно 22-23 тыс. строк и 31 столбец. Файл Базы Данных и второй Базы Данных наполняется каждый день и содержит данные как за прошедшие месяцы (апрель, май, июнь), так и сейчас выгружаемые (июль, август) с разбивкой по точкам съема. Файл первой Базы Данных имеет всего 8 столбцов, однако его постоянно приходится "подрезать", так как упираемся в 1 млн. строк (вес файла ~60 Мб). Файл второй Базы Данных так же упирается в 1 млн. строк и постоянно очищается от самых старых данных, при этом кол-во столбцов 33 и вес ~160 Мб. Все это дико осложняет работу с данными как конечных пользователей, так и при заполнении.
Так как ежедневная рутина осточертела, да и стал все чаще возникать "человеческий фактор" при заполнении, хотел написать VBA скрипт по этим действиям. Пришлось вспоминать ту малую часть знаний по VBA, которую получил в 2019, когда обрабатывал данные. Начал вспоминать с азов и реализовал скрипт вычленения даты из имени файла, преобразование его в формат даты, отнимание 1 дня, преобразование обратно в часть названия файла, поиск этого файла и дальнейшее открытие файлов для работы. И вот тут у меня произошла развилка: 1) Собирать в коллекции данные из первой таблицы, сравнивать и рассчитывать разницу со второй таблицей. Подсчитывать суммы дней и т.п. и строить на их основе сводные таблицы. Но тут все равно будет необходимо вручную добавлять значения в Базы Данных и обновлять аналитические сводные таблицы на основании вновь внесенных значений. 2) Объединить выгрузку данных не разделяя выгрузки по месяцам а взять даты от -1 дня до +60 или +90 дней с данными, охватывающими все критерии. Обрабатывать эти данные скриптом разделяя в процессе обработки на "разделы" которые конечный пользователь будет переключать из сводных таблиц, выбирая нужное. Первый вариант вроде как "легкий путь" на котором можно было бы набить руку в VBA и имеет достаточное кол-во примеров работы с коллекциями (знаний пока не достаточно по этой теме, чтобы свободно что-то написать), однако он не решает большей части задач с обновлением Баз Данных и их аналитики. Второй вариант вывел меня к решениям в Power Query и Power Pivot, однако загуглить тему подробно для изучения в рукоммьюнити не удалось. Ощущение, что пропустил месяц лекций и даже та инфа, что есть по этой теме на просторах инета совсем не понятна. Особенно реализация в VBA. Однако этот вариант решил бы вопрос упора в 1 млн строк и позволил бы собирать данные в одном файле, тем самым открыв доступ к объединению и циклу алгоритма выгрузки и обработки данных.
Поэтому хочу услышать ваше мнение, по какому пути лучше мне пойти с точки зрения изучения VBA и получения навыков?
Извините за "многабукав"
Всем привет! Мешкал в какую ветку разместить данный пост, но решил все же разместить тут. Если ему место все же в "Мозговом штурме", прошу перенести туда. Изо дня в день приходится воспроизводить одни и те же действия, которые, часом, уже осточертели и решил написать скрипт в VBA. Но по мере изучения темы возможностей завел сам себя в тупик. Поэтому решил написать сюда и узнать ваше мнение, как было бы лучше поступить. Если кратко, то нужно взять таблицу с выгрузкой данных, сравнить с такой же таблицей прошлого дня, на основании результата создать таблицу с отображением этих данных в различном разрезе с помощью сводных таблиц. Вопрос в подходе сборки и обработки данных. Сначала опишу текущие ежедневные действия:
Каждый день выгружается файл с данными. Его я сохраняю -> беру от него имя файла -> открываю файл с расчетными данными за вчерашний день -> пересохраняю под новым именем -> удаляю расчетные строки с 3 по последнюю, так как они за вчерашний день (2 строка остается как шаблон для протягивания формул) -> копирую значения из таблицы со свежей выгрузкой и вставляю данные в расчетную таблицу. Протягиваю формулы в расчетной таблице (в основном расчет изменений от расчетной таблицы вчерашнего дня) -> Проверяю данные в столбцах на наличие ошибок по фильтрам некоторых столбцов -> Копирую все данные из расчетной таблицы и вставляю в вторую расчетную таблицу, в которой хранятся расчетные данные за -1 и -2 день (так как за основу взят вчерашний файл) -> добавляю скопированные строки сегодняшнего расчета -> присваиваю этим данным сегодняшнюю дату -> удаляю строки с данными за -2 день как лишние. -> перехожу в сводную таблицу, которая суммирует данные по определенным ключам и сравнивает сумму с предыдущем днем за каждую дату в отчете; обновляю ее и меняю парараметр сравнения дат (через "дополнительные вычисления" - отличие) -> Копирую всю сводную и вставляю на новый лист (эти основе этих данных строятся другие сводные таблицы и построить сводную на основании значений сводной нельзя) -> Дублирую эти же данные в конец отдельного файла Базы Данных и сохраняю их. -> В таблице расчетов обновляю все сводные таблицы, копирую итоги общей сводной таблицы и заношу в отдельную вкладку, в которой отображается хронология общих итогов за каждый день. Далее открываю другой файл, который лишь обновляется данными, а не создается новый как в предыдущем. В нем необходимо лишь обновить все сводные таблицы, которые черпают информацию из файла Базы Данных и убираю лишние галоки в параметрах отображения сводных таблиц (данные да последние 7 дней нужны). После этого данные из первого файла с расчетами копируются в конец второй Базы Данных. Захожу в еще один файл с анализом и обновляю сводные таблицы в нем. Сразу скажу, данный метод обработки данных был создан не мной, как и алгоритм, поэтому прошу к нему особо не придираться. Когда я с ним столкнулся, мне удалось его немного лишь упростить, создав бесконечные ссылки вместо постоянного изменения "источника данных" в параметрах каждой сводной таблицы, а так же дополнения некоторых формул. Это позволило использовать "обновить всё" и ускорить процесс
Выгружаемых файлов сейчас три каждый день: текущий месяц (июль), следующий месяц (август) и определенный период с особыми параметрами. Каждый отправляется в свою папку и обновляет только свою область. Каждый файл выгрузки занимает примерно 22-23 тыс. строк и 31 столбец. Файл Базы Данных и второй Базы Данных наполняется каждый день и содержит данные как за прошедшие месяцы (апрель, май, июнь), так и сейчас выгружаемые (июль, август) с разбивкой по точкам съема. Файл первой Базы Данных имеет всего 8 столбцов, однако его постоянно приходится "подрезать", так как упираемся в 1 млн. строк (вес файла ~60 Мб). Файл второй Базы Данных так же упирается в 1 млн. строк и постоянно очищается от самых старых данных, при этом кол-во столбцов 33 и вес ~160 Мб. Все это дико осложняет работу с данными как конечных пользователей, так и при заполнении.
Так как ежедневная рутина осточертела, да и стал все чаще возникать "человеческий фактор" при заполнении, хотел написать VBA скрипт по этим действиям. Пришлось вспоминать ту малую часть знаний по VBA, которую получил в 2019, когда обрабатывал данные. Начал вспоминать с азов и реализовал скрипт вычленения даты из имени файла, преобразование его в формат даты, отнимание 1 дня, преобразование обратно в часть названия файла, поиск этого файла и дальнейшее открытие файлов для работы. И вот тут у меня произошла развилка: 1) Собирать в коллекции данные из первой таблицы, сравнивать и рассчитывать разницу со второй таблицей. Подсчитывать суммы дней и т.п. и строить на их основе сводные таблицы. Но тут все равно будет необходимо вручную добавлять значения в Базы Данных и обновлять аналитические сводные таблицы на основании вновь внесенных значений. 2) Объединить выгрузку данных не разделяя выгрузки по месяцам а взять даты от -1 дня до +60 или +90 дней с данными, охватывающими все критерии. Обрабатывать эти данные скриптом разделяя в процессе обработки на "разделы" которые конечный пользователь будет переключать из сводных таблиц, выбирая нужное. Первый вариант вроде как "легкий путь" на котором можно было бы набить руку в VBA и имеет достаточное кол-во примеров работы с коллекциями (знаний пока не достаточно по этой теме, чтобы свободно что-то написать), однако он не решает большей части задач с обновлением Баз Данных и их аналитики. Второй вариант вывел меня к решениям в Power Query и Power Pivot, однако загуглить тему подробно для изучения в рукоммьюнити не удалось. Ощущение, что пропустил месяц лекций и даже та инфа, что есть по этой теме на просторах инета совсем не понятна. Особенно реализация в VBA. Однако этот вариант решил бы вопрос упора в 1 млн строк и позволил бы собирать данные в одном файле, тем самым открыв доступ к объединению и циклу алгоритма выгрузки и обработки данных.
Поэтому хочу услышать ваше мнение, по какому пути лучше мне пойти с точки зрения изучения VBA и получения навыков?
Детальное описание технологии работ не позволит приблизиться к пониманию проблемы для людей, незнакомых с процессом. Попробуйте графически отобразить алгоритм этого процесса, например, технологией BPWin (IDEF0) (инструмент управленческого консультирования). Это позволит выявить проблемные места основного процесса, например, по состыковке выходов и входов его подпроцессов. Возможно, Ваше понимание проблемы изменится и сможете её изложить более лаконично/понятно.
Добрый день.
Цитата
Извините за "многабукав"
Детальное описание технологии работ не позволит приблизиться к пониманию проблемы для людей, незнакомых с процессом. Попробуйте графически отобразить алгоритм этого процесса, например, технологией BPWin (IDEF0) (инструмент управленческого консультирования). Это позволит выявить проблемные места основного процесса, например, по состыковке выходов и входов его подпроцессов. Возможно, Ваше понимание проблемы изменится и сможете её изложить более лаконично/понятно.NikitaDvorets
NikitaDvorets, Тогда попробую описать текущую задачу, которую хочу попробовать решить:
Есть файлы выгрузки .xls, которые ежедневно дополняются. В каждом файле только 1 лист на 23 столбца (фиксированы) ~40к строк. Файлы можно только читать. Есть файл запуска скрипта с листом настроек для скрипт, листом нужных маршрутов, листом НЕ нужных маршрутов, листом неопределенных маршрутов (очищается при запуске), листом с данными, которые не попали в обработку (очищается при запуске). Есть файл Базы Данных в который заносятся уже рассчитанные данные из каждой выгрузки за каждый день выгрузки.
Предметная область: автобусные перевозки и статистика за каждый день съема данных по загрузке каждого рейса в период продаж от -1 до 49 дня. По факту каждая строка в файле выгрузки - это номер рейса, дата отправления, Название направления, количество кресел в автобусе и количество проданных кресел в автобусе. Эти данные надо отфильтровать, дополнить расчетами и загрузить в файл БД. Листы нужных и ненужных маршрутов - это список Названий направлений, по которым скрипт будет понимать какие строки из файла выгрузки надо брать, а какие нет.
Мысль о структуре скрипта была следующая:
Пользователь выбирает файл с выгрузкой -> из имени файла вытягивается дата его формирования (день съема данных) -> скрипт запоминает соответствия из листов нужных и ненужных маршрутов -> открывается файл выгрузки -> построчная обработка файла выгрузки с последующей обработкой каждых данных и запоминанием -> открытие файла БД и добавление в конец обработанных данных. Второй макрос на основании данных из БД строит всевозможные сводные таблицы с диаграммами на выбранную пользователем точку съема.
Вот каким из методов было бы оптимальней это сделать не знаю. Те средства, которыми я предполагал эту реализацию, к сожалению, не подходят для их решения и сейчас метаюсь в поисках решения каждого из блока и уже отчаялся.
P.S. Понимаю, что в суть задачи все равно не ясна, а описать все аспекты очень сложно. Удалено администрацией. Причина: Нарушение правил пп. 5о. Скрипт не прошу, а лишь направить в нужное русло. Дальше, надеюсь. удастся самому отыскать нужные части.
NikitaDvorets, Тогда попробую описать текущую задачу, которую хочу попробовать решить:
Есть файлы выгрузки .xls, которые ежедневно дополняются. В каждом файле только 1 лист на 23 столбца (фиксированы) ~40к строк. Файлы можно только читать. Есть файл запуска скрипта с листом настроек для скрипт, листом нужных маршрутов, листом НЕ нужных маршрутов, листом неопределенных маршрутов (очищается при запуске), листом с данными, которые не попали в обработку (очищается при запуске). Есть файл Базы Данных в который заносятся уже рассчитанные данные из каждой выгрузки за каждый день выгрузки.
Предметная область: автобусные перевозки и статистика за каждый день съема данных по загрузке каждого рейса в период продаж от -1 до 49 дня. По факту каждая строка в файле выгрузки - это номер рейса, дата отправления, Название направления, количество кресел в автобусе и количество проданных кресел в автобусе. Эти данные надо отфильтровать, дополнить расчетами и загрузить в файл БД. Листы нужных и ненужных маршрутов - это список Названий направлений, по которым скрипт будет понимать какие строки из файла выгрузки надо брать, а какие нет.
Мысль о структуре скрипта была следующая:
Пользователь выбирает файл с выгрузкой -> из имени файла вытягивается дата его формирования (день съема данных) -> скрипт запоминает соответствия из листов нужных и ненужных маршрутов -> открывается файл выгрузки -> построчная обработка файла выгрузки с последующей обработкой каждых данных и запоминанием -> открытие файла БД и добавление в конец обработанных данных. Второй макрос на основании данных из БД строит всевозможные сводные таблицы с диаграммами на выбранную пользователем точку съема.
Вот каким из методов было бы оптимальней это сделать не знаю. Те средства, которыми я предполагал эту реализацию, к сожалению, не подходят для их решения и сейчас метаюсь в поисках решения каждого из блока и уже отчаялся.
P.S. Понимаю, что в суть задачи все равно не ясна, а описать все аспекты очень сложно. Удалено администрацией. Причина: Нарушение правил пп. 5о. Скрипт не прошу, а лишь направить в нужное русло. Дальше, надеюсь. удастся самому отыскать нужные части.messir
Сообщение отредактировал Serge_007 - Среда, 28.07.2021, 08:58
messir, добрый день. Если проанализировать совместно Ваши тезисы: (1)
Цитата
Понимаю, что в суть задачи все равно не ясна, а описать все аспекты очень сложно
и (2)
Цитата
Скрипт не прошу, а лишь направить в нужное русло
то получится некий оксюморон (несовместимые понятия в одном словосочетании) , т.е. Вы предлагаете невыполнимую задачу.
Чтобы приблизиться к пониманию проблемы, предлагаю Вам разработать графическую схему информационных потоков всего процесса: Квадратами (с надписями файлов внутри них) обозначить файлы и также квадратами - листы внутри них (с перечнем данных) . Далее стрелками связать эти квадраты друг с другом, указывая на них выходную и входную информацию. Стрелки могут указывать на задачи, выполняемые тем или иным макросом (указать).
Цитата
Вот каким из методов было бы оптимальней это сделать не знаю.
Метод Вы уже указали - это VBA. Возможно, под этой фразой имелось ввиду что-то другое. P.S. При достижении момента прозрачной постановки задачи целесообразно будет направить её на платную ветку форума.
messir, добрый день. Если проанализировать совместно Ваши тезисы: (1)
Цитата
Понимаю, что в суть задачи все равно не ясна, а описать все аспекты очень сложно
и (2)
Цитата
Скрипт не прошу, а лишь направить в нужное русло
то получится некий оксюморон (несовместимые понятия в одном словосочетании) , т.е. Вы предлагаете невыполнимую задачу.
Чтобы приблизиться к пониманию проблемы, предлагаю Вам разработать графическую схему информационных потоков всего процесса: Квадратами (с надписями файлов внутри них) обозначить файлы и также квадратами - листы внутри них (с перечнем данных) . Далее стрелками связать эти квадраты друг с другом, указывая на них выходную и входную информацию. Стрелки могут указывать на задачи, выполняемые тем или иным макросом (указать).
Цитата
Вот каким из методов было бы оптимальней это сделать не знаю.
Метод Вы уже указали - это VBA. Возможно, под этой фразой имелось ввиду что-то другое. P.S. При достижении момента прозрачной постановки задачи целесообразно будет направить её на платную ветку форума.NikitaDvorets
Serge_007, Вы не правы в трактовке. Было предложено посредством подключения к общественному серверу дискорда или каких-либо конференций любому желающему, чтобы быстрее и проще объяснить суть проблемы и показать трансляцией своего экрана и голосовой связью задачу. Описать все условия текстом будет очередной простыней букв, которую в лучшем случае осилит процентов 3-5% в лучшем случае. При этом потратит на это уйму своего времени. Но, конечно же, вам видней.
Прошу удалить данную тему. Я понял, что глобальные вопросы тут нет смысла задавать. Только частные по конкретным блокам.
Serge_007, Вы не правы в трактовке. Было предложено посредством подключения к общественному серверу дискорда или каких-либо конференций любому желающему, чтобы быстрее и проще объяснить суть проблемы и показать трансляцией своего экрана и голосовой связью задачу. Описать все условия текстом будет очередной простыней букв, которую в лучшем случае осилит процентов 3-5% в лучшем случае. При этом потратит на это уйму своего времени. Но, конечно же, вам видней.
Прошу удалить данную тему. Я понял, что глобальные вопросы тут нет смысла задавать. Только частные по конкретным блокам.messir
NikitaDvorets, Да тут скорей изначально было нужно напутствие, мол "если у тебя очень много данных, то иди в PQ и PP" или же "PQ и PP не решит твоих задач и ты все равно упрёшься в объемы, так что копай VBA и пробуй всё разложить на составляющие". Как говорили наши учителя "Плохо когда не знаешь, да еще и не помнишь" Это как раз про мой случай)))
NikitaDvorets, Да тут скорей изначально было нужно напутствие, мол "если у тебя очень много данных, то иди в PQ и PP" или же "PQ и PP не решит твоих задач и ты все равно упрёшься в объемы, так что копай VBA и пробуй всё разложить на составляющие". Как говорили наши учителя "Плохо когда не знаешь, да еще и не помнишь" Это как раз про мой случай)))messir