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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Не смотря на очевидные успехи импортозамещения в сфере программного обеспечения, есть ряд трудностей «переходного периода», которые существенно усложняют жизнь миллионам пользователей на необъятных просторах нашей страны. Одна из таких «головных болей» – макросы. При переходе на российские офисные пакеты, требуется переписать множество 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/


Интересные статьи

Интересные статьи

Относительно недавно, в ноябре 2021 года, протяженность подводных интернет-магистралей превысила 1 млн километров. Несмотря на различные проблемы в экономике, проекты в этой отрасли продолжают разви...
Привет, Хабр! Сегодня расскажу о применение мощного и удобного инструмента для анализа и мониторинга HTTP(S) трафика Fiddler. По сути, Fiddler – это прокси для отладки приложений и сайтов. Разработчик...
TypeScript, во многих отношениях, больше похож не на язык программирования, а на мощный инструмент для линтинга и документирования кода, который помогает писать более качественные JavaScript-прог...
При просмотре профилей пользователей соцсетей, невольно задаешься вопросом, а сколько информации лежит в открытых источниках? Понятно, что много. Но как это посчитать? И у кого еще, кроме спецслу...
Автор материала, перевод которого мы сегодня публикуем, говорит, что C++, в его современном виде, если сравнивать его с тем, чем был этот язык несколько лет назад, значительно изменился в лучшую ...