Введение¶
Чаще всего, макрос это сохранённая последовательность команд или нажатий клавиш, предназначенная для последующего использования. Например, можно сохранить и «впечатывать» свой адрес. Язык программирования LibreOffice очень гибок и позволяет автоматизировать как простые, так и сложные задачи. Макросы часто используются, когда мы хотим повторять ещё и ещё раз определённую последовательность действий в схожих условиях.
Макросы в LibreOffice обычно записываются на языке, называемом LibreOffice Basic или просто Basic. Конечно можно долго изучить Basic и наконец начать программировать, но это руководство поможет вам сразу решать простые задачи. Начинающие пользователи часто с успехом применяют макросы, написанные кем-либо другим. Также, можно использовать функцию записи макросов, чтобы сохранить последовательность нажатий клавиш и использовать её ещё раз.
Большинство действий в LibreOffice выполняются путём отправки команды (посылки команды, dispatching a command), которая
перехватывается и выполняется. Функция записи макросов позволяет записать непосредственные команды,
которые обрабатываются (смотрите Платформа диспетчера).
Ваш первый макрос¶
Добавление макроса¶
Первый шаг в изучении программирования макросов, это найти и использовать существующие макросы. В этом разделе подразумевается, что у вас уже имеется макрос, который вы хотите использовать. Вы могли найти его в Интернете или в какой-нибудь книге. Рассмотрим пример 1. Чтобы записать этот макрос, вы должны предварительно создать библиотеку и модуль, и уже в модуле написать текст макроса, смотрите Организация макросов.
Пример 1: Простой макрос, который пишет “Hello, World”:
Sub HelloMacro Print "Hello, World" End Sub
Чтобы создать библиотеку, необходимо выполнить следующие шаги:
- Выберете пункты главного меню , чтобы открыть диалог работы с макросами Libreoffice Basic.
Диалог работы с макросами LibreOffice Basic
- Нажмите Управление, чтобы открыть диалог организатора макросов и выберите вкладку Библиотеки.
- Выберите в выпадающем списке Приложение/Документ пункт Мои макросы и диалоги.
Диалог организатора макросов LibreOffice Basic
- Нажмите Создать, чтобы открыть диалог создания новой библиотеки.
- Введите имя библиотеки, например, TestLibrary и нажмите OK.
- Выберите вкладку Модули.
- В списке модулей раскройте Мои макросы и выберите TestLibrary. Модуль с именем Module1 уже существует, он может содержать ваши макросы. Если необходимо, том можно нажать Создать, чтобы создать другой модуль в библиотеке.
- Выберите Module1 или новый модуль, который вы создали и нажмите Правка, чтобы открыть интегрированную среду разработки (IDE). Интегрированная среда разработки это текстовый редактор, включённый в LibreOffice, который позволяет создавать и редактировать макросы.
Интегрированная среда разработки макросов
- После создания нового модуля он содержит комментарий и пустой макрос, названный Main, который ничего не делает.
- Добавьте новый макрос или до
Sub Main
или послеEnd Sub
. В примере ниже приведен новый макрос, который был добавлен доSub Main
.
Пример 2: Module1
после добавления нового макроса:
REM ***** BASIC ***** Sub HelloMacro Print "Привет" End Sub Sub Main End Sub
- Нажмите на значок Компилировать на панели инструментов, чтобы откомпилировать макрос.
- Поставьте курсор в процедуру
HelloMacro
и нажмите на значок Выполнить BASIC на панели инструментов или нажмите клавишуF5
, чтобы выполнитьHelloMacro
в модуле. Откроется маленький диалог со словомПривет
. Если курсор не находится внутри процедурыSub
или функцииFunction
, откроется диалог выбора макроса для запуска.
- Нажмите OK, чтобы закрыть диалог.
- Чтобы выбрать и выполнить любой макрос в данном модуле, нажмите значок Выбрать макрос на стандартной панели инструментов или выберите .
- Выберите макрос и нажмите Выполнить.
Запись макросов¶
Если вы хотите многократно ввести одинаковую информацию, вы можете скопировать эту информацию после того, как она введена в первый раз, затем вставлять эту информацию в ваш документ каждый раз по мере необходимости. Однако, если вы скопировали в буфер обмена что-то ещё, содержимое буфера меняется. Это означает, что вы должны заново скопировать вашу повторяющуюся информацию. Чтобы обойти эту проблему, вы можете создать макрос, который в процессе выполнения вводит нужную вам информацию.
Примечание
Для некоторых типов многократно вводимой в документах информации более удобно создать файл автотекста. Описание работы с автотекстом смотрите в справочной системе и в главе Глава 3 – Использование Стилей и Шаблонов данного руководства.
- Убедитесь, что функция записи макросов активизирована, выбрав . Установите флажок Включить запись макросов. По умолчанию эта функция отключена, когда LibreOffice впервые установлен на ваш компьютер.
- Выберите из главного меню, чтобы запустить запись макроса. Появится маленький диалог, подтверждающий, что LibreOffice записывает ваши действия.
Диалог записи макроса
- Наберите желаемую информацию или выполните необходимые действия. Например, напечатайте ваше имя.
- Нажмите Завершить запись в маленьком диалоге, чтобы остановить запись, и появится диалог работы с макросами LibreOffice.
- Откройте библиотечный контейнер Мои макросы.
- Найдите библиотеку с именем
Standard
в Моих макросах. Обратите внимание, что каждый библиотечный контейнер содержит библиотекуStandard
. - Выберите библиотеку
Standard
и нажмите Создать модуль, чтобы создать новый модуль, содержащий макросы. Откроется диалог создания модуля.
Диалог создания модуля
- Задайте название для нового модуля, например, Recorded и нажмите OK, чтобы создать модуль. В диалоге работы с макросами теперь виден этот новый модуль в составе библиотеки
Standard
. - В поле Имя макроса напечатайте имя для макроса, который вы только что записали, например,
EnterMyName
. - Нажмите Записать, чтобы сохранить макрос и закрыть диалог работы с макросами.
- Если вы верно выполнили все шаги, описанные выше, библиотека
Standard
теперь содержит модульRecorded
, и этот модуль содержит макросEnterMyName
.
Примечание
Когда LibreOffice создаёт новый модуль, в этот модуль автоматически добавляется процедура с именем Main
.
Запуск макроса¶
- Выберите , чтобы открыть диалог выбора макроса.
- Например, выберите ваш только что созданный макрос
EnterMyName
и нажмите Выполнить. - Можно также вызвать из главного меню , чтобы открыть диалог работы с макросами, выбрать ваш макрос и нажать Выполнить.
Диалог выбора макроса
Просмотр и редактирование макросов¶
Чтобы просмотреть или отредактировать созданные вами макросы выполните:
- , чтобы открыть диалог работы с макросами.
- Выберите ваш новый макрос
EnterMyName
и нажмите Правка, чтобы открыть макрос в интегрированной среде разработки.
Макрос EnterMyName не так уж сложен, как может показаться. Изучение нескольких вещей существенно поможет в понимании макросов. Начнём сначала и посмотрим на самую первую строку примера.
Макрос EnterMyName
не так уж сложен, как может показаться. Изучение нескольких вещей существенно поможет в понимании макросов. Начнём сначала и посмотрим на самую первую строку примера.
Пример 3: Сгенерированный макрос EnterMyname
:
REM ***** BASIC ***** Sub Main End Sub sub EnterMyName rem ------------------------------------------------------------- rem define variables (определение переменных) dim document as object dim dispatcher as object rem ------------------------------------------------------------- rem get access to the document (получение доступа к документу) document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") rem ------------------------------------------------------------- dim args1(0) as new com.sun.star.beans.PropertyValue args1(0).Name = "Text" args1(0).Value = "Иван Сидорович Петров" dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1()) end sub
Комментарии¶
Подробные комментарии являются необходимой частью программы. Без комментариев и сам программист зачастую забывает, что же он написал несколько недель (а может и месяцев или лет) тому назад.
Все комментарии в макросах начинаются с ключевого слова REM
. Весь текст строки после REM игнорируется компьютером при выполнении макроса. Можно также использовать символ одинарной кавычки ('
), чтобы начать комментарий.
Ключевые слова в LibreOffice Basic могут быть записаны в любом регистре, таким образом REM
, Rem
, и rem
могут начинать комментарий. Если вы используете символические константы, определяемые в программном интерфейсе приложения (Application Programming Interface, API), безопаснее считать, что имена чувствительны к регистру. Символические константы не описаны в данном руководстве, они не нужны, когда вы используете функцию записи макросов в LibreOffice.
Определение процедур¶
Отдельные макросы сохраняются в процедурах, которые начинаются с ключевого слова SUB
. Окончание процедуры обозначается END SUB
. Код модуля в примере 3 начинается с определения процедуры, названной Main, в которой нет ничего, и она ничего не делает. Следующая процедура, EnterMyName
, содержит сгенерированный код вашего макроса.
Примечание
Когда LibreOffice создаёт новый модуль, в этот модуль всегда автоматически добавляется процедура с именем Main
.
Существует много полезной информации, не вошедшей в данное руководство, однако знание о ней весьма интересно:
- Вы можете написать процедуры, которые используют некоторые “входные” величины, называемые аргументами. Однако, функция записи макросов не предоставляет возможности использовать аргументы в процедурах.
- Помимо процедур существуют также функции, которые могут “возвращать” значение. Функции определяются ключевым словом
FUNCTION
в начале. Однако, записанные макросы, – это всегда процедуры, а не функции.
Определение переменных¶
Вы можете записать информацию на листе бумаги и позднее воспользоваться этой информацией. Переменные, подобно листу бумаги, содержат информацию, которую можно изменять или читать. Ключевое слово Dim
используется для описания типа переменной и для задания размерности массивов. Оператор dim
в макросе EnterMyName
используется подобно подготовке листа бумаги для записи информации.
В макросе EnterMyName
переменные document и dispatcher определены с типом object (объект). Другие часто используемые типы переменных включают string (строка), integer (целое) и date (дата). Третья переменная с именем args1 – это массив значений свойств. Массивы это переменные, содержащие несколько величин, подобно тому, как в одной книге содержится несколько страниц. Величины в массивах обычно нумеруются начиная с нуля. Число в скобках задаёт максимальный номер, используемый для доступа к элементу массива. В данном примере в массиве содержится только одна величина, и она имеет номер ноль.
Как это работает¶
Разберёмся более подробно с кодом макроса EnterMyName
. Может быть вы и не поймёте всех тонкостей, но разбор каждой строки в коде позволит вам осознать то, как работают макросы.
Определение начала макроса:
Определение переменной:
Определение переменной:
Объект ThisComponent ссылается на текущий документ.
document = ThisComponent.CurrentController.Frame
CurrentController
– свойство, ссылающиеся на службу, которая управляет документом. Например, когда вы печатаете на клавиатуре, – это текущий процесс, который управляет вводом в документ того, что вы напечатали. CurrentController
затем отправляет изменения в блок данных документа.
Frame
– свойство службы, которое возвращает основной блок данных документа. Таким образом, переменная с именем document ссылается на блок данных документа, который получает команды диспетчера.
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Большинство задач в LibreOffice выполняется посредством диспетчеризации (отправки) команды (dispatching a command). LibreOffice включает службу DispatchHelper
, которая чаще всего применяется при использовании диспетчера в макросах. Метод CreateUnoService получает имя службы и пытается создать экземпляр этой службы. По завершении метода, переменная dispatcher содержит ссылку на службу DispatchHelper
.
dim args1(0) as new com.sun.star.beans.PropertyValue
Определяет массив свойств. Каждое свойство имеет имя и значение. Другими словами, это пара имя/значение. Созданный массив содержит одно свойства, доступное по номеру ноль.
args1(0).Name = "Text" args1(0).Value = "Иван Сидорович Петров"
Задаём для свойства имя “Text” и значение “Иван Сидорович Петров”, это значение и есть тот самый текст, который будет вставлен, когда макрос сработает.
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
Вот тут и случается чудо. Служба DispatchHelper
посылает блоку данных документа (ссылка на который сохранена в переменной document) команду .uno:InsertText
. Описание следующих двух аргументов выходят за рамки данного руководства. Последний аргумент – это массив свойств, используемый для выполнения команды InsertText
.
Последняя строка кода, конец процедуры.
Создание макроса¶
Если вы задумали создать макрос, то перед началом записи очень важно ответить на два вопроса:
- Ваша задача может быть записана как простая последовательность команд?
- Могут быть отдельные шаги расположены так, чтобы последняя команда оставляла курсор готовым к следующей команде или вводу текста или данных в документ?
Более сложный пример макроса¶
Быстрый запуск макросов¶
Проблемы с функцией записи макросов¶
Платформа диспетчера¶
Как при записи макросов работает диспетчер¶
Другие средства¶
Организация макросов¶
Где сохраняются макросы?¶
Импорт макросов¶
Загрузка макросов для импорта¶
Как запускать макросы¶
Панели инструментов, пункты меню и быстрые клавиши¶
События¶
Расширения¶
Самостоятельное программирование¶
Где ещё найти информацию¶
Макросы, которые включены в LibreOffice¶
Интернет ресурсы¶
Печатные и электронные материалы¶
Я недавно перешел на pclinuxos из окон, и мне это нравится. Единственная проблема, с которой я столкнулся, заключается в том, что libreoffice, пакет электронных таблиц по умолчанию, несовместим с макросами Excel. Ниже приведен код vba, который у меня есть:
Option VBASupport
Sub DeleteToLeft()
Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft
End Sub
Function SinceLastWash()
Application.Volatile
WashCount = 0
WearCount = 0
CurrentRow = Application.ThisCell.Row
For i = 3 To 35
If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a" Then
WearCount = WearCount + 1
End If
If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "q" Then
WashCount = WashCount + 1
WearCount = 0
End If
Next i
SinceLastWash = WearCount
End Function
Function testhis()
testhis = Application.ThisCell.Row
End Function
Есть ли способ преобразовать этот код, чтобы сделать его совместимым с libreoffice, или мне нужно выучить совершенно новый язык, например python? Изучение python не будет проблемой, но не является решением моей проблемы, поскольку у меня есть много файлов, связанных с работой, в excel, которые содержат много кода vba, и я не могу использовать открытый офис / libreoffice на работе …
Я просто хочу добавить, что функция SinceLastWash выдает правильное значение в некоторых ячейках, где я ее использую, а в других выдает ошибку #NAME?
Благодарность
5 ответов
Лучший ответ
Вы должны перевести части, которые управляют документом, чтобы использовать UNO API. К сожалению, это может быть сложно в зависимости от того, что делает ваш макрос. Основные утверждения работают напрямую. Как правило, при изменении документа этого не происходит.
Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a"
Команда Cells возвращает определенную ячейку на основе строки и столбца. Итак, вам нужна текущая строка. Вот какое безумие получить активную ячейку:
Sub RetrieveTheActiveCell()
Dim oOldSelection 'The original selection of cell ranges
Dim oRanges 'A blank range created by the document
Dim oActiveCell 'The current active cell
Dim oConv 'The cell address conversion service
Dim oDoc
oDoc = ThisComponent
REM store the current selection
oOldSelection = oDoc.CurrentSelection
REM Create an empty SheetCellRanges service and then select it.
REM This leaves ONLY the active cell selected.
oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
oDoc.CurrentController.Select(oRanges)
REM Get the active cell!
oActiveCell = oDoc.CurrentSelection
oConv = oDoc.createInstance("com.sun.star.table.CellAddressConversion")
oConv.Address = oActiveCell.getCellAddress
Print oConv.UserInterfaceRepresentation
print oConv.PersistentRepresentation
REM Restore the old selection, but lose the previously active cell
oDoc.CurrentController.Select(oOldSelection)
End Sub
Когда у вас есть активная ячейка, вы получаете адрес ячейки, а из него — строку. Вам вообще не нужно использовать диапазон, поскольку вас интересует только одна ячейка, поэтому вы получаете активный лист, а затем получаете конкретную ячейку из листа.
Примерно так: ThisComponent.getCurrentController (). GetActiveSheet (). GetCellByPosition (nCol, nRow) .getString () = «a»
Я не хочу разбираться в том, что это делает
Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft
4
Andrew
29 Окт 2015 в 17:19
Единственный автоматический инструмент, о котором я знаю, — это бизнес-таблицы (обратите внимание, что у меня нет личных или профессиональный опыт, или какое-либо отношение к сайту).
Это похоже на OpenOffice, но я думаю, что он работает и с LibreOffice.
В общем, лучше сделать это самому, инструмент далек от совершенства …
1
djikay
13 Июл 2014 в 19:25
Из файла интерактивной справки LibreOffice:
За некоторыми исключениями, Microsoft Office и LibreOffice не могут запускать один и тот же код макроса. Microsoft Office использует код VBA (Visual Basic для приложений), а LibreOffice использует код Basic, основанный на среде LibreOffice API (интерфейс прикладных программ). Хотя язык программирования тот же, объекты и методы разные.
Самые последние версии LibreOffice могут запускать некоторые сценарии Excel Visual Basic, если вы включите эту функцию в LibreOffice — PreferencesTools — Параметры — Загрузить / Сохранить — Свойства VBA.
На самом деле вам, скорее всего, придется сесть за LibreOffice API. и перепишем функционал.
14
Community
20 Июн 2020 в 12:12
Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft
удаляет пустые ячейки, если я не ошибаюсь
0
T-Heron
12 Апр 2017 в 03:18
В LibreOffice 4.4 первая подпрограмма не будет работать вообще (я подозреваю, что все переменные начинаются с ‘xl’. Две другие работают отлично, если вы измените ThisCell на ActiveCell.
Скорее, чем
Option VBASupport
Я использую
Option VBASupport 1
Option Compatible
2
A. Harding
1 Окт 2015 в 22:33
Автор Keny, 17 мая 2022, 23:17
0 Пользователи и 1 гость просматривают эту тему.
Доброе время суток.
На работе неожиданно перешли с Excel на LO. Не все сотрудники готовы каждый раз при открытии файла «подвязывать» макросы к кнопкам. Большую часть макросов мне уже удалось адаптировать с помощью «просторов интернета» (я не специалист в области программирования), а один (пока один) мне не поддается.
Не могли бы вы помочь переписать этот макрос для LO версии 7.3.2.2 (x64)?
Option VBASupport 1
Sub Макрос2()
Sheets(«ИНФОЛИСТЫ»).Select
PalletsNumber = Sheets(«Данные»).Cells(4, 3).Value + 1
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=PalletsNumber, Copies:=1, Collate _
:=True
Sheets(«Данные»).Select
End Sub
Заранее спасибо.
Цитировать«Вы будете долго смеяться» (c)
но данный конкретный макрос работает без изменений и в LibreOffice.
«Родной» макрос может быть таким:
Sub TestPrint
Dim oDoc, oSheet
Dim props(1) As New com.sun.star.beans.PropertyValue
oDoc=ThisComponent
oSheet=oDoc.Sheets.GetByName("ИНФОЛИСТЫ")
oDoc.CurrentController.setActiveSheet oSheet
props(0).Name="Pages"
props(0).Value="1-" & (oDoc.Sheets.GetByName("Данные").getCellByPosition(2,3).Value + 1)
props(1).Name="Wait"
props(1).Value=True
oDoc.Print props
oDoc.CurrentController.setActiveSheet oDoc.Sheets.GetByName("Данные")
End Sub
Да, макрос Excel работает, но файл каким-то образом вечно «ломают» (пришлось снять пароль, стали сохранять непонятно как, хотя было сказано «НЕ СОХРАНЯТЬ»). Приходилось постоянно корректировать.
Надеюсь теперь проблем не будет.
Огромное спасибо.
Переназначила макросы, сохранила в родном формате — всё работает.
Доброе время суток.
Мне подкинули ещё одну задачку: при нажатии на копку «Печать документа» на листе «Ввод данных» должны распечататься определенные листы (к примеру лист3, лист5 и листы 8-9). В Excel у меня на этот случай был макрос:
Sub PrintReg
Sheets(Array(«Лист3», «Лист5», «Лист8», «Лист9»)).Select
Sheets(«Ввод данных»).Activate
ActiveWindow.SelectedSheets.PrintOut Copies:=4, Collate:=True
End Sub
При сохранение в формате .xlsm макрос «теряется».
Хотелось бы его переписать под «родной» формат. Попытки сделать это самой не увенчались успехом.
Заранее спасибо.
«Родной» аналог может быть таким:
Sub TestPrint2
Dim aPrn(2) as new com.sun.star.beans.PropertyValue
Dim aSel(0) as new com.sun.star.beans.PropertyValue
aSel(0).Name="Tables"
aSel(0).Value=Array(2, 3) ' индексы листов для печати (нумерация от 0)
With createUnoService("com.sun.star.frame.DispatchHelper")
.executeDispatch(ThisComponent.CurrentController.Frame, ".uno:SelectTables", "", 0, aSel)
End With
aPrn(0).Name = "Wait" ' ожидать пока напечатается
aPrn(0).Value = True
aPrn(1).Name = "CopyCount" ' количество экземпляров
aPrn(1).Value = 2
aPrn(2).Name = "Collate" ' разобрать по экземплярам
aPrn(2).Value = True
ThisComponent.Print(aPrn())
End Sub
Обратите внимание, что мы указываем индексы (от 0) листов, а не их имена. Узнать индекс листа по его имени можно, например, так:
sheetIndex=ThisComponent.Sheets.getByName("Sheet4").RangeAddress.Sheet
Еще один нюанс. В указанном выше примере отпечатаются листы с индексами 2 и 3, а также лист, который является текущим (выделенным) на начало выполнения макроса. Если это нежелательно, то нужно до выполнения макроса выделить лист, который принадлежит множеству листов для печати.
И еще. Если документ в момент старта макроса находится в режиме предварительного просмотра (Print Preview), то будет отпечатан только текущий лист.
Дополнила двумя строчками:
oDoc = Thiscomponent
oDoc.CurrentController.setActiveSheet oDoc.Sheets.GetByName(«Ввод данных»)
и «вуаля» — всё работает.
Огромное спасибо!!!
- Форум поддержки пользователей LibreOffice, Apache OpenOffice
-
►
Главная категория -
►
Calc -
►
Адаптировать макрос Excel под LibreOffice Calc
Работа конвертеров основана на макрокомандах (макросах). Обычно макросы применяют для выполнения рутинных действий. Мы же будем использовать их для формирования файлов в ИФНС.
По умолчанию использование макросов отключено в Excel и LibreOffice Calc. Нужно самостоятельно один раз включить их. Сделать это очень легко.
Как включить макросы в Microsoft Excel 2007, 2010
Узнать как включить макросы в LibreOffice Calc
Щелкаем на кнопку Файл в левом верхнем углу и выбираем Параметры в открывшемся меню:
В появившемся диалоговом окне выбираем Центр управления безопасностью и Параметры центра управления безопасностью.
В окне выбирайте — Параметры макросов и затем отметьте пункт Включить все макросы
Подтвердите свой выбор, нажатием ОК во всех открытых диалоговых окнах.
После этого вам также необходимо закрыть и открыть файл Excel, чтобы изменения вступили в силу. В дальнейшем макросы будут запускаться в Excel 2007 автоматически.
Как включить макросы в LibreOffice Calc
LibreOffice является бесплатным программным продуктом, который можно скачать здесь (страница на английском) или здесь (страница на русском).
После установки откройте программу Calc. В меню Сервис выбираем Параметры.
Выбираем пункт Безопасность и нажимаем на кнопку Безопасн. макросов
Выбираем уровень Средний (в этом случае при запуске макроса нужно подтверждать его работу дополнительным нажатием на кнопку) или Низкий.
Подтвердите свой выбор, нажатием ОК во всех открытых диалоговых окнах.
Что такое бакалавриат и как получить такой диплом? Бакалавриат — это двухуровневая система высшего образования, которая была введена в России в 2007 г http://edy-diplom.com/ диплом? Бакалавриат — это двухуровневая система высшего образования, которая была введена в России в 2007 году. По окончании такого обучения студенты
Макросы — отличный способ автоматизировать задачи в приложениях для работы с электронными таблицами, будь то старый добрый Microsoft Excel или столь же эффективная альтернатива FOSS, LibreOffice Calc. Самое лучшее в макросах то, что они написаны на очень простом языке под названием Basic.
Как следует из самого названия, Basic — это мягкий язык программирования, на самом деле разработанный с учетом простоты использования. Например, верхний/нижний регистр не имеет значения для имен переменных или ключевых слов (if/IF
, sub/Sub
, function/Function
эквивалентны), фигурные скобки функций необязательны, как в Ruby, а преобразование типов происходит автоматически. Это делает Basic одинаково полезным как для опытных пользователей, так и для программистов. Макрос LibreOffice Basic — это просто функция или подпроцедура, которая выполняет определенную полезную задачу. В этом уроке мы увидим десять таких полезных макросов, которые могут помочь вам с различными задачами автоматизации.
Рецепт 0: Как создать макрос LibreOffice
Хотя макросы также можно создавать в Writer и Draw, в этом конкретном руководстве мы ограничимся электронными таблицами (Calc). Чтобы создать макрос, просто откройте электронную таблицу в LibreOffice и перейдите в меню Tools->Macros->Organize Macros->LibreOffice Basic
. После этого, если вы хотите создать макрос, специфичный для вашей электронной таблицы (как это обычно бывает), разверните файл электронной таблицы слева, выберите Standard
и нажмите New
. Это откроет Редактор макросов LibreOffice в виде отдельного окна.
Рецепт 1: Чтение содержимого ячейки
Одной из самых основных вещей, необходимых для автоматизации, является чтение содержимого ячейки. Следующий фрагмент кода делает именно это:
Sub read_cell
dim document as object
document = ThisComponent
sheet = document.Sheets(0)
MsgBox(sheet.getCellByPosition(0, 0).String)
End Sub
dim
— это ключевое слово, используемое для объявления переменной, но объявление является необязательным, если только Option Explicit
не указано в начале модуля. ThisComponent
— это объект LibreOffice, который ссылается на текущую электронную таблицу (или письменный документ в случае Writer). Здесь важно выражение sheet.getCellByPosition(0, 0).String
, которое получает содержимое первой ячейки в первой строке. На ячейки можно ссылаться, используя систему координат, где (0,0) относится к ячейке в строке-0 и столбце-0. Таким образом, с помощью этого простого метода можно получить любое значение во всей электронной таблице.
Чтобы запустить макрос из редактора, просто поместите курсор внутрь sub
или function
тела любого макроса и нажмите F5
(или щелкните значок Run BASIC
на панели инструментов).
Рецепт 2: Изменить содержимое ячейки
Еще одна часто необходимая вещь — возможность изменить содержимое ячейки. Следующий код устанавливает для первой ячейки в первой строке значение «Hola! Mundo», испанское выражение «Привет! Мир»:
Sub change_cell
dim document as object
document = ThisComponent
sheet = document.Sheets(0)
sheet.getCellByPosition(0, 0).String = "Hola Mundo!"
MsgBox("Done")
End Sub
Рецепт 3: Поиск и замена
Поиск и замена определенных строк может быть важной частью вашей процедуры автоматизации. Ниже приведен забавный макрос, который ищет имена некоторых экспертов по Linux (таких как Линус, Ричард, Питер и т. д.) и заменяет их фамилиями (Торвальдс, Столлман, Энвин):
Sub replace_text
Dim names() As String
Dim surnames() As String
Dim n As Long
Dim document As Object
Dim sheets as Object
Dim sheet as Object
Dim replace As Object
names() = Array("Linus", "Richard", "Peter", "Greg", "Bill")
surnames() = Array("Torvalds", "Stallman", "Anvin", "Kroah", "Gates")
document = ThisComponent rem .CurrentController.Frame
rem sheet = doc.CurrentSelection.Spreadsheet
sheets = document.getSheets()
sheet = sheets.getByIndex(0)
replace = sheet.createReplaceDescriptor rem document.createReplaceDescriptor in case of Writer
rem replace.SearchRegularExpression = True
For n = lbound(names()) To ubound(names())
replace.SearchString = names(n)
replace.ReplaceString = surnames(n)
sheet.replaceAll(replace)
Next n
MsgBox("Done")
End Sub
names()
и surnames()
на самом деле являются массивами. В отличие от C и Java, массивы в Basic объявляются и доступны с помощью круглых, а не квадратных скобок. Кроме того, в объявлении массива объявляется верхняя граница, а не общий размер. Таким образом, foo(2)
на самом деле представляет собой массив размера 3 с индексами от 0 до 2.
Рецепт 4: Регулярные выражения
Регулярные выражения очень полезны при поиске и замене текста на основе определенных шаблонов. Следующий макрос выполняет поиск всех адресов электронной почты в электронной таблице и заменяет каждый из них на [email protected]
:
Sub replace_with_regex
Dim names() As String
Dim surnames() As String
Dim n As Long
Dim document As Object
Dim sheets as Object
Dim sheet as Object
Dim replace As Object
pattern = "b[A-Z0-9._%+-][email protected][A-Z0-9.-]+.[A-Z]{2,}b" rem regex pattern to match any email address
document = ThisComponent rem .CurrentController.Frame
sheets = document.getSheets()
sheet = sheets.getByIndex(0)
replace = sheet.createReplaceDescriptor rem document.createReplaceDescriptor in case of Writer
replace.SearchRegularExpression = True
replace.SearchString = pattern
replace.ReplaceString = "[email protected]"
sheet.replaceAll(replace)
MsgBox("Done")
End Sub
Рецепт 5: Показать диалоговое окно открытия файла
Отображение диалогового окна открытия файла является очень распространенным требованием, особенно когда вы хотите открыть внешний файл для обработки. В приведенном ниже коде объект FilePicker
используется для отображения диалогового окна открытия файла и возврата выбранного имени файла:
function show_open_dialog
dim aurl as object
dim s as string
dim oDlg as object
oDlg = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oDlg.setMultiSelectionMode(false)
oDlg.appendFilter("CSV Files (.csv)", "*.csv" )
oDlg.execute
aUrl = oDlg.getFiles()
s = aUrl(0)
if len(s) > 0 then
MsgBox("File Selected: " & s & chr(13))
end if
show_open_dialog = s
end function
createUnoService
— это особый метод LibreOffice для создания вспомогательных объектов, таких как FilePicker
в этом примере. Метод appendFilter
используется для фильтрации только CSV
файлов в диалоговом окне.
Рецепт 6: Показать диалоговое окно сохранения файла
Для отображения диалогового окна сохранения файла используется тот же объект FilePicker
, который инициализируется аргументом FILESAVE_AUTOEXTENSION
:
function show_save_dialog
dim aurl as object
dim s as string
dim oDlg as object
sFilePickerArgs = Array(_
com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION )
oDlg = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oDlg.initialize(sFilePickerArgs())
oDlg.setMultiSelectionMode(false)
oDlg.appendFilter("CSV Files (.csv)", "*.csv" )
oDlg.setTitle("Save As....")
if oDlg.execute() then
aUrl = oDlg.getFiles()
s = aUrl(0)
if len(s) > 0 then
MsgBox("File Selected: " & s & chr(13))
end if
else
s = ""
end if
show_save_dialog = s
end function
Рецепт 7. Файловый ввод-вывод: чтение из файлов
Ввод-вывод необработанных файлов — это функция, предоставляемая почти каждым языком, а макросы Basic делают ее почти слишком простой. Код ниже используется для чтения CSV-файла с тремя столбцами. Имя файла задается в переменной filename
. Переменная num
представляет собой числовой тег, используемый для ссылки на обработчик файлов, а FreeFile()
возвращает свободный доступный номер, который можно использовать для тегирования. Оператор open
говорит сам за себя. В Basic файлы можно открывать в режимах Input, Output и Binary. Наконец, оператор input
используется для фактического чтения файла в переменные строка за строкой.
sub file_io_read
dim v1, v2, v3
filename = "/home/prahlad/data/test.csv"
num = FreeFile()
open filename for input as #num
do while not eof(num)
input #num, v1, v2, v3
print v1 & "::" & v2 & "::" & v3
loop
close #num
msgbox "Done"
end sub
Рецепт 8. Файловый ввод-вывод: запись в файлы
Для записи в файлы обработчик открывается в режиме output
вместо input
, а оператор write
используется для фактической записи переменных в файл.
sub file_io_write
filename = "/home/prahlad/data/dummy.csv"
num = FreeFile()
open filename for output as #num
write #num, "col1", "col2", "col3"
write #num, "1", "2", "3"
write #num, "4", "5", "6"
close #num
msgbox "Done"
end sub
Рецепт 9: Загрузить данные из CSV-файла
Помимо работы в режиме необработанного ввода-вывода, иногда требуется загрузить полный CSV-файл в виде листа в текущем документе. Используя функцию show_open_dialog
, которую мы изучали ранее, следующий макрос сначала запрашивает у пользователя диалоговое окно открытия файла, а затем загружает указанный CSV-файл как новый лист:
sub load_from_csv
fname = show_open_dialog
if len(fname)>0 then
dim fileProps(1) as new com.sun.star.beans.PropertyValue
fileProps(0).Name = "FilterName"
fileProps(0).Value = "Text - txt - csv (StarCalc)"
fileProps(1).Name = "FilterOptions"
fileProps(1).Value = "44,34,76,1,,0,false,true,true,false"
document = StarDesktop.loadComponentFromURL(fname, "_blank", 0, fileProps())
end if
msgbox "Done"
end sub
fileProps(0)
— это переменная свойства, используемая для указания формата файла CSV, а fileProps(1)
указывает параметры форматирования по умолчанию для CSV (например, разделитель, набор символов и т. д.).
Рецепт 10: Скопируйте текст в буфер обмена
Ваша пользовательская обработка может включать в себя помещение определенного текста в буфер обмена из LibreOffice Calc. Следующий код показывает, как поместить строку «Hola!» в системный буфер обмена:
sub copy_to_clipboard
oClip = CreateUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
oTR = createUnoListener("TR_", "com.sun.star.datatransfer.XTransferable")
oClip.setContents(oTR, null)
msgbox "Done"
end sub
Function TR_getTransferData( aFlavor As com.sun.star.datatransfer.DataFlavor ) As Any
If (aFlavor.MimeType = "text/plain;charset=utf-16") Then
TR_getTransferData = "Hola!"
EndIf
End Function
Function TR_getTransferDataFlavors() As Any
Dim aF As new com.sun.star.datatransfer.DataFlavor
aF.MimeType = "text/plain;charset=utf-16"
aF.HumanPresentableName = "Unicode-Text"
TR_getTransferDataFlavors = Array(aF)
End Function
Function TR_isDataFlavorSupported( aFlavor As com.sun.star.datatransfer.DataFlavor ) As Boolean
TR_isDataFlavorSupported = (aFlavor.MimeType = "text/plain;charset=utf-16")
End Function
Вторая функция является обратным вызовом и используется для сохранения строки в буфер обмена. Последние две являются вспомогательными функциями, которые используются вспомогательными объектами SystemClipboard
и XTransferable
и являются обязательными.
Демо
Наконец, рабочую электронную таблицу LibreOffice Calc, реализующую все эти примеры, можно найти здесь.
использованная литература
- http://api.libreoffice.org/examples/examples.html#Basic_examples
- https://forum.openoffice.org/en/forum/viewtopic.php?f=25&t=36441
- https://ask.libreoffice.org/en/question/39940/calc-open-and-save-csv-file-with-given-filter-options/
- https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide
- https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Ячейки_и_диапазоны
- http://www.excel-spreadsheet.com/vba/inputoutput.htm
- https://forum.openoffice.org/en/forum/viewtopic.php?f=45&t=13783
Первоначально опубликовано на www.prahladyeri.com 26 февраля 2016 г.