Задача
Предположим, вы хотите вести ежемесячный учёт неких типовых затрат по нескольким торговым точкам. Так есть, к примеру, торговая точка А, которая понесла затраты на аренду в размере 15000 рублей в марте 2015 года, есть точка Б, которая потратила 3000 руб на электричество в апреле 2015 и так далее. Как лучше всего организовать подобный учёт?
Тут не всё так просто, как хотелось бы. Вот наши исходные данные:
У нас есть 13 торговых точек и их количество с высокой вероятностью может расти. И есть 10 видов затрат и добавление новых видов возможно, но маловероятно.
С точки зрения удобства ввода информации она должна выглядеть так:
А вот с точки зрения последующего беспроблемного извлечения информации (особенно формулами) она должна выглядеть совершенно по-другому:
Таким образом имеем задачу предоставить пользователю возможность просматривать и редактировать информацию в удобном для него виде, а хранить в удобном для нас виде. Ну и где же выход из этого исхода?
Файл примера
Мой метод
Посмотрим, как всё устроено:
-
Лист Затраты состоит из трёх таблиц.
Таблица 1 видна пользователю, таблицы 2 и 3 - служебные, поэтому скрыты. Первая таблица отображает данные за тот период времени, который выбран при помощи полей Год и Месяц во второй строке. Эти данные формулами извлекаются во вторую таблицу из умной таблицы Smart листа Expenses. Значения из второй таблицы в первую переносятся макросом. Поскольку пользователь может вносить в таблицу свои значения, то нам необходимо отслеживать ячейки, которые изменены. Мы это делаем при помощи цвета фона ячеек первой таблицы. Зелёный фон означает, что значение совпадает со значением, имеющимся в Smart для данного магазина, вида затрат, периода. Красный фон означает, что значение не совпадает. Цвет определяется правилами условного форматирования, которые ориентируются на таблицу 3, сравнивающую формулами между собой ячейки первых двух таблиц.
-
При активации листа Затраты запускается процедура считывания данных (ReadExpense) в таблицу 1. То же самое происходит, когда пользователь меняет год или месяц.
-
При деактивации листа Затраты запускается процедура обновления данных в умной таблице (UpdateExpense). То же самое происходит, когда пользователь всего лишь встаёт на ячейки выбора периода (год / месяц).
-
Ну и основной модуль с вышеназванными процедурами + универсальная процедура замены данных в умной таблице (ReplaceSmartFilteredRange).
|