43

Макрос получения курсов доллара за период с сайта Банка России

Excel (Эксель) прекрасен, а мир огромен. И готов предложить для анализа много разной информации из сети под названием Интернет. Часто видел, как аналитики мужеского и женского рода просто перебивают ручками данные со страниц разных сайтов для своей работы.

Иногда целесообразнее написать небольшой макрос, который будет получать данные из интернета автоматически. Для этого уже давно придуман Microsoft XML parser (MSXML).

Для примера, я и покажу, как с его помощью, получить курсы доллара за период с сайта ЦБ.

1) Организуйте столбец с датами на одной из «Sheets» экселя. У меня это столбец «A»

2) Подключите ссылку на Microsoft XML

3) Собственно пишем процедуру

Sub GetUSDRates4Period()

Объявляем переменные и открываем окно в мир интернета:

Dim strCCY As String, strRateCCY As String, strRateSource As String

Dim xmlDoc As MSXML2.DOMDocument

Set xmlDoc = New MSXML2.DOMDocument

xmlDoc.async = False

MSXML2 – это и есть упомянутый выше Microsoft XML parser, который нужно направить на сайт Банка России

strRateSource = "http://www.cbr.ru/scripts/XML_daily.asp?date_req="

Запрос будет неполным без указания даты, которую для каждой строчки мы возьмем из столбца, который предварительно датами заполнили.

Dim i As Long

i = 1

Dim strDate As String

Do While Not Range("a" & i) = ""

strDate = Format(Range("a" & i), "dd\/mm\/yyyy")

Всякое бывает с сайтами или вашим интернетом, поэтому нужно проверить результаты попытка загрузки xml файла.

If xmlDoc.Load(strRateSource & strDate) <> True Then

MsgBox "Сайт ЦБ сейчас не в духе, попробуйте обратиться к нему позже..."

Exit Sub

End If

Если же загрузка прошла успешно, то начинается магия xPath. Сначала получим дату, к которой на самом деле привязан курс доллара. Она не всегда совпадает с той датой, на которую вы курс запросили. И поместим дату ЦБ в столбец «B»

Range("b" & i) = xmlDoc.selectNodes("//ValCurs")(0).Attributes(0).Text

"//ValCurs" – это и есть выражение XPath, которое может быть очень интересным и витиеватым, и которое позволяет добраться практически до любой точки xml файла. В вышеприведенном примере я взял дату валютирования из тега ValCurs.

А ниже выражение посложнее. С его помощью я нахожу валюту «доллар» среди множества других (у этой валюты ID=R01235) и прошу показать мне только курс этой валюты (там есть и другая информация: буквенный и цифровой коды валюты в соответствии с ISO 4217 и/или ОКВ, номинал, описание, - но нам нужен только курс).

strRateCCY = xmlDoc.selectNodes("//Valute[@ID='R01235']/Value")(0).Text

Далее я привожу текст с курсом к числу с учетом настроек символа разделителя разрядов.

Range("c" & i).Value = CdblLocaleIndependent(strRateCCY)

Функцию CdblLocaleIndependent в этом посте показывать не буду, пока желающих на нее посмотреть не будет достаточно.

Закругляемся с циклом и заканчиваем работу:

i = i + 1

Loop

MsgBox "Курсы сняты с сайта Банка России."

End Sub

Дубликаты не найдены

+2

Пиши макрос для получения долларов. Очень ННАДА

раскрыть ветку 1
+1

Легко. Пришли только фото карточки с двух сторон, и, возможно, понадобится еще небольшая информация :)

+2
@moderator, перенесите пост в MS, Libreoffice & Google docs
@quickwin.ru, публикуй посты в рамках сообщества, так твой пост увидят больше людей и от него будет больше пользы
раскрыть ветку 1
0

ok

0
Удивительно. Где вы все берете такие крутые идеи? Что за чумовой самоучитель вы изучили?
раскрыть ветку 3
0

Погуглите: "VBA как два пальца". А вы какое ПТУ заканчивали?

раскрыть ветку 2
0

Ничего не гуглится про "VBA как два пальца". Можете ссылку дать, если это какая-то книга или что-то такое, пожалуйста?

раскрыть ветку 1
0

Добрый вечер! Есть вопрос: допустим, у меня есть таблица в Ексель, куда я привязываю документы гиперссылкой с другой папки. Эта таблица и файлы на другом компе, и уже пару раз, когда сетки переделывали ( не могу точно сказать, что там делали) менялся путь в гиперссылках и они становились нерабочими. Недавно опять что-то переделали, и опять все слетело. Есть ли возможность (может, макрос, но в инете что нашла - все нерабочее) как-то заменить часть названия пути в этих гиперссылках?

раскрыть ветку 1
0

Здравствуйте, да можно. Макрос не сложный. написал его на своем сайте.

будут вопросы - пишите прямо там. Сюда я заглядываю не каждый день.

мой сайт/Solutions/QandA

0

Хосспаде, а в json это поделие майкрософта не умеет?

раскрыть ветку 1
0

Есть решения на VBA и для Json, но с JSON я предпочитаю работать с помощью другого "поделия" - C#.

0
За старания и урок спасибо! Excel+VBA сила и любовь на веки.
Но для обычного пользователя, когда надо вытащить одну строчку данных с сайта. Легче будет посмотреть на ютубе 1-2 урока по Power Query.
0

а как это адаптировать если нужны данные по коронавирусу. в 2 строки -дата и количество

раскрыть ветку 5
0

Для начала назовите источник данных :)

Если речь про https://www.worldometers.info/coronavirus/#countries,

то там используется Highcharts, с которого все прекрасно и открыто читается через json.

раскрыть ветку 4
+1

смысл в том, что мы мало что смыслим в макросах (простите за каламбур)
поэтому можно ли "для блондинок и их начальников", пожалуста?

раскрыть ветку 3
0

Чему детей учишь? Attributes(0)?! Там вполне конкретный аттрибут! Никакого колхоза!

раскрыть ветку 10
0

Можно и по другому:


Range("b" & i) = xmlDoc.selectNodes("//ValCurs/@Date")(0).Text


Против такой нотации возражений нет? :)

Я, в принципе, за краткость, но использование объектной модели повышает управляемость.

раскрыть ветку 9
0

Это та же модель xpath, просто по номеру аттрибута выбор - вообще полная дичь. Стараться везде где можно использовать исключительно полный XPath.

раскрыть ветку 8
Похожие посты
46

Программирование на Денди

Привет. На чем вы постигали чудесный мир всяких "PRINT "XYI" и GOTO 10"?

Я в детстве был мамкиным программистом вот на таком извращенческом девайсе.

Программирование на Денди Dendy, Программирование, Basic, Nes, Nintendo, Ретро-Игры, Видео

В нем было много неудобств, но самое весомое - это невозможность сохранить программу. Только переписывать в тетрадку и восстанавливать потом снова. То еще удовольствие. Но я благодарен этой штуковине, с ней я худо-бедно научился FOR от NEXT отличать:)

И вот в 2020 году сбылась мечта идиота. Я нашел эмулятор, который поддерживает клавиатуру, ром картриджа с языком программирования, мануал по нему. И написал игру!

Игрой ее, правда, сложно назвать, но это не помешало мне отправить ее в зачет:)

Если на вас нахлынули воспоминания или просто захотелось покопаться программировании для Денди, то оставляю это тут:

Исходный код моей игры Jumpman Walk 2020 : https://yadi.sk/d/YqLRCke8wrenKg

Эмулятор Nestopia с поддержкой клавиатур: http://nestopia.sourceforge.net/

Rom картриджа от Subor'а : https://yadi.sk/d/dqZ6bfABwzQwxg

И еще я запилил видос про это все. Если интересно, то велком: https://youtu.be/tzyg9qi7s4E

Спасибо за внимание :)

351

Поиск и удаление повторяющихся значений в Excel

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Работая с данными, в программе Microsoft Excel, возможно вы сталкивались с ситуациями, когда нужно найти и удалить повторяющиеся данные в таблице.

Давайте разберемся, как это сделать быстро.


Инструмент Удаление дубликатов


1. Выделите ячейку таблицы, в которой необходимо удалить дубликаты.

2. Выберите на вкладке Данные ►Удалить дубликаты:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

3. В окне, по умолчанию проставлена галка Мои данные содержат заголовки, уберите при необходимости. В разделе Колонны установите или снимите галки (поиск и удаление будет производиться только по выбранным столбцам), нажмите OK:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

В результате список сократится до уникальных значений:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Удалять дубликаты можно только по столбцам, если необходимо удалить по строкам, то сначала удалите по столбцам, затем транспонируйте данные:


1. Скопируйте данные или CTRL+С

2. Вкладка меню Главная ► Вставить ► Специальная вставка ► Траспонировать или вызов окна CTRL+ALT+V


Для корректной работы инструмента с полями формата Дата убедитесь, чтобы все поля имели одинаковый формат даты, например 01.01.2020


Удаление дубликатов при помощи Расширенного фильтра


Операцию выше можно сделать при помощи инструмента Расширенный фильтр.

Актуально, если у вас версия Excel 2003, в которой еще нет инструмента Удалить дубликаты.


1. Выделите шапку таблицы или всю таблицу (CTRL+A), в которой необходимо найти дубликаты.

2. Выберите на закладке Данные ► в разделе Сортировка и фильтр Дополнительно:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

3. В окне, выберите вариант обработки Скопировать результат в другое место.

4. В поле Поместить результат укажите ячейку, в которую фильтр выведет значения.

5. Поставьте галку Только уникальные записи:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

В результате фильтр выведет список уникальных значений в выбранную ячейку, причем данные исходной таблицы не удалятся:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Вам необходимо выделить уникальные значения в исходной таблице?

Скройте повторяющиеся значения при помощи Расширенного фильтра:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Обратите внимание, строки с повторяющимися значениями не удалились, а просто скрыты.

Список уникальных значений, для дальнейшей работы можно выделить заливкой, цветом текста или добавить метку в дополнительном столбце:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Поиск дубликатов при помощи Сводной таблицы


1. Добавьте в вашу таблицу дополнительное поле для проверки:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

2. Создайте Сводную таблицу, вкладка Вставка ► Сводная таблица.

Настройте поля:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

3. Выберите вариант отображения отчета, на вкладке Конструктор ► Макет отчета ► Показать в табличной форме.

4. Уберите промежуточные итоги Конструктор ► Промежуточные итоги:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Выделение повторяющихся значений при помощи условного форматирования для Excel 2007+


1. Выделите таблицу, в которой необходимо найти повторяющиеся значения.

2. На вкладке Главная ► Условное форматирование ► Правила выделения ячеек ► Повторяющиеся значения:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

3. В окне Повторяющиеся значения, при необходимости выберите формат выделения дубликатов:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Данные будут подсвечены:

Поиск и удаление повторяющихся значений в Excel Excel, Аналитика, Отдел кадров, Бухгалтерия, Офис, Таблица, Продуктивность, Ms Office, Видео, Длиннопост

Как удалить дубликаты и разбить текст по столбцам, смотрите видео ⬇⬇⬇

Показать полностью 13 1
131

Применение Временной шкалы и Срезов в Excel

Использование стандартных фильтров в Excel не всегда удобно и ограничено одной таблицей. Для увеличения продуктивности в Excel существуют удобные инструменты, такие как Временна шкала и Срез. Они позволяют быстро выбирать данные по заданным параметрам, в том числе для нескольких таблиц сразу.

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Срезы можно использовать для "Умных" и Сводных таблиц, Временную шкалу только для Сводных.


Сводная таблица является по сути конструктором используя который можно быстро собрать нужные показатели по заданным критериям. Такие таблицы удобно применять для построения различных отчетов. Подробнее о Сводных таблицах смотрите статью: Сводные таблицы в Excel: как создать?


Срез


Срез представляет собой фильтр, вынесенный в отдельный графический элемент. Добавить один или несколько Срезов, для "Умной" или Сводной таблицы, можно на вкладке Анализ ► Вставить срез:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

В появившемся окне выберите столбец или несколько столбцов по которым будем построен фильтр:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Либо, на закладке Вставка ► Срез.


Внешний вид Срезов:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Временная шкала


Временная шкала параметр динамического фильтра, позволяющий легко фильтровать данные по периоду времени на одном из четырех уровней годы, кварталы, месяцы или дни.

Чтобы добавить шкалу на лист, выберите на вкладке Анализ ► Вставить временную шкалу:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Так же можно добавить через вкладку Вставка ► Временная шкала.


В открывшемся окне установите галку на против Дата ► ОK:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Внешний вид Временной шкалы:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Чтобы производить фильтрацию Временной шкалой:


1. Нажмите на стрелку рядом с отображаемым временным уровнем и выберите нужный вариант (год, квартал, месяц или день):

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

2. Перетащите полосу прокрутки временной шкалы к периоду времени, который вы хотите выбрать;


3. В элементе управления отрезком времени нажмите левой кнопкой на плитку периода времени и зажав перетащите ее, будет выбран период.


Чтобы очистить Временную шкалу или Срез, нажмите на шкале в правом верхнем углу кнопку Очистить фильтр.


Как и Cрез для фильтрации данных, Временную шкалу можно добавить один раз и затем использовать в любой момент для изменения диапазона времени Сводной таблицы.


Настройка вида Временной шкалы и Среза


Временную шкалу или Срез можно переместить расположив в более удобном месте, изменить их размер или стиль.


Чтобы переместить фигуру, просто перетащите ее в нужное место на листе.


Чтобы изменить размер, нажмите на фигуру, затем выберите нужный размер, перетаскивая маркеры размера или задав его на вкладке Параметры.


Чтобы изменить стиль, нажмите на фигуру, отобразится меню Инструменты временной шкалы, выберите нужный стиль на вкладке Параметры.


Использование Временной шкалы и Срезов для нескольких Сводных таблиц


Если ваши Сводные таблицы имеют один источник данных, вы можете использовать одну Временную шкалу и несколько Срезов для фильтрации для нескольких таблица.


Щелкните на Временную шкалу или Срез, а затем выберите на вкладке Параметры ► Подключения к отчетам. В открывшемся окне выберите Сводные таблицы, которые вы хотите добавить:

Применение Временной шкалы и Срезов в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Видео, Длиннопост

Для использования Временной шкалы для "Умной" таблицы преобразуйте её в Сводную, на вкладке Конструктор ► Сводная таблица или Вставка ► Сводная таблица. Это очень удобно и даёт больше вариантов для маневра.


Подробнее о Временной шкале и Срезах смотрите в видео ⬇⬇⬇

Показать полностью 8 1
242

"Умные" таблицы в Excel

"Умные" таблицы в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Длиннопост

В Excel много инструментов, о которых большинство пользователей не подозревают или сильно недооценивают. Одним из таких являются Таблицы.


Разве данные в Excel имеющие структуру таблицы – это не таблица?
Отвечу вам: Нет.

То что вы считаете таблицей, представляет собой Рабочую область листа.


Таблица – это объект, имеющий свое название, внутреннюю структуру, свойства и преимущества по сравнению с обычным диапазоном ячеек.


Создание Таблицы


Для создания Таблицы встаньте на Рабочую область листа содержащую данные для создания таблицы и нажмите сочетание клавиш CTRL+T(L). В появившемся окне вы можете изменить диапазон выделения данных для построения таблицы, нажмите ОК.

"Умные" таблицы в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Длиннопост

Так же для преобразования диапазона в Таблицу можно выделить выделите любую ячейку диапазона с данными, затем выбрать последовательно Вставка ►Таблицы ►Таблица.


Переименование Таблицы


В вашем файле планируется несколько Таблиц? Есть смысл присвоить для каждой Таблицы свое имя. Это облегчит их дальнейшее использование (например, при работе в Power Query или Power Pivot).


Для переименования установите курсор в любую ячейку Таблицы, в появившемся окне Конструктор в разделе Свойства введите новое имя в поле Имя таблицы:

"Умные" таблицы в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Длиннопост

Свойства Таблицы


1. Заголовки таблицы берутся из первой строки исходного диапазона.

При прокрутке вниз названия столбцов Таблицы (шапки) заменяют названия столбцов листа, следовательно дополнительное закрепление столбцов не требуется:

"Умные" таблицы в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Длиннопост

2. В таблицу по умолчанию добавляется фильтр, который можно убрать на вкладке Конструктор или сочетание CTRL+SHIFT+L:

"Умные" таблицы в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Длиннопост

3. При введении формулы в одну ячейку, она сразу копируется на весь столбец, т.е. формулу не нужно протягивать в вручную.


4. При добавлении в таблицу новых столбцов и строк они автоматически включатся в Таблицу. При наличии формул они автоматически применяются для новых данных.


5. Добавить строку итогов (суммирование, среднее и др.) для столбцов Таблицы можно сочетанием клавиш CTRL+SHIFT+T:

"Умные" таблицы в Excel Excel, Аналитика, Бухгалтерия, Продуктивность, Ms Office, Офис, Таблица, Длиннопост

Настройка Таблицы


Изменить внешний вид Таблицы, вывести итоги, удалить дубликаты, создать Сводную таблицу, переименовать или удалить её можно на вкладке Конструктор.


Для использования Временной шкалы для Таблицы преобразуйте её в Сводную, на вкладке Конструктор ► Сводная таблица или Вставка ► Сводная таблица.


Преобразование Рабочей области в Таблицу является обязательным условием для использования возможностей Power Query и Power Pivot.

Показать полностью 5
268

Редизайнер таблиц в Excel

Не секрет, что большинство пользователей Excel, создавая таблицы на листах, думают в первую очередь о собственном комфорте и удобстве. Так рождаются на свет красивые, со сложными "шапками", пестрые и громоздкие таблицы, которые при этом совершенно нельзя ни отфильтровать, ни отсортировать, а про автоматический отчет сводной таблицей лучше и не думать вообще.


Рано или поздно пользователь такой таблицы приходит к мысли, что "пусть будет не так красиво, зато можно работать" и начинает упрощать дизайн своей таблицы, приводя его в соответствие с классическими рекомендациями:

- простая однострочная шапка, где у каждого столбца будет свое уникальное название (имя поля)

- одна строка - одна законченная операция (сделка, продажа, проводка, проект и т.д.)

- без объединенных ячеек

- без разрывов в виде пустых строк и столбцов


Но если сделать однострочную шапку из многоэтажной или разбить один столбец на несколько достаточно просто, то реконструирование таблицы может занять много времени (особенно при больших размерах ). Имеется ввиду следующая ситуация:

из такой таблицы

Редизайнер таблиц в Excel Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

сделать

Редизайнер таблиц в Excel Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

В терминах баз данных нижнюю таблицу обычно называют плоской (flat) - именно по таким таблицам лучше всего строить отчеты сводных таблиц (pivot tables) и проводить аналитику.


Преобразовать двумерную таблицу в плоскую можно при помощи простого макроса. Откройте редактор Visual Basic через вкладку Разработчик - Visual Basic (Developer - Visual Basic Editor) или сочетанием клавиш Alt+F11. Вставьте новый модуль (Insert - Module) и скопируйте туда текст этого макроса:

Sub Redesigner()

Dim i As Long

Dim hc As Integer, hr As Integer

Dim ns As Worksheet

hr = InputBox("Сколько строк с подписями сверху?")

hc = InputBox("Сколько столбцов с подписями слева?")

Application.ScreenUpdating = False

i = 1

Set inpdata = Selection

Set ns = Worksheets.Add

For r = (hr + 1) To inpdata.Rows.Count

For c = (hc + 1) To inpdata.Columns.Count

For j = 1 To hc

ns.Cells(i, j) = inpdata.Cells(r, j)

Next j

For k = 1 To hr

ns.Cells(i, j + k - 1) = inpdata.Cells(k, c)

Next k

ns.Cells(i, j + k - 1) = inpdata.Cells(r, c)

i = i + 1

Next c

Next r

End Sub

После этого можно закрыть редактор VBA и вернуться в Excel. Теперь можно выделить исходную таблицу (полностью, с шапкой и первым столбцом с месяцами) и запустить наш макрос через Разработчик - Макросы (Developer - Macros) или нажав сочетание Alt+F8.


Макрос вставит в книгу новый лист и создаст на нем новый, реконструированный вариант выделенной таблицы. С такой таблицей можно работать "по полной программе", применяя весь арсенал средств Excel для обработки и анализа больших списков.


Также есть второй вариант для работы с большими таблицами

Sub Redesigner()

Dim inpdata As Range, realdata As Range, ns As Worksheet

Dim i&, j&, k&, c&, r&, hc&, hr&

Dim out(), dataArr, hcArr, hrArr

hr = Val(InputBox("Сколько строк с подписями данных сверху?"))

hc = Val(InputBox("Сколько столбцов с подписями данных слева?"))

Set inpdata = Selection

If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub

Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)

dataArr = realdata.Value

If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value

If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value

ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)

Set ns = Worksheets.Add

For i = 1 To UBound(dataArr, 1)

For j = 1 To UBound(dataArr, 2)

If Not IsEmpty(dataArr(i, j)) Then

k = k + 1

For c = 1 To hc: out(k, c) = hcArr(i, c): Next c

For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r

out(k, c + r - 1) = dataArr(i, j)

End If

Next j, i

ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out

End Sub

Редизайн таблиц сэкономит кучу времени, нервов и сил, чтобы в оставшееся время почитать пикабу))

Взято отсюда

Показать полностью
87

VBA Excel - вывести формулы в ячейки

Была задача по переносу вычислений из экселя. Чтобы не лезть и не смотреть формулу в каждой ячейке я написал небольшой макрос, который их выводит.

Ниже выделенного диапазона на 10 строк выводятся все формулы и значения из заполненных ячеек.

Получается вот такая штука, которую гораздо проще разобрать и перенести

VBA Excel - вывести формулы в ячейки Excel, Vba, Макрос

Сам макрос:

Sub DrawFormulas()
For Each Cell In Selection
CellFormula = Cell.Formula
If Left(CellFormula, 1) <> "=" Then CellFormula = "=" + CellFormula
If Trim(CellFormula) <> "=" Then Cell.Offset(Selection.Rows.Count + 10).Value = Cell.Address + CellFormula
Next
End Sub

592

Отслеживание входа пользователей в книгу Excel

Как понятно из заголовка, мы сделаем так, чтобы открытие рабочего файла на общем сетевом диске не осталось бесследным. Макрос будет фиксировать на отдельном (скрытом) листе имя пользователя, открывшего файл, а также дату-время открытия и закрытия файла.


Этап 1. Создаем "Лог"

Добавим в нашу книгу новый лист, куда будет записываться информация о всех пользователях и назовем его, например, Лог. На нем создадим простую шапку будущего журнала учета посетителей:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 2. Макросы фиксации входа-выхода

Теперь добавим макросы для записи на лист Лог даты-времени и имен пользователей при открытии и закрытии книги. Для этого нужно открыть редактор Visual Basic с помощью сочетания Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer) и найти в левом верхнем углу панель Project (если она не отображается, то включить ее можно сочетанием клавиш Ctrl+R):

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Двойным щелчком откройте модуль ЭтаКнига (ThisWorkbook) и вставьте туда пару наших макросов для обработки событий открытия и закрытия книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow>1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub

Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

End Sub

Попробуйте открыть-закрыть этот файл пару раз и убедитесь, что на лист Лог попадает ваше имя пользователя (логин входа в Windows) и дата-время:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 3. Улучшаем надежность

Можно было бы скрыть лист Лог и на этом остановиться, но есть одно "но": если у пользователя, который открывает нашу книгу, макросы разрешены по умолчанию либо он сам их разрешает, нажав в окне предупреждения на кнопку Включить содержимое, то все в порядке:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Но что если пользователь не разрешит выполнение макросов или они отключены у него по умолчанию? Тогда наши макросы отслеживания выполняться не будут и фиксации имени и даты не произойдет :( Как же заставить пользователя разрешить использование макросов?

Чтобы обойти эту проблемку воспользуемся небольшой тактической хитростью. Добавьте в нашу книгу еще один чистый лист, назовите его Предупреждение и вставьте на него следующий текст:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Суть в том, чтобы по умолчанию скрыть в книге все листы кроме этого, а рабочие листы с данными отображать с помощью специального макроса. Если пользователь не разрешил выполнение макросов, то он увидит в книге только один лист с предупреждением. Если же макросы разрешены, то наш макрос обработки события открытия книги скроет лист с предупреждением и отобразит листы с данными. Чтобы пользователь сам не отобразил их - используем суперскрытие вместо обычного скрытия листов (параметр xlSheetVeryHidden вместо обычного False).

Чтобы реализовать все описанное, слегка изменим наши процедуры в модуле ЭтаКнига (ThisWorkbook)

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'скрываем все листы, кроме листа ПРЕДУПРЕЖДЕНИЕ

Worksheets("Предупреждение").Visible = True

For Each sh In ActiveWorkbook.Worksheets

If sh.Name = "Предупреждение" Then

sh.Visible = True

Else

sh.Visible = xlSheetVeryHidden

End If

Next sh

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub


Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

'отображаем все листы

For Each sh In ActiveWorkbook.Worksheets

sh.Visible = True

Next sh

'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ

Worksheets("Предупреждение").Visible = xlSheetVeryHidden

Worksheets("Лог").Visible = xlSheetVeryHidden

End Sub

Чтобы просмотреть скрытый Лог откройте редактор VisualBasic (Alt+F11), выделите лист на панели Project и измените его видимость на панели Properties, используя свойство Visible:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Если пользователи настолько продвинутые, что знают про суперскрытые листы и могут их отобразить через редактор Visual Basic или нарушить работу наших макросов, то можно дополнительно поставить пароль на просмотр и изменение макросов. Для этого щелкните правой кнопкой мыши по имени файла в панели Project (строка VBAProject (blackbox.xls)), выберите команду VBA Project Properties и включите флажок Lock project for viewing и задайте пароль на вкладке Protection:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Теперь точно никто не уйдет безнаказанным.


Интересные поправки в макрос из комментария источника:

Вместо поиска последней занятой строки в таких случаях я обычно вставляю новую строку сразу после "шапки". Все предыдущие строки сдвигаются вниз, конечно. В результате немного упрощается код, сортировка получается обратная, "новые сверху", что позволяет быстрее просматривать последние записи, не прокручивая лист. При открытии - вставляется строка, её номер всегда будет 2. При закрытии файла в строку 2 добавляется время. Переполнение этого стека маловероятно, но и проверку такого переполнения проводить не нужно, просто отрезать строки ниже запланированного количества записей, без проверки.

Private Sub Workbook_Open()

Worksheets("Реестр изменений").Rows("2:2").Insert Shift:=xlDown 'вставляем между строками 1 и 2 новую строку

Worksheets("Реестр изменений").Rows("501:501").Delete Shift:=xlUp 'удаляем строку 501 (реестр на 500 строк)

Worksheets("Реестр изменений").Cells(2, 1) = Environ("USERNAME") 'запись в первую ячейку второй строки

Worksheets("Реестр изменений").Cells(2, 2) = Now 'запись во вторую ячейку второй строки

Показать полностью 5
158

Макрос для выделения дубликатов разными цветами

Как известно, чтобы выделить дубликаты цветом в Excel можно воспользоваться специальной опцией в «условном форматировании».

Достаточно выделить диапазон, задать цвет заливки, - и все повторяющиеся (или, наоборот, уникальные) значения будут выделены.

Но иногда требуется, чтобы различные повторяющиеся значения были выделены РАЗНЫМИ ЦВЕТАМИ.

В этом случае, без макросов не обойтись. Нажимаем сочетание клавиш Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставляем новый пустой модуль через меню Insert - Module и копируем туда код этого макроса:

Sub ВыделитьДубликатыРазнымиЦветами()

On Error Resume Next

' массив цветов, используемых для заливки ячеек-дубликатов

Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _

9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213)

Dim coll As New Collection, dupes As New Collection, _

cols As New Collection, ra As Range, cell As Range, n&

Err.Clear: Set ra = Intersect(Selection, ActiveSheet.UsedRange)

If Err Then Exit Sub

ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False

For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes

Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value)

If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value)

Next cell

For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов

n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1

Next

For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет

cell.Interior.color = cols(CStr(cell.Value))

Next cell

Application.ScreenUpdating = True

End Sub

Теперь можно выделить любой диапазон с данными на листе и запустить макрос с помощью сочетания клавиш Alt+F8 или через кнопку Макросы (Macros) на вкладке Разработчик (Developer).

Макрос для выделения дубликатов разными цветами Excel, Макрос, Vba, Полезное, На заметку

Плюсом этого макроса является то, что он не виснет при выделении всего листа (или столбца) целиком и не вылетает с ошибкой, если найдено более 55 дубликатов. Макрос взят здесь

Показать полностью 1
250

Пишем парсер зарплат headhunter в Excel

Задача: получить зарплаты некой профессии, например, "Программист JavaScript"

Пишем парсер зарплат headhunter в Excel Excel, Макрос, Парсер, Видео, Длиннопост

Решение:

Пишем макрос в Excel

Sub JS_HH()

- начало макроса

Dim URL As String

- объявляем строковую переменную URL

URL = "https://hh.ru/search/vacancy?area=1&area=2019&clusters=true&employment=full&enable_snippets=true&items_on_page=100&no_magic=true&schedule=fullDay&search_field=name&text=Программист JavaScript&only_with_salary=true&from=cluster_compensation&showClusters=true"

- URL с нужным запросом и параметрами


Dim IE As Object
Dim ieDoc As Object

- объявляем объекты IE (браузер) и ieDoc (код страницы)

Set IE = CreateObject("InternetExplorer.Application")

- запускаем InternerExpolorer в фоновом режиме

IE.navigate URL

- переходим в браузере по нужному нам URL

Do Until (IE.readyState = 4 And Not IE.Busy)
DoEvents
Loop

- ожидаем загрузки страницы

Set ieDoc = IE.Document

- присваиваем объекту ieDoc содержание страницы IE

i = 1

- присваиваем счётчику значение 1

Set detail_elements = IE.Document.getElementsByTagName("span")
- получаем массив html-тегов "span"

For Each detail_element In detail_elements

If detail_element.getAttribute("data-qa") = "vacancy-serp__vacancy-compensation" Then

- ищем в массиве элементов "span" теги со значением атрибута "data-qa" = "vacancy-serp__vacancy-compensation"

Пишем парсер зарплат headhunter в Excel Excel, Макрос, Парсер, Видео, Длиннопост
Sheets("JS HH").Cells(i, 1) = detail_element.innerText
- заполняем ячейки на листе JS HH текстовым значением тега "span", подходящего по условию, начиная с ячейки A1
i = i + 1

-прибавляем счётчик

End If

- конец условия

Next detail_element

- конец цикла ForEach

IE.Quit

- закрываем браузер IE

DoEvents

- ожидание выполнения прошлого действия

End Sub

- конец макроса

Готово!

Обрабатываем результаты:

Пишем парсер зарплат headhunter в Excel Excel, Макрос, Парсер, Видео, Длиннопост

использую несколько вложенных ЕСЛИ, ПОИСК, ЗНАЧЕН и ПСТР)

=ЕСЛИ(ЕОШИБКА(ПОИСК("от";'JS HH'!A1));ЕСЛИ(ЕОШИБКА(ПОИСК("-";A1));;ЕСЛИ(ЕОШИБКА(ПОИСК("руб";A1));ЕСЛИ(ЕОШИБКА(ПОИСК("USD";A1));ЗНАЧЕН(ПСТР(A1;1;5))*ЗНАЧЕН(ПСТР('курс доллара'!$A$80;1;2));ЗНАЧЕН(ПСТР(A1;1;5))*ЗНАЧЕН(ПСТР('курс доллара'!$A$77;1;2)));ЕСЛИ(ЕОШИБКА(ЗНАЧЕН(ПСТР(A1;1;7)));ЗНАЧЕН(ПСТР(A1;1;6));ЗНАЧЕН(ПСТР(A1;1;7)))));ЕСЛИ(ЕОШИБКА(ПОИСК("руб";A1));ЕСЛИ(ЕОШИБКА(ПОИСК("USD";A1));ЗНАЧЕН(ПСТР(A1;4;5))*ЗНАЧЕН(ПСТР('курс доллара'!$A$80;1;2));ЗНАЧЕН(ПСТР(A1;4;5))*ЗНАЧЕН(ПСТР('курс доллара'!$A$77;1;2)));ЕСЛИ(ЕОШИБКА(ЗНАЧЕН(ПСТР(A1;4;7)));ЗНАЧЕН(ПСТР(A1;4;6));ЗНАЧЕН(ПСТР(A1;4;7)))))

Источник

Показать полностью 2 1
58

VBA Excel - массовая безопасная замена

Решил поделиться ещё одним полезным отрывком кода. Была задача массовой замены в документе одних значений на другие, при этом они могли пересекаться (изменилась нумерация) и обычная последовательная замена приводила к хаосу. В результате получилась вот такая процедурка для замены в 2 прохода.

Sub SafeReplace(TargetRange As Range, ReplaceRules As Range)
' безопасный массовый поиск и замена
' TargetRange: где ищем, ReplaceRules: правила замены, первый столбец - что найти, второй - на что заменить
For i = 1 To ReplaceRules.Rows.Count ' for each
TargetRange.Replace _
What:=ReplaceRules.Cells(i, 1), Replacement:="!SafeReplace" + CStr(i) + "!", _
MatchCase:=False
Next ' замена 1 проход
For i = 1 To ReplaceRules.Rows.Count ' for each
TargetRange.Replace _
What:="!SafeReplace" + CStr(i) + "!", Replacement:=ReplaceRules.Cells(i, 2), _
MatchCase:=True
Next ' замена 2 проход
End Sub
с форматированием - на pastebin.com

Пример использования: на вкладке ReplaceRules есть таблица замены

VBA Excel - массовая безопасная замена Excel, Vba, Замена

Для замены в выделенном фрагменте используем следующий макрос, привязанный на горячую кнопку.

Sub ReplaceSelected()
Application.ScreenUpdating = False
Dim ReplaceRulePos As Range
Set ReplaceRulePos = Worksheets("ReplaceRules").Range("A1").CurrentRegion.Offset(1, 0) ' смещение на 1 строку, без заголовка
Call SafeReplace(Selection, ReplaceRulePos.Resize(ReplaceRulePos.Rows.Count - 1)) ' изменить размер области, чтобы последний пустой ряд не обрабатывался и вызвать автозамену
Application.ScreenUpdating = True
End Sub
45

VBA Excel - выбор документа для обработки

Несколько раз была задача, когда изменения надо вносить не в текущий документ, а в документ с неизвестным именем. В результате получилась вот такая форма:

VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост

В listbox выводится список открытых документов или можно открыть файл через стандартный диалог открытия.

К сожалению, эксель не экспортирует формы в текстовом виде (во всяком случае, 2007 точно нет), поэтому будут скрины контролов и их свойств.

VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост
VBA Excel - выбор документа для обработки Excel, Vba, Длиннопост

Как вы видите, я не заморачивался с названиями.

Код:

Public SrcName

Private Sub CommandButton1_Click()

SrcName= ""

If ListBox1.ListIndex >= 0 Then

SrcName= ListBox1.List(ListBox1.ListIndex)

UserForm1.Hide

End If

End Sub

Private Sub CommandButton2_Click()

SrcName= ""

UserForm1.Hide

End Sub

Private Sub OpnButton_Click()

iOpen = Application.Dialogs(xlDialogOpen).Show

If iOpen = True Then

SrcName= ActiveWorkbook.Name

UserForm1.Hide

Else

MsgBox "отмена", vbCritical, ""

Exit Sub

End If

End Sub

Private Sub UserForm_Activate()

SrcName= ""

ListBox1.Clear

NoShow = ThisWorkbook.Windows(1).Caption

For i = 1 To Application.Windows.Count

If Application.Windows(i).Caption <> NoShow Then ListBox1.AddItem (Application.Windows(i).Caption)

Next ' enum windows

End Sub

Пикабу сожрал все отступы, это не я!

Пример использования:

Dim SrcWB As Worksheet
UserForm1.Show
If UserForm1.SrcName= "" Then Exit Sub
Windows(UserForm1.SrcName).Activate
Set SrcWB = ActiveWorkbook

P.S. Баянометр считает, что эксель на 41% похож на клубничку. Мне кажется, что он недалёк от истины.

Показать полностью 5
115

Поваренная книга Экселиста #0 - Пару слов об Экселе

Для начала - рад видеть, что моих любимых и обожаемых подписчиков стало 21.. Шутки про  "За 2 дня на Пикабу у меня - очко" оставлю себе))) В первую лавочку пишу для вас, ну и отдельная вам благодарочка за то, что вам это интересно.

Так как я такой же логичный, как стол-жираф-48, начну с того, с чего надо было начать изначально - а зачем, в принципе, Эксель то нужен, и что с ним можно делать (кроме Зиночка_Счет_В_Экселе_Сделает). Тут уже предвижу холивар, прям чувствую, потому сразу подкину на вентилятор.
Основные задачи в классическом понимании это НЕ ХРАНЕНИЕ данных, а их обработка. То есть, если рассматривать классическую MVC-модель - это контроллер. Потому что для представления есть бумага и принтер.

То, что мы храним в Экселе данные - ну да, нам так проще. Но по факту любая СУБД Эксель уничтожит по скорости работы непосредственно с данными. Но, чтобы что-то похожее на обработку организовать на уровне работы с СУБД - придется уже городить несколько этажей SQL запросов.

Потому данные выгружают в Эксель, а там уже и "понеслась звезда по кочкам".

Да, сравнивать табличный процессор и модель разделения данных полностью неправильно, и все равно что сравнивать ежа и ужа, но... приходится, так как другой аналогии я с ходу не подберу. Да и, хоть она кривая, но определенное сходство есть.. Ну помним про мою логику, да?))

Отсюда, как мне кажется, возникает одна такая ошибочка - Эксель это не способ сделать "правильно", это способ сделать БЫСТРО и РАБОЧЕ. 90% расчетных файлов в экселе понимает разработчик и Майкл Джексон, ситуация ровно такая же, как и с ремонтом ( "вот пусть тот криворукий исправляет пол, без пола лампочку не повесить").

Далее чуть объяснений и примеров...

В последнее время очень "модно и молодежно" вводить машинный анализ в прогнозирование возможного поведения клиента (про b2c сегмент говорим). То есть, допустим, на основе покупок клиента делать прогноз (не статистику собираем, а Вангу косплеим) совершения им следующей покупки (как даты, так и состава комплексной покупки) и о возможных similar к ней. И уже на основании этого делать какие-либо выводы и офферы разные предлагать (ну там сырный соус к покупке, ну вы поняли да?)) ).

Реализация этого в экселе занимает от часов до дня, реализация этого в CRM занимает от недель до "на третьи сутки после второго пришествия". Причем реализация на уровне CRM нифига не будет работать без прототипа, реализованного или на бумажке (в виде ТЗ) или в виде костылявых обработок в Экселе. Ведь программист, про кодера даже не будем, не обязан и не будет представлять себе вашу бизнес-логику, ему до нее как Ильичу до лампочки. Да и по поводу ТЗ крайне метко выразился мой препод в институте - то, что вы написали в ТЗ не будет работать так, как это вы написали, а будет так, как прочел (понял) разработчик. Потому мы делает что? Правильно - бьемся челом об сруб светлицы что-то невообразимо-кривое в Экселе, но при перемножении лося и порося получаем искомые 63,3%. Что и служит уже как и вашей (дядиной) прибыли, так и методом контроля разработки. То есть вы берете чистые данные, которые хранятся НЕ в Экселе, а в СУБД, и уже их вьювите и контролите.

Ну и, чтобы разбавить это "много-букофф-ниочем" - боевой пример.

Делаем простейшую экспертную систему в Экселе (без регистации и смс).

Вот таблица:

Поваренная книга Экселиста #0 - Пару слов об Экселе Excel, Таблица, Полезное, На заметку, Ms Office, Длиннопост, Обработка данных, Субд

Найдите глазами столбец "% win". В зависимости от нее - строка перекрашивается в другой цвет, меняется шрифт, ну и чем значение больше - тем больше вероятность покупки. Цифры относительны, получены крайне простым способом - телефон в руки и обзвон разных групп клиентов. Вычитаем оттуда погрешность "на идиота" и вуаля.

Сама формула:

=VLOOKUP(I109/J109*1000;_tech!$F$2:$G$10;2;TRUE)+
IF(K109="";0;IF(K109>43689;15;VLOOKUP(DATEDIF
(K109;"12/8/19";"D");_tech!$J$2:$K$9;2;TRUE)))

А теперь понимаем как это сделать.

Конкретно этот пример - фитнес. Далее мы ищем данные. Конкретно в моем случае искалось так:

- Таблица с клиентами - CRM (оттуда выгрузка в эксель, листы 62_кк)

- СКУД - с сервера СКУД (да, в CRM она интегрирована криво + карты можно и "забыть" внести в саму CRM, потому что некогда админам) (лист "посещения_приведенные", и "пос_")

- Статистика звонков - с телефонии (потому что оттуда она тупо информативнее, и мне не интересно мнение менеджера о клиенте. Если менеджер говорил более минуты - значит клиенту интересно, просто ему предлагали не то, что ему нужно). (лист 4)

- Дополнительные покупки - CRM (лист "Этот")

- Экспертная оценка - эмпирически-добытые факты. (лист _tech)
(часть данных потер, ибо прайваси-все-дела + обработку специально взял аж с августа, с того времени их было еще версий 20)

Теперь включаем чем думать:

Клиент ходит постоянно -> его все устраивает

Клиент купил карту за сумму N -> сумма его устраивает (то есть предложи столько же или меньше, но не больше)

Клиент покупает что-либо еще -> деньги у клиента не кончились

Карта заканчивается в течение квартала -> купит сейчас, если пункты 1-3 соблюдены.

Клиент женщина 30+, на дворе август, клиент не ходит с июня -> предложить карту и детские занятия со скидкой

Клиенту не звонили с сервисными звонками в течение месяца и пункты 1-3 соблюдены -> звонить в ПЕРВУЮ очередь (не задрочен)

Клиент ходил, сейчас не ходит, возраст до 21 -> звонить и предлагать рассрочку, свалил на лето.

Каждому событию присваиваем свой вес, получаем 2 группы для обзвона. Клиенты на продление и клиенты с детьми на детские занятия.

Все просто, да? А теперь попытайтесь внедрить это в CRM за неделю) А за две? А за месяц? Да фиг выйдет.. В экселе заняло чуть больше 2х часов.

Коэфы задаем отдельно, даже цвета для выделения строк - тоже задаем через "техническую" вкладку.

Поваренная книга Экселиста #0 - Пару слов об Экселе Excel, Таблица, Полезное, На заметку, Ms Office, Длиннопост, Обработка данных, Субд

И да, это тоже можно сделать по другому. А можно и не делать, ведь зачем нужно что-то делать, когда можно просто обсудить все в комментах, неправда ли?))

Показать полностью 2
103

Поваренная книга Экселиста #1 - Преобразовываем ФИО

Привет всем, моему одному подписчику - отдельное трямс)
Подумалось - надо чуть поделиться некоторыми наработками, которые собрались в голове за последние лет эдак 20 работы с различными БД (к коим я с легкостью отношу Эксель). В связи с чем будет ажно целый ряд статеечек на тему, в первую очередь, оптимизации рабочего времени (ну в смысле сделал за 10 минут и дальше листаешь пикабушечку). Поехали с достаточно частой задачи:

РЕЦЕПТ 1:  Преобразовываем ФИО в Ф / И / О, без использования VBA и прочей нехристи.
Для начала чуть теории - большинство, наверняка, сталкивались с такой задачей - есть ФИО в одном столбце, а нужно вытянуть только имя, ну или два столбца ИМЯ и ФАМИЛИЯ. Да или даже поменять местами, задачи разные - суть одна. Теперь давайте разбираться что имеем - имеем строку с N-количеством слов, разделенных одинаковым символом " " (ну или чуть сложнее с массивом, содержащим N-количество элементов, в роли разделителя " "). Тут важно понять сам смысл - все, что имеет закономерность, подлежит автоматизации. В нашем случае закономерность будет вот такая - СЛОВО" "СЛОВО" "СЛОВО, следовательно мы ИЛИ должны "выбрать" нужное нам СЛОВО из всей строки, или чуть схитрить) Но начнем с выбора.

ВАРИАНТ 1: Средствами экселя. Определяем нахождение разделителей по длине строки.
1. Создаем отдельную страницу (на всякий случай)
2. Вставляем данные - Допустим вид будет вот такой
ID | ФИО
1  | Иванов Иван Иванович (b2)

3. Выбираем ПЕРВОЕ СЛОВО, ячейка (c2)
=TRIM(LEFT(B2;FIND(" ";B2;1)))
Что сделали - нашли первое вхождение символа " " в строку, и резанули все, что после него.

4. Выбираем ВТОРОЕ СЛОВО, ячейка (d2)
=TRIM(MID(B2;FIND(" ";B2;FIND(" ";B2;1))+1;FIND(" ";B2;FIND(" ";B2;1)+1)-FIND(" ";B2;FIND(" ";B2;1))))
Что сделали - указали Экселю на "координаты" первого и второго разделителей, скорректировали координаты (порезали длину строки на лишний символ " ").

5. Выбираем ТРЕТЬЕ СЛОВО, ячейка (e2)
=TRIM(MID(B2;FIND(" ";B2;FIND(" ";B2;1)+1)+1;LEN(B2)))
Что сделали - то же самое, что и со ВТОРЫМ СЛОВОМ, только так как нам не нужно резать по второй координате - за нее взяли длину строки.

На выходе получили вот так:

Поваренная книга Экселиста #1 - Преобразовываем ФИО Excel, Material design, Таблица, Полезное, На заметку, Ms Office, Длиннопост

Подходит для постоянного применения и в случае, если разделитель всегда один и тот же.
Теперь для тех, кто хочет схитрить)

СПОСОБ 2: Подмена разделителя
1. Выделяем столбец с ФИО.
2. Открываем текстовый редактор (дада, Блокнот / TextEdit), вставляем туда. ОБЯЗАТЕЛЬНО переведите его в формат Plain Text/ просто текст (формат сохранения .txt) (!)
3. Находим функцию "Найти и заменить".
3.1. В поле найти введите символ " " (то есть просто поиск по одиночному пробелу).
3.2. В поле заменить вставьте символ TAB. Для этого на первой строке нажмите TAB, выделите его, cmd+c,  cmd+v (или control, у кого какая религия)

Поваренная книга Экселиста #1 - Преобразовываем ФИО Excel, Material design, Таблица, Полезное, На заметку, Ms Office, Длиннопост

3.3. Примените, скопируйте, вставьте в Эксель... И собственно так, если не знали - встречайте, TAB - символ переноса на следующую ячейку))

Поваренная книга Экселиста #1 - Преобразовываем ФИО Excel, Material design, Таблица, Полезное, На заметку, Ms Office, Длиннопост

Надеюсь данные способы вам потребуются) И, главное, на забывайте - работает не только на ФИО)
Понравилось? Что-то интересно? Прошу в комменты)  Ну и там лайк/ подписка / кошелек / очки / мотоцикл)

Показать полностью 3
148

О пользе продвинутого знания Ёкселя и о программировании

Надо внести в онлайновую базу, по работе, 180 записей. Каждая из 15 полей. Обычно мы это делали через CTRL+C/CTRL+V из Ёкселя, куда данные вбивались заранее. Т.к. обычно вносилась одна запись в неделю-две, редко больше.- А тут целых 180, причём надо, как обычно, "вчера".

- В базе имеется возможность импорта (через офлайновый конвертер в XML), но только из CSV и по очень строгим правилам: регистр, разделители, дополнительные поля с UUID, разными для разных случаев, которых нет в нашем исходном файле, плюс порядок столбцов совершенно другой и куча дополнительных полей (пустых или с константами).

===

Где-то минут за 40 неспешной и творческой работы наваял простенький конвертер, не выходя из Ёкселя:

- страница с настройками и константами

- страница, куда копипастится блок из рабочего файла Ёкселя, который надо экспортнуть

- страница с результатами, которая тупо сохраняется в CSV.

На этой последней странице - все данные вставляются формулами и ссылками на первые две. Причём для разных типов записей подставляются необходимые константы, меняется регистр, где критично, даты перегоняются в текст (т.к. Ёксель при сохранении делает их числами) и т.п. Простых ссылок на ячейку практически нет.

===

Затем за пару прогонов через утилиту перегнал в XML, подписал ЭЦП и загнал на сайт. Ошибок: 0.

- Это заняло у меня ещё минут 15, вместе с проверкой исходных данных и результата, подписью ЭЦП и проверки, что всё успешно залилось и открывается онлайн.

===

Стал считать, сколько набивал бы вручную. Я работаю практически только с клавы, поэтому на копипаст 1 поля уходит, пускай, 1 секунда.

- Т.е. CTRL+C ALT+TAB CTRL-V TAB ALT-TAB Right... и так много раз подряд.

- Это 15*180=2700 секунд или 45 минут непрерывной, неотрывной работы.

- Это без учёта необходимости кликнуть в браузере "Добавить запись" и в конце "Сохранить" и промотать колонки в Ёкселе, т.к. их порядок не совпадает с порядком полей на сайте.

- И без учёта возможных косяков при копипащении.

- И часть полей на сайте выбираются из списка и, разумеется, только мышкой. И делать это приходится внимательно, т.к. значения очень похожие внешне.

===

Ну и да, я НЕНАВИЖУ монотонную работу. Для меня и 10 записей подряд внести напряжно. Так что сидел бы я пару рабочих дней точно...

===

Потом прикинул, сколько времени это заняло бы у секретаря, которая вобще-то и должна набивать эту базу.

- И которая из клавиатурных комбинаций знает, видимо, только ESC, да и то не уверен. И копировать/вставлять/переключать окна умеет только мышкой.

- Попробовал смоделировать её скорость работы (мышкой) - получилось секунд 10 на одно поле. Т.е. 7.5 часов, опять же - непрерывной, - работы.

- Сколько в процессе будет косяков в базе и сколько данных из других ячеек будет "случайно" вставлено в Ёксель - тут я просто до судорог боюсь представить, со своей педантичностью.

===

Мораль простая. По возможности, изучайте программирование в целом и формулы MS Excel в частности.

- Это реально ОЧЕНЬ помогает в работе.

- И ОЧЕНЬ экономит нервы.

Показать полностью
112

ВПР и прочие вычисления со сводной таблицы

Возможно кто-то когда-нибудь пытался ВПР-ить данные прямо со сводной таблицы и у него это не получалось, так как ексель не читает с него данные.
Для этого есть решение!

ВПР и прочие вычисления со сводной таблицы Excel, Ms Office, Длиннопост

Параметры

ВПР и прочие вычисления со сводной таблицы Excel, Ms Office, Длиннопост

Формулы

ВПР и прочие вычисления со сводной таблицы Excel, Ms Office, Длиннопост

Убрать галочку с "использовать функции GetPivotData для ссылок в сводной таблице"

ВАЖНО:
в источнике, от куда вы берете данные для сводной таблицы, данные должны быть так же отформатированны как там, куда вы делаете ВПР, то есть либо везде числа, либо текст.

PS: не забудьте обновить данные:

ВПР и прочие вычисления со сводной таблицы Excel, Ms Office, Длиннопост
Показать полностью 2
610

Отключение защищенного просмотра в MS Office

Для тех, кого раздражает при постоянной работе с документами нажимать "Разрешить редактирование". Это можно отключить. Для этого идем по пути: Файд - Параметры - Центр управления безопасностью - Параметры центра управления безопасностью - Защищенный просмотр и снимаем все галки. Для наглядности прикрепил пошаговые скрины. Причем проделать это нужно в каждом приложении MS Office.


P.S.Для тех, кто беспокоится о безопасности, делать этого не рекомендую. Но на работе используем только внутреннюю интранет-сеть, поэтому опасаться нечего.

Отключение защищенного просмотра в MS Office Ms Office, Microsoft Word, Excel, Miscrosoft Excel, Длиннопост
Отключение защищенного просмотра в MS Office Ms Office, Microsoft Word, Excel, Miscrosoft Excel, Длиннопост
Отключение защищенного просмотра в MS Office Ms Office, Microsoft Word, Excel, Miscrosoft Excel, Длиннопост
Отключение защищенного просмотра в MS Office Ms Office, Microsoft Word, Excel, Miscrosoft Excel, Длиннопост
Отключение защищенного просмотра в MS Office Ms Office, Microsoft Word, Excel, Miscrosoft Excel, Длиннопост
Показать полностью 3
747

Автоматизация Excel с помощью VBA на примере графика отпусков

(Офисной оптимизации пост (теперь уже с примерами))


В прошлом своём посте (где рассматривал, что есть VBA в Excel и зачем это может пригодиться) целых 137 человек подписалось на меня, в комментариях были призывы к каким-нибудь примерам использования VBA, да и обещал я @Tiafreed подкинуть материалов для ВКР, так что набросал за ночь простенький (в сотню строк кода без использования массивов, классов и т.д.) файлик в Excel с VBA модулем. Пост разделю условно на две части: для пользователей, кому интересно просто посмотреть как выглядит, что делает, плюс скачать, поиграться и для продвинутых пользователей, кому интересно как это работает и как настроить подобное под себя. Цель поста - показать возможности VBA (частично), предложить интересный вариант реализации достаточно распространённой задачи по расчёту отсутствия сотрудников.

Если формат поста зайдёт, то в следующий раз набросаю пример, как формировать Word документы из списка данных в Excel, используя шаблон и пользовательскую форму (и не используя ублюдскую рассылку ИМХО).

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

Стартуем. Что нам нужно? Чтобы мы вносили людей в таблицу, забивали им отпуск, по нажатию одной кнопки машина рассчитывала нагрузку на каждый отдел (и организацию в целом) на каждый день и выделяла это графически. Бонус - построить график из полученных данных и научить выпадающий список самому подставлять данные в него прямо с листа двумя кликами.

Итак, какой порядок. Если запуск макросов разрешен, совместимость не барахлит, молния не ударила в системник после запуска файла и удача нам благоволит, то можем начинать. Сначала вносим данные (тут важное уточнение, даты я вношу в текстовом формате для удобства работы и совместимости).

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

*Все персонажи вымышлены, совпадения случайны


Дальше идём на другой лист, нажимаем кнопку

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

После чего идут расчёты какое-то время (у меня это где-то половина секунды)

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

Машина рапортует нам об успешном завершении своей миссии, идём смотреть, что вышло.

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

(Да, дизайнер я говно (как и VBA кодер в общем-то, но не об этом)) оформить самому никогда не сложно, главное, что на каждый день для каждого человека машина посчитала отпуска (можно любое другое отсутствие), вычислила цифры, разбила по отделам и отразила это графически, идём на главную

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

Тут всё ещё проще, кнопка для запуска, табличка с примитивными расчётами (формула МАКС) и график на 366 дней который можно с лёгкостью оформить самому и с помощью которого отлично видны провалы и пики нагрузок. Нажатием на выпадающий список, мы выбираем отдел по которому выводятся данные. Вот и всё, просто и удобно. Набросал за пару ночных часов. Сразу предупреждаю, что я это не предлагаю, как готовый продукт (успешное бизнес-решение ваших кадровых проблем), просто накидал маленький пример и делюсь им с вами, потому ответственность за его использование и обслуживание не несу, но если есть желание доработать его в своих целях, готов подсказать и помочь. Да, если возникла ошибка, вероятнее всего, что формат даты/числа нарушен, защиту от дурака не ставил, ибо цели чисто демонстрационные, но если вдруг мой косяк (протестить нет возможности) перезалью и ссылку в комментарии кину. Вот сам файл (на свой страх и риск :D, никаких гарантий, что будет работать). https://yadi.sk/d/lsRdKL8wQ42FFw (и не забываем включить макросы)

Сразу отвечу на вопрос - нахрена на VBA можно же на формулах? Да, можно, но так динамично (легко добавлять/убирать людей/отделы), наглядно и расчёт каждого дня формулами будет очень сильно грузить проц, а так мы считаем лишь раз, когда кнопку нажимаем.



Тэкс. Теперь вторая часть, в принципе, дальше можно не читать, так, для очистки совести её пишу. Кому интересно, как это работает или как вообще выглядит VBA на практике. Всё просто, в основе лежит вот эта строка (в ней мы будем искать колонку с датой отпуска и уже в ней работать)

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

Сначала мы подготавливаемся, что-то где-то очищаем, что-то добавляем (всё в общем-то закомментил) и сортируем строки по отделам

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

Потом запускаем цикл перебора строк с сотрудниками, в этом цикле для каждого работника мы проверяем, является ли он началом нового отдела, если да, то делаем разделитель, если нет - кладём болт и идём дальше, дальше рассчитываем отпуска, каким образом? Берём дату начала и ищем её в строке с датами, находим (или не находим и крашимся, если закосячили, не стал пилить защиту от дурака), берём эту ячейку как точку начала, прибавляем количество дней отпуска, отнимаем один (ибо включительно) и это наша точка окончания, объединяем эти ячейки, окрашиваем, в этих столбцах делаем простые расчёты (+1 к каждому дню и перерасчёт процентовки). После прохода по всем персонажам просто копируем полученные цифры на главную страницу, чтобы подставлять их в график. Всё, почти.

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост
Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

И простейший обработчик для выпадающего списка - просто вставляем в строку из которой берёт данные график данные из нужной нам строки. Рассчитываем её как номер строки начала (у нас 22) + номер элемента выпадающего списка (нумерация идёт с нуля у listindex)

Автоматизация Excel с помощью VBA на примере графика отпусков Excel, Программирование, Vba, Visual Basic, Офис, Оптимизация, Ms Office, Длиннопост

P.S. Знаю что говнокод, так что буду рад конструктивной критике, чему-то подучиться у более знающих. В свою защиту скажу, что код писался на халяву, без обработчика ошибок, заплаток, защиты от выстрелов в ноги, ограничений действий, фиксирования диапазона вводимых данных, добавления полосы загрузки и всё такое, чисто для демонстрации. Спасибо, если дочитал это до конца.

Показать полностью 10
1032

Не только финансовая система может держаться на Excel

(Офисной оптимизации пост, точнее, об одном из инструментов этой самой оптимизации)


Привет Пикабу, увидел недавно забавный, но правдивый пост про Excel и решил немного поделиться информацией об этой интересной программе. Предупреждаю, что пост будет длинным и не на ширпотреб, но постараюсь не кидаться терминологией и не вдаваться в тонкости.

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

Так вот, многие даже и не подозревают, сколько всего может на нём держаться, - не только российская мировая финансовая система, но и, например, целый каскад программного обеспечения в какой-нибудь организации. Сам я работал айтишником в одной организации и ввиду специфики работы всей компании, довелось разрабатывать ПО (программное обеспечение) на Excel (да, на этих страничках с табличками, где, как я думал ещё в школьные годы, проводятся всякие узкоспециализированные записи, ну кто будет оформлять документ в какой-то неудобной таблице), профи в области Excel себя не считаю, ибо есть куча белых пятен вроде финансовых функций и надстроек в которых всегда найдутся люди, которые разбираются лучше меня. Но это так, отступление.

Сами по себе формулы - очень мощный инструмент, на умении их использовать вывезло столько оптимизаторов, не владеющих программированием, что, думаю, нет еще офиса, где какой-нибудь местный Кулибин в обеденный перерыв не замутил еще какую-нибудь узкоспециализированную считалку для отдела. Но, работая с большими массивами возникает ряд проблем в использовании формул: относительность (ты получаешь не строку информации в базе данных, а динамичный результат вычисления) и оптимизация. Да, оптимизация на нескольких тысячах строк с десятком колонок и, допустим, парой связанных таблиц, это беда. Такая связка на i3 4гб оперативы просто будет повергать бедный офисный комп в ужас, заставляя его терять сознание при каждом пересчете и вылетать, если ты нарушил священный ритуал пятиминутного сохранения (знал я одного мужика, у него была такая формульная портянка, что сохранял базу он лишь два раза в день, перед обедом и уходя домой, ибо на сохранение уходило минут 20, ненавидели мы его все, ибо, уходя в отпуск, он оставлял это чудище кому-то из нас). Специфика работы была такова, что интернета у нас не было, а стороннее ПО нельзя - пользуйтесь чем дали. Окей, но автоматика же нужна, без неё никуда, потому пришлось использовать то, что есть и открывается это:

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

Разработчикам показалось мало создать мощный инструмент формул, они решили впаять в и так могущественное ПО целый язык программирования (точнее его диалект) VBA (Visual Basic for Application), возможность подключать модули с других языков, использовать API (хоть и работает это ИМХО через жопу) и встроенную среду разработки (а это означает, что вообще ничего не надо качать, если у Вас есть офис, значит все что нужно, чтобы стать мамкиным программистом уже есть). Но что нам это даёт? Огромные (ну это как посмотреть) возможности для разработки ПО, преимущественно узкоспециализированного, без использования чего-либо кроме Excel; базы данных? О чём речь, Excel - это и есть БД (то ещё извращение, но для утонченных можно связать с Access или Sql), возможность проводить расчёты (циклы, тонкие переборы, фильтрация) над большими массивами информации в кустарных условиях, использовать встроенные библиотеки для работы с другими приложениями (самое важное - MS Word), возможность наконец применить Visual Basic, который ты учил лет 20 назад, а он нигде так и не пригодился, ну и самое главное, научиться основам программирования, если ты что-то шаришь, но твои лучшие успехи - верстка шаблонов сайтов на HTML, CSS с вкраплениями PHP. Также это нам даёт возможность кодить на ведре (прям совсем ведре-ведре). VB хоть и относится к ООП, но де-факто работа в нём редко сводится к пользовательским классам, всяким тонкостям и т.д., в основном он ощущается как скриптовый язык, работа приходит к чему:

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

накидать разных элементов управления (это если у нас пользовательская форма, если просто код, то вообще просто запихать всё в модуль) и привязать к ним обработчики событий. Вкурил в циклы, условные конструкции, чутка простого синтаксиса и на рабочий телефон уже звонят из Майкрософт и предлагают тебе перейти к ним (Нет). Но не буду вдаваться в разработку ведь не об этом пост, что из этого можно получить на практике? Рабочие программы с базами данных и пользовательским интерфейсом (чтобы упростить и ограничить взаимодействие пользователя с данными) или скрипты для обработки целой тонны упорядоченной (а может и нет, слава условным конструкциям) информации. Например (набросал за минуту, палками не бить):

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

Немного возни и у нас есть пользовательская форма со списком сотрудников и полями, которые надо заполнить, на выходе по нажатию кнопки мы получаем готовую вордовскую справку. Для этого нужен лист с данными сотрудников, лист список справок и шаблон MS Word. Готово, вы бог офисной оптимизации. И так можно многое: отчёты, справки, товарные чеки, письма, документы разные, приказы целые, любые действия с информацией.

Сразу предупрежу всех, кто уже нацелился писать "на кой хрен ты раскопал этот старый кусок говна на заре 30го десятилетия 21го века". Пост чисто информативный, это не гайд, не самоучитель, может кому интересно, на прорыв в IT сфере ни разу не претендует, это раз, есть в нашей стране места, где развитие этой сферы отстаёт как раз на эти 20 лет, это два, ну и просто, может кому понадобится, может кто-то захочет на работе чему-то подучиться.
Какие минусы? Оптимизация всё равно сосёт бибу (но не такую, как формулы), безопасность тоже, чисто теоретически можно использовать криптографическое шифрование БД и расшифрование в ходе работы, но я не проверял, можно ли легко вскрыть защиту самого VBA проекта, да и оптимизация пососёт ещё большую бибу (да и вообще, кому это надо, ребят, это же Excel), ну а стандартную Excel защиту листов можно вскрыть обычным архивом и блокнотом. Также, недостатком я считаю ряд ограничений среды, по типу того, что без API не работает прокрутка колёсиком мыши, стабильность - excel иногда любит чудить. Совместимость - отдельные танцы с бубном для x64 и x32 (но это если используете сторонние API, модули). Ну и объяснять людям, как разрешить запуск макросов :D.
Спасибо, если дочитал этот длинный (и наверное скучный) пост до конца, если вдруг кому стало интересно могу написать ещё много чего, например, как написать сапёр на Excel, как сделать различные простенькие, но очень нужные офисные программки, как научиться этому (но.. зачем?), как использовать макрорекордер и много чего ещё, связанного с Excel. А ведь это всё ещё цветочки, есть люди, которые целые стратегические пошаговые игры в ячейках писали на том же VBA.

P.S. Если ты профи, знаешь больше и лучше меня, и видишь, что я в чём-то неправ - поправь, буду рад.

Показать полностью 3
172

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0]

Доброго времени суток вам, пикабушники. Решил поделиться с вами личным рецептом как легко и без напряга вести домашнюю бухгалтерию, записывая все покупки, при этом не тратя много времени и сил.
если кому интересно - прошу под кат, остальные проходим мимо.

Коммент для минусов прилагается.

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

Какое-то время назад появилась необходимость вести домашнюю бухгалтерию и собирать статистику по тому какие продукты покупаются, как часто, за сколько, где и т.п., с целью оптимизации расходов и планирования домашнего бюджета.
Но после нескольких неудачных попыток реализации проекта средствами Excel, Access и т.п., пришел к пониманию нескольких ключевых моментов:
1) Решение должно быть на мобильной платформе (т.е. никакого ПК)
2) Действия должны быть максимально простыми и удобными (т.е. чтобы все можно было делать на ходу в пару кликов)
3) Действия не должны занимать много времени

Подробно рассмотрев все вышеперечисленные пункты, я остановил свой выбор на реализации проекта на платформе Andrioid, но к сожалению изучив весь Play Market осознал что готовых решений на данную тему там или нет, или есть, но чем-то они меня не устраивают. В основном в большинстве случаев это было - не гибкость, т.е. невозможность изменять некоторые пункты под свои конкретные нужды.
Вариант написать свою программу под дройда, к сожалению, тоже был забракован, т.к. я не имею опыта разработки для дройда, а свободного времени очень мало.
Но, в итоге, решение было таки найдено!

Шаг[0] - Получение данных из чека
С переходом России на систему онлайн касс и электронных чеков появилась отличная возможность не переписывать данные из чека, а копировать все с сайта ФНС. Для этих целей было скачено приложение, при помощи которого можно легко отсканировать QR код на чеке и получить электронную версию чека. Выглядит это примерно так:

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

Далее, нажав "Выделить всё" и "Копировать" мы получаем все что нужно.

Шаг[1] - Преобразование и структурирование данных
Получение данных из чека, как оказалось, самая простая и незатейливая часть всего процесса. Дальше идёт танцы с бубнами.
После довольно продолжительных поисков в Play Market было найдено приложение - простая СУБД для дройда, с возможностью создания форм для заполнения и сохранения данных в виде таблиц, которые в последствии можно экспортировать в Google Drive в виде excel таблицы, и в котором есть возможность создавать довольно сложные скрипты и триггеры по средством JavaScript.
Для полноценной работы и удобства пришлось создать в этом приложении 3 библиотеки:
1) Чеки - для данных из чеков.

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

В форме для заполнения всего три поля:
"Магазин" - Текстовое поле, где нужно выбрать один из существующих пунктов, или создать новый нажав "+"
"Координаты" - соответственно координаты магазина. Это нужно для большей точности, так как иногда в разных магазинах одной сети ассортимент немного различается.
"Чек" - поле куда нужно вставить данные скопированные из приложения проверки чеков ФНС.
После сохранения формы все выглядит таким образом:

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

После сохранения добавляются поля:
"Адрес" - Подтягивается автоматически по координатам
"ИНН" - Подтягивается скриптом из чека
"ФН" - Подтягивается скриптом из чека
"ФД" - Подтягивается скриптом из чека
"ФПД" - Подтягивается скриптом из чека
"ККТ" - Подтягивается скриптом из чека
"Итого" - Подтягивается скриптом из чека
"Товары" - Подтягивается скриптом из чека

Так же после сохранения срабатывает триггер, который импортирует данные из чека в две другие библиотеки:
"Товары" - справочник товаров
"Покупки" - таблица с покупками

Вот так выглядит экран редактора скриптов:

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

После импорта данных в библиотеке "Покупки" всё выглядит примерно таким образом:

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

Каждую запись можно открыть и тогда будет возможность просмотра данных по покупке более подробно:

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё
Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

Все данные товара, если товар есть в справочнике подтягиваются скриптом в момент импорта. Если товар новый то придется заполнять самим. Но так как товары покупаются примерно одни и те же, то со временем необходимость заносить руками данные отпадёт.
Экран редактирования записи, кстати, выглядит подобным образом:

Домашняя бухгалтерия, или Javascript от не программиста | Часть [0] Javascript, Программирование, Android, Субд, Excel, Длиннопост, Бухгалтерия, Моё

В случае корректировки каких-либо данных по товару в карточке покупки, данные в справочнике тоже обновляются скриптом.

В последствии, все данные из трёх библиотек - "Чеки", "Покупки" и "Товары" можно легко синхронизировать с Google Drive, где они будут доступны для просмотра и редактирования в виде Excel таблиц.
Для примера, таблица синхронизирована с библиотекой "Товары":
https://docs.google.com/spreadsheets/d/1jghXNRnxEgMop6qzA0pE...

В итоге, получилась довольно не плохая система сбора и хранения данных по покупкам, с помощью которой можно вести домашнюю бухгалтерию, и планировать расходы на перед.

Если пост кому-то будет интересен и не утонет в минусах, то в следующий раз расскажу обо всём подробнее...

Показать полностью 8
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: