Макросы в «МойОфис»: Расширяя возможности

от автора

Не смотря на очевидные успехи импортозамещения в сфере программного обеспечения, есть ряд трудностей «переходного периода», которые существенно усложняют жизнь миллионам пользователей на необъятных просторах нашей страны. Одна из таких «головных болей» – макросы. При переходе на российские офисные пакеты, требуется переписать множество VBA-макросов для MS Office. При этом, макросам на VBA посвящено множество книг и интернет-ресурсов. А вот про макросы в отечественных «офисах» информацию, пока, приходится собирать по крупицам.

В этой статье предлагается пример разработки макроса в табличном редакторе «МойОфис Таблица». Разработчики «МойОфис» не только заложили возможности расширения базовой функциональности своего «офиса» с помощью макросов, но и снабдили пользователей толковым «Справочником макрокоманд на языке программирования Lua».

Попробуем решить тривиальную задачу сравнения двух таблиц. В «экселевском» файле Verify.xlsx 3 листа – Contract, Act, Result. В таблице Contract содержатся данные о договорных объемах работ, в Act – о фактически выполненных.

Таблица Result – пустой лист. Требуется в Result сопоставить договорные и фактические объемы работ и визуализировать расхождения. Если объём выполненных работ превышает договорной – ячейки таблицы зальём зелёным, если выполнение меньше договора – ячейки красные. Если показатели совпадают – нет заливки.
Для написания нашего макроса понадобится «МойОфис Стандартный. Домашняя версия», эта статья, Справочник макрокоманд на языке программирования Lua, Учебное пособие Работа с табличным редактором «МойОфис Таблица» и базовые знания языка программирования Lua.

Сначала нам необходимо получить доступ к данным на листах Contract, Act. Для этого в «МойОфис» предусмотрен объект DocumentAPI.Document. Вообще-то, в
терминах языка программирования Lua это таблица. Но что бы не путаться с терминами, назовём это объектом. Создадим три экземпляра этого объекта и поместим их в локальные переменные:

Запустив этот макрос, можно убедиться в его работоспособности.
В программировании, для работы с массивами данных используют циклический перебор элементов массива. Наша задача – не исключение. Чтобы организовать перебор ячеек в каком-либо диапазоне, нужна такая система адресации ячеек, при которой на каждой итерации (повторении) адрес ячейки меняется на следующий в данном диапазоне. Разработчики «МойОфис» создали объект DocumentAPI.CellPosition, в котором адрес определяется парой целых чисел – индекс строки и индекс столбца. Если перебирать диапазон по строкам, то в адресе нужно изменять только индекс строки. Индекс первой строки – ноль. Создадим локальную переменную переменную currentRow (строка 4). И, наконец, положим в переменную диапазон который будет обработан (строка 5). Это первый столбец первого листа – все доступные строки.

Получить элементы диапазона firstRange можно используя метод enumerate(). В начале напишем простой цикл for:

Нормальная работа макроса – 20 строк «Ok!» в терминале. Именно столько элементов в массиве firstRange. Теперь добавим условие обработки элемента – только если ячейка не пустая:

В 8 строке использован cell:getFormattedValue() – метод, возвращающий содержимое текущей ячейки cell. Это содержимое сравнивается с пустой строкой, и если сравнение возвращает True, цикл прерывается командой break. Если всё так, то при выполнении этого скрипта в терминале уже не 20 а только 8 строк «Ok!» – именно столько заполненных ячеек в этом диапазоне, остальные пусты.
Теперь добавим в тело цикла несколько переменных: props – содержит метод настройки оформления ячейки (строка 11); work – доступ к ячейкам первого столбца листа Result (строка 12); unit – единицы измерения объема работ из второй колонки листа Contract (строка13); vol_contract – объем работ из третьей колонки листа Contract (строка 14); vol_fact – фактический объем работ из третьей колонки листа Act (строка 15). При этом, для перебора всех массивов кроме firstRange, необходимо на каждой итерации увеличивать индекс строки на единицу (строка 19):

Запустив макрос в таком виде, получим в терминале 8 строк с единицами измерения и числами.
Добавим в наш код еще одно логическое выражение – назначение цвета фона ячейки в соответствии с условиями: красная заливка, зелёная заливка или без заливки. В переменной props хранится таблица свойств текущей ячейки. Нас интересует свойство props.backgroundColor:

Наконец, расставим все значения по их местам на листе Result. Нулевая колонка («A») заполняется данными из текущей ячейки – строка 25. Следующая – колонка с индексом 1 («B»), заполняется содержимым переменной unit (строка 26). Далее, в колонки 2 («C») и 3 («D») записываются данные из переменных vol_contract и vol_fact, соответственно (строки 27 и 28). Ячейки последней колонки заливаются соответствующим цветом (строка 29).

В результате получим такую таблицу:

В данном макросе не понадобилось производить математических вычислений, поэтому, всё отработало корректно. Однако, если «распечатать» тип данных из ячеек, то обнаружится, что это не числа, а строки. И использование арифметики Lua, тем более модуля math не получится. Стандартная для Lua «tonumber()» возвращает nil. Для вычислений в макросе нужно написать дополнительную функцию преобразования строкового значения в число.

Эта статья не о работе с таблицами «МойОфис», а о возможностях макрокоманд. Конечно, отвыкать от привычного Excel с его колоссальным функционалом – дело весьма не комфортное, но опыт написания данного макроса в «МойОфис» свидетельствует о широких возможностях автоматизации обработки табличных данных и без Microsoft.
Надеюсь эта статья окажется актуальной. Если так, то тему можно будет продолжить.


ссылка на оригинал статьи https://habr.com/ru/articles/729860/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *