Libreoffice поддержка макросов excel

Введение¶

Чаще всего, макрос это сохранённая последовательность команд или нажатий клавиш, предназначенная для последующего использования. Например, можно сохранить и «впечатывать» свой адрес. Язык программирования LibreOffice очень гибок и позволяет автоматизировать как простые, так и сложные задачи. Макросы часто используются, когда мы хотим повторять ещё и ещё раз определённую последовательность действий в схожих условиях.

Макросы в LibreOffice обычно записываются на языке, называемом LibreOffice Basic или просто Basic. Конечно можно долго изучить Basic и наконец начать программировать, но это руководство поможет вам сразу решать простые задачи. Начинающие пользователи часто с успехом применяют макросы, написанные кем-либо другим. Также, можно использовать функцию записи макросов, чтобы сохранить последовательность нажатий клавиш и использовать её ещё раз.

Большинство действий в LibreOffice выполняются путём отправки команды (посылки команды, dispatching a command), которая
перехватывается и выполняется. Функция записи макросов позволяет записать непосредственные команды,
которые обрабатываются (смотрите Платформа диспетчера).

Ваш первый макрос¶

Добавление макроса¶

Первый шаг в изучении программирования макросов, это найти и использовать существующие макросы. В этом разделе подразумевается, что у вас уже имеется макрос, который вы хотите использовать. Вы могли найти его в Интернете или в какой-нибудь книге. Рассмотрим пример 1. Чтобы записать этот макрос, вы должны предварительно создать библиотеку и модуль, и уже в модуле написать текст макроса, смотрите Организация макросов.

Пример 1: Простой макрос, который пишет “Hello, World”:

Sub HelloMacro
  Print "Hello, World"
End Sub

Чтобы создать библиотеку, необходимо выполнить следующие шаги:

  1. Выберете пункты главного меню , чтобы открыть диалог работы с макросами Libreoffice Basic.

Диалог работы с  макросами LibreOffice Basic

Диалог работы с макросами LibreOffice Basic

  1. Нажмите Управление, чтобы открыть диалог организатора макросов и выберите вкладку Библиотеки.
  2. Выберите в выпадающем списке Приложение/Документ пункт Мои макросы и диалоги.

Диалог организатора макросов LibreOffice Basic

Диалог организатора макросов LibreOffice Basic

  1. Нажмите Создать, чтобы открыть диалог создания новой библиотеки.
  2. Введите имя библиотеки, например, TestLibrary и нажмите OK.
  3. Выберите вкладку Модули.
  4. В списке модулей раскройте Мои макросы и выберите TestLibrary. Модуль с именем Module1 уже существует, он может содержать ваши макросы. Если необходимо, том можно нажать Создать, чтобы создать другой модуль в библиотеке.
  5. Выберите Module1 или новый модуль, который вы создали и нажмите Правка, чтобы открыть интегрированную среду разработки (IDE). Интегрированная среда разработки это текстовый редактор, включённый в LibreOffice, который позволяет создавать и редактировать макросы.

Интегрированная среда разработки макросов

Интегрированная среда разработки макросов

  1. После создания нового модуля он содержит комментарий и пустой макрос, названный Main, который ничего не делает.
  2. Добавьте новый макрос или до Sub Main или после End Sub. В примере ниже приведен новый макрос, который был добавлен до Sub Main.

Пример 2: Module1 после добавления нового макроса:

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

Sub HelloMacro
  Print "Привет"
End Sub

Sub Main

End Sub
  1. Нажмите на значок Компилировать ch13-lo-screen-004 на панели инструментов, чтобы откомпилировать макрос.
  1. Поставьте курсор в процедуру HelloMacro и нажмите на значок Выполнить BASIC ch13-lo-screen-005 на панели инструментов или нажмите клавишу F5, чтобы выполнить HelloMacro в модуле. Откроется маленький диалог со словом Привет. Если курсор не находится внутри процедуры Sub или функции Function, откроется диалог выбора макроса для запуска.
  1. Нажмите OK, чтобы закрыть диалог.
  2. Чтобы выбрать и выполнить любой макрос в данном модуле, нажмите значок Выбрать макрос ch13-lo-screen-006 на стандартной панели инструментов или выберите .
  1. Выберите макрос и нажмите Выполнить.

Запись макросов¶

Если вы хотите многократно ввести одинаковую информацию, вы можете скопировать эту информацию после того, как она введена в первый раз, затем вставлять эту информацию в ваш документ каждый раз по мере необходимости. Однако, если вы скопировали в буфер обмена что-то ещё, содержимое буфера меняется. Это означает, что вы должны заново скопировать вашу повторяющуюся информацию. Чтобы обойти эту проблему, вы можете создать макрос, который в процессе выполнения вводит нужную вам информацию.

Примечание

Для некоторых типов многократно вводимой в документах информации более удобно создать файл автотекста. Описание работы с автотекстом смотрите в справочной системе и в главе Глава 3 – Использование Стилей и Шаблонов данного руководства.

  1. Убедитесь, что функция записи макросов активизирована, выбрав . Установите флажок Включить запись макросов. По умолчанию эта функция отключена, когда LibreOffice впервые установлен на ваш компьютер.
  2. Выберите из главного меню, чтобы запустить запись макроса. Появится маленький диалог, подтверждающий, что LibreOffice записывает ваши действия.

Диалог записи макроса

Диалог записи макроса

  1. Наберите желаемую информацию или выполните необходимые действия. Например, напечатайте ваше имя.
  2. Нажмите Завершить запись в маленьком диалоге, чтобы остановить запись, и появится диалог работы с макросами LibreOffice.
  3. Откройте библиотечный контейнер Мои макросы.
  4. Найдите библиотеку с именем Standard в Моих макросах. Обратите внимание, что каждый библиотечный контейнер содержит библиотеку Standard.
  5. Выберите библиотеку Standard и нажмите Создать модуль, чтобы создать новый модуль, содержащий макросы. Откроется диалог создания модуля.

Диалог создания модуля

Диалог создания модуля

  1. Задайте название для нового модуля, например, Recorded и нажмите OK, чтобы создать модуль. В диалоге работы с макросами теперь виден этот новый модуль в составе библиотеки Standard.
  2. В поле Имя макроса напечатайте имя для макроса, который вы только что записали, например, EnterMyName.
  3. Нажмите Записать, чтобы сохранить макрос и закрыть диалог работы с макросами.
  4. Если вы верно выполнили все шаги, описанные выше, библиотека Standard теперь содержит модуль Recorded, и этот модуль содержит макрос EnterMyName.

Примечание

Когда LibreOffice создаёт новый модуль, в этот модуль автоматически добавляется процедура с именем Main.

Запуск макроса¶

  1. Выберите , чтобы открыть диалог выбора макроса.
  2. Например, выберите ваш только что созданный макрос EnterMyName и нажмите Выполнить.
  3. Можно также вызвать из главного меню , чтобы открыть диалог работы с макросами, выбрать ваш макрос и нажать Выполнить.

Диалог выбора макроса

Диалог выбора макроса

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

Чтобы просмотреть или отредактировать созданные вами макросы выполните:

  1. , чтобы открыть диалог работы с макросами.
  2. Выберите ваш новый макрос 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.

Последняя строка кода, конец процедуры.


Создание макроса¶

Если вы задумали создать макрос, то перед началом записи очень важно ответить на два вопроса:

  1. Ваша задача может быть записана как простая последовательность команд?
  2. Могут быть отдельные шаги расположены так, чтобы последняя команда оставляла курсор готовым к следующей команде или вводу текста или данных в документ?

Более сложный пример макроса¶

Быстрый запуск макросов¶


Проблемы с функцией записи макросов¶

Платформа диспетчера¶

Как при записи макросов работает диспетчер¶

Другие средства¶


Организация макросов¶

Где сохраняются макросы?¶

Импорт макросов¶

Загрузка макросов для импорта¶


Как запускать макросы¶

Панели инструментов, пункты меню и быстрые клавиши¶

События¶

Расширения¶

Самостоятельное программирование¶

Где ещё найти информацию¶

Макросы, которые включены в 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

Щелкаем на кнопку Файл в левом верхнем углу и выбираем Параметры в открывшемся меню:

macro1

В появившемся диалоговом окне выбираем Центр управления безопасностью и Параметры центра управления безопасностью.

macro2

В окне выбирайте — Параметры макросов и затем отметьте пункт Включить все макросы

macro3

Подтвердите свой выбор, нажатием ОК во всех открытых диалоговых окнах.

После этого вам также необходимо закрыть и открыть файл Excel, чтобы изменения вступили в силу. В дальнейшем макросы будут запускаться в Excel 2007 автоматически.

Как включить макросы в LibreOffice Calc

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

После установки откройте программу Calc. В меню Сервис выбираем Параметры.

macro1-1

Выбираем пункт Безопасность и нажимаем на кнопку Безопасн. макросов

macro2-1

Выбираем уровень Средний (в этом случае при запуске макроса нужно подтверждать его работу дополнительным нажатием на кнопку) или Низкий.

macro3-1

Подтвердите свой выбор, нажатием ОК во всех открытых диалоговых окнах.

Что такое бакалавриат и как получить такой диплом? Бакалавриат — это двухуровневая система высшего образования, которая была введена в России в 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 г.

Понравилась статья? Поделить с друзьями:
  • Libreoffice отличие от microsoft excel
  • Libreoffice нет формул ms excel
  • Libreoffice не открывает файлы word
  • Libreoffice как сохранить документ в формате word
  • Libreoffice интерфейс как в word