понедельник, 5 марта 2018 г.

Написание VBA макросов в LibreOffice

Внимание! Написание макроса выполнялось в LibreOffice 4.4.3.2 и Windows XP.

Запустите LibreOffice Calc. Выберите пункт меню Сервис -> Макросы -> Управление макросами -> LibreOffice Basic

В окне Макросы Libre Office BASIC в поле "Имя макроса" пишем "Main". В поле "Макрос из" выбираем "Мои макросы" - "Standard" и нажимаем кнопку "Создать". Смотрите рисунок 1.

Рисунок 1. Окно макросы LibreOffice Basic

В окне Новый модуль задаем название "Module1" и нажимаем кнопку "OK". Смотрите рисунок 2.

Рисунок 2. Создание нового модуля

Далее в окне редактора макрасов LibreOffice Basic приступаем к созданию диалога и написанию макроса. Смотрите рисунок 3.

Рисунок 3. Редактор макросов LibreOffice Basic

Сам модуль Module1 с главной процедурой Main у нас созданы. Чтобы создать диалог выберите в редакторе макросов LibreOffice Basic пункт меню Сервис -> Макросы -> Управление диалогами...

Выбираем вкладку "Диалоги". В разделе "Диалог" выбираем "Мои диалоги" -> "Standard" и нажимаем кнопку "Создать". Смотрите рисунок 4.

Рисунок 4. Создание диалога макроса

В окне Новый диалог задаем название "Dialog1" и нажимаем кнопку "OK". Смотрите рисунок 5. Потом кнопку "Закрыть" окна Управление макросами LibreOffice Basic.

Рисунок 5. Создание нового диалога

Далее в окне редактора макросов LibreOffice Basic дважды нажимаем на нашем только что созданом диалоге с именем "Dialog1", смотрите цифру 1 на рисунке 6. После этого откроется визуальный редактор диалога, смотрите цифру 2 на рисунке 6.

Рисунок 6. Редактор диалога LibreOffice Basic

Теперь перенесите на наш диалог визуальный элемент под именем метка и визуалный элемент кнопка. Визуальные элементы можно перетащить из панели визуальных элементов, смотрите цифру 3 на рисунке 6.

Если выделить визуальный элемент Метку, то откроется набор свойств данного элемента. Через эти свойства можно настроить элемент. Присвоим имя lblNow элементу метка и текст оставим пустым. Для элемента кнопка имя присвоем OKButton и текст зададим OK. Смотрите цифры 1,2,3 рисунка 7.

Рисунок 7. Добавление визуальных элементов в редакторе диалогов LibreOffice Basic

Как я писал выше, модуль Module1 с главной процедурой Main создана (смотрите рисунок 8), но она еще не заполнена.

Рисунок 8. Добавляем исходный код макроса

Процедура Main является основной, в ней мы загружаем диалоговое окно с именем Dialog1, это следующие строчки кода:

DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)

Формируем строку с текущей датой и временем, это следующие строчки кода:

Dim strNow As String

strNow = Format(Now(), "yyyy-mm-dd ")
strNow = strNow + Format(Time(), "hh:mm")

Присваеваем строку с датой и временем визуальному элементу метка с именем lblNow, это следующие строчки кода:

Dim clblNow As Object

clblNow = Dlg.getControl("lblNow")
clblNow.Text = strNow

Последней строчкой кода в процедуре Main мы выполняем диалоговое окно с именем Dialog1:

Dlg.Execute()

Есть еще одна процедура, ее имя OKButton_execute, это событийная процедура, она выполняется в момент нажатия кнопки с именем OKButton, и выполняет она закрытие диалогового окна с именем Dialog1, это следующая строчка кода:

Dlg.endExecute()

Теперь присвойте процедуру с именем OKButton_execute кнопке с именем OKButton как событие на "Отпускание клавишы мыши". Для этого откройте визкальный редактор диалога Dialog1, смотрите цифру 1 на рисунке 9. Выделите Кнопку с именем OKButton и перейдите на вкладку "События", смотрите цифру 2 на рисунке 9. В событие "Отпускание клавиши мыши" укажите процедуру с именем OKButton_execute, нажав конопку с тремя точками, смотрите цифру 3 на рисунке 9. 

Рисунок 9. Назначение события кнопке ОК

Все необходимое для запуска макроса мы сделали. Для начала посмотрим что у нас делает макрос. Под цифрой 2 рисунка 10 вы видите созданное диалоговое окно с отображаемой текущей датой и временем. Если нажать кнопку OK, то диалоговое окно закроется.

Рисунок 10. Окно нашего макроса

Далее рассмотрим все варианты запуска нашего макроса по порядку. 

1. Запуск макроса из редактора макросов LibreOffice Basic.Откройте в редакторе макросов LibreOffice Basic наш код и выполнтите его нажав клавишу F5 или нажав на кнопку выполнения макроса, смотрите цифру 1 рисунка 10.

2. Запуск макроса из диалогового окна "Выбор макроса", смотрите цифру 1 на рисунке 11. В диалоговом окне нам нужно выбрать наш макрос и нажать кнопку "Выполнить", смотрите цифру 2 на рисунке 11. 

Рисунок 11. Запуск макроса из диалога "Выбор макроса"


3. Запуск макроса из меню и подменю в приложениях LibreOffice Calc или LibreOffice Writer, смотрите цифру 0 рисунка 12. Для создания меню и подменю выберите пункт меню "Сервис" и подменю "Настройка", смотрите цифры 1 и 2 рисунка 12. В диалоговом окне "Настройка" на вкладке "Меню" нажмите кнопку "Создать...", введите имя нашего меню (например "Макросы"), смотрите цифру 3 рисунка 12. Чтобы создать подменю нашего меню "Макросы" нажмите кнопку "Добавить..." (смотрите цифру 4 рисунка 12.). 

Рисунок 12. Запуск макроса из меню и подменю в приложениях LibreOffice Calc или LibreOffice Writer

Потом в диалоговом окне "Добавить команды" выберите команду которая будет выполнятся при выборе нашего подменю (смотрите цифры 1 и 2 рисунка 13), т.е. мы выбираем наш макроc с именем Main. 

Рисунок 13. Добавляем команду для подменю

Переименуйте наше подменю выбрав пункт меню "Переименовать..." кнопки "Изменить"  диалогового окна "Настройка" вкладки "Меню" (смотрите цифры 1,2,3,4 рисунка 14). Подменю назовите "Макрос окно с датой".

Рисунок 14. Переименование подменю

4. Запуск макроса в приложениях LibreOffice Calc или LibreOffice Writer по нажатию сочетания клавиш на клавиатуре. Для это откройте диалог "Настройка" и выбирите вкладку "Клавиатура" (смотрите цифру 1 рисунка 15). Потом выбираем команду, которая является нашим макросом с именем "Main" (смотрите цифру 2 рисунка 15). Потом выбираем свободную комбинацию клавиш и назначаем их нашей команде, т.е. макросу с именем Main (смотрите цифры 3,4,5 рисунка 15).

Рисунок 15. Назначение комбинации клавиш для запуска макроса

5. Запуск макроса в приложениях LibreOffice Calc или LibreOffice Writer по нажатию кнопки на панели инструментов (смотрите цифру 4 рисунка 16). Для создания кнопки на панели инструментов выберите пункт меню "Сервис" и подменю "Настройка", смотрите цифру 1 рисунка 16. В диалоговом окне "Настройка" на вкладке "Панели инструментов" нажмите кнопку "Создать...", введите имя нашей панели инструментов (например "Панель макросов"), смотрите цифру 2 рисунка 16. Чтобы создать кнопку на панели инструментов нажмите кнопку "Добавить..." (смотрите цифру 3 рисунка 16). 

Рисунок 16. Запуск макроса из панели инструментов

Потом в диалоговом окне "Добавить команды" выберите команду которая будет выполнятся при нажатие по нашей кнопке нашей панели инструментов  (смотрите цифры 1 и 2 рисунка 13), т.е. мы выбираем наш макроc с именем Main. 

 Переименуйте нашу кнопку нашей панели инструментов выбрав пункт меню "Переименовать..." кнопки "Изменить"  диалогового окна "Настройка" вкладки "Панели инструментов" (смотрите цифры 1,2,3,4 рисунка 17). Кнопку назовите "Макрос окно с датой".

Рисунок 17. Переименование кнопки панели инструментов

6. Запуск макроса в приложениях LibreOffice Calc или LibreOffice Writer в ответ на какое-то событие, например события запуска приложения. Таким образам наш макрос выполняется когда запускается приложение LibreOffice Calc или LibreOffice Writer. Для создания события выберите пункт меню "Сервис" и подменю "Настройка", смотрите цифру 1 рисунка 18.  В диалоговом окне "Настройка" на вкладке "События" выберите событие "Запуск приложения" и нажмите кнопку "Макрос...", смотрите цифру 2 рисунка 18.

Рисунок 18. Назначение события для запуска макроса

Далее выберите макрос Main в окне "Выбор макроса" (смотрите цифры 1,2,3 рисунка 19). 

Рисуной 19. Диалог выбора макроса

Перезапустите приложение LibreOffice Calc или LibreOffice Writer и вы увидете что наш макрос запускается.

Ниже размещен полный код макроса.

REM  *****  BASIC  *****

Dim Dlg As Object

Sub OKButton_execute 
Dlg.endExecute()
End Sub


Sub Main

DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dim strNow As String
strNow = Format(Now(), "yyyy-mm-dd ")
strNow = strNow + Format(Time(), "hh:mm")
Dim clblNow As Object
clblNow = Dlg.getControl("lblNow")
clblNow.Text = strNow
Dlg.Execute()

End Sub

7 комментариев:

  1. Спасибо огромное! Статья по делу! Сейчас адаптирую форму Excel с макросами VBA и формами под Calc (не программист). Учитывая малое количество материала в сети на эту тему, быстро вправил себе мозги :)

    ОтветитьУдалить
  2. В дополнение: То что в Libre есть готовые элементы управления для даты, числа и прочая - прям порадовало.

    ОтветитьУдалить
  3. Эх... а какбы прочитать именя файлов в нужной директории и вывести их в ячейки таблицы по определенной маске? :(

    ОтветитьУдалить
    Ответы
    1. Написал еще одну статью по работе с VBA в LibreOffice. Пример макроса выводит список файлов определенной директории по маске. https://notidealrunner.blogspot.com/2020/07/vbalibreoffice.html

      Удалить
  4. Lib Off ровно никак не продуман на тему перехода на него с MS Off, авторы рассчитывали на примитивное использование их пакета в ручном режиме.
    Это делает невозможным какое-либо серьёзное применение Lib Off на практике.
    Никто, кроме единиц больных на голову фанатов, не станет переносить более-менее серьёзный функционал на эту ясельную платформу.
    Авторам необходимо (было! - много ранее нужно было!) думать головой чаще, чем двигать руками.

    ОтветитьУдалить
  5. Кстати, автор "думал головой", насколько это было возможно в 16 лет и в середине 80-х годов, создавая эту "ясельную платформу", когда про microsoft office еще никто не слышал.

    ОтветитьУдалить
    Ответы
    1. Никогда не интересовался историей программного обеспечения и Libre Office, в частности. Но, поискать эту информацию не поленился. Ссылка на википедию кому интересно: https://ru.wikipedia.org/wiki/Star_Division

      Удалить