/ Статья

Перламутровые пуговицы офисных редакторов

10 мин
6 июля 2021
Автор: Виктория Яснецкая
«А у вас нет такого же, но с перламутровыми пуговицами?» – Спросил Семён Семёнович Горбунков в фильме «Бриллиантовая рука».
«К сожалению, нет», – ответили ему.

«Можно сделать!» – Ответим мы и напишем макрос, который будет делать именно то и именно так, как вам хочется.

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

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

В МойОфис для написания макросов используется Lua. Есть редакторы, которые поддерживают макросы на JavaScript, однако этот язык чаще применяется в браузерах для интерактивности веб-страниц, а также VBA.

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

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

Мы предлагаем начать с простого примера. Такого, как вывод на экран сообщения.

VBA:
MsgBox ("Привет!");

Lua:
EditorAPI.messageBox ("Привет!")

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

Пример цикла FOR, благодаря которому перебираются все листы файла в табличном редакторе:

VBA:
For i = 1 To ActiveWorkbook.Worksheets.Count
ActiveSheet.Cells(i, 1).Value = ActiveWorkbook.Worksheets(i).Name
Next i


Lua:
for i in tb:enumerateTables() do
table.insert(name_sheet, i:getName())
ind = ind+1
end


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

Рассмотрим пример создания оглавления в табличном редакторе более подробно.

В файле с множеством листов удобно иметь список их названий на отдельном листе – аналог оглавления в текстовом редакторе.
Делать это вручную долго и неинтересно. К тому же названия листов и их количество могут измениться. Лучше автоматизировать этот процесс – создать макрос.

Создадим макрос в файле «МойОфис Таблица», который содержит листы: «январь», «февраль» и «март».

В редакторах МойОфис для создания и редактирования макросов в меню Инструменты есть команда Редактирование макроса.

Редактирование макроса

Не бойтесь совершить ошибку при написании кода! Для их быстрого обнаружения есть отладчик.

Нажмём кнопку Отладить в окне редактора кода:

Отладка макроса

Ошибка в третьей строке. После её исправления (просто удалим лишний символ, он попал сюда случайно) можно вновь запустить отладку.

Отладка макроса

Ошибок нет. Можно закрыть окно редактора кода. Мы создали макрос! Но он пока ещё ничего не сделал.

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

Выполнение макроса

В файле на листе «Список листов» будет результат работы макроса:

Результат работы макроса

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

Список макросов

Готовый код Lua можно оформить в виде надстройки – файла пакетного формата *.mox. Такой файл подключается в редакторы МойОфис и используется как любая другая команда меню.

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

 Для использования макроса в другом файле необходимо:
  1. открыть файл с макросом,
  2. скопировать код макроса из редактора кода,
  3. открыть другой файл,
  4. создать макрос и вставить в него скопированный код.
Не самое удобное решение при множестве файлов.
Для подключения надстройки необходимо:
  1. в меню Надстройки выбрать команду Управление надстройками...;
  2. нажать кнопку Установить;
  3. выбрать файл надстройки (файл формата *.mox) и нажать кнопку Открыть;
  4. в окне лицензионного соглашения нажать Принять;
  5. закрыть окно Управление надстройками.
Управление надстройками

Теперь в меню Надстройки будет видна установленная надстройка.

Можно воспользоваться готовыми надстройками, разработанными специалистами МойОфис.
Внимание! Надстройками можно пользоваться в коммерческих версиях МойОфис и в специальном продукте для школ «МойОфис Образование».

Так что, Семён Семёнович, будем не искать, а создавать!

P.S. Руководство программиста доступно по ссылке: https://support.myoffice.ru/products/myoffice-sdk/ 

P.P.S. При написании кода важно помнить о производительности и читаемости, чтобы через полгода вы сами смогли понять, что же здесь написано.

P.P.P.S. Для желающих улучшить наш макрос предоставляем код:

function main(n) -- начало описания функции MAIN
-- описание локальных переменных, действующих внутри функции
local tb = document:getBlocks()
local ind = 0
local name_sheet = {}
-- перебираем имеющиеся листы файла и создаём таблицу их названий
for i in tb:enumerateTables() do
table.insert(name_sheet, i:getName())
ind = ind+1
end
-- создаем новый лист, в который будет выведена таблица названий листов
local tbl = document:getRange():getEnd():insertTable(ind,1," ")
tb:getTable(tbl):setName("Список листов")
local sheet = tb:getTable(tbl)
-- задаём начальную ячейку вывода и выводим таблицу названий листов
for i=0,ind-1 do
sheet:getCell(DocumentAPI.CellPosition(i,0)):setText(name_sheet[i+1])
end
end
-- конец описания функции MAIN
main() -- вызов функции main на выполнение

Дополнительно о макросах в МойОфис читайте на Habr.com.