Перейти к содержимому

Как записать макрос в libreoffice calc

  • автор:

Макросы, управляемые событиями

В данном разделе описано, как назначать программы Basic событиям программ.

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

Назначенный макрос выполняется.

. после запуска приложения LibreOffice.

. перед прекращением приложения LibreOffice.

. после создания нового документа с помощью параметров Файл — Создать или значка Создать .

. после открытия документа с помощью параметров Файл — Открыть или значка Открыть .

Сохранить документ как

. перед сохранением документа под указанным именем (с помощью параметров Файл — Сохранить как , параметров Файл — Сохранить или значка Сохранить , если имя документа еще не было указано).

Документ сохранен как

. . после сохранения документа под указанным именем (с помощью параметров Файл — Сохранить как , параметров Файл — Сохранить или значка Сохранить , если имя документа еще не было указано).

. перед сохранением документа с помощью параметров Файл — Сохранить или значка Сохранить при условии, что имя документа уже указано.

. после сохранения документа с помощью параметров Файл — Сохранить или значка Сохранить при условии, что имя документа уже указано.

Документ в процессе закрытия

. перед закрытием документа.

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

. после выведения документа на передний план.

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

. после закрытия диалогового окна Печать , но перед началом фактического процесса печати.

Ошибка выполнения JavaScript

. когда имеет место ошибка выполнения JavaScript.

Печать документов слияния

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

Изменение количества страниц

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

. если получено сообщение.

Назначение макроса событию

  1. Выберите параметры Сервис — Настройка и откройте вкладку События .
  2. Укажите в окне списка Сохранить в , будет ли назначение глобальным, или действующим только в текущем документе.
  3. Выберите событие из списка Событие .
  4. Нажмите Макрос и выберите макрос для назначения выбранному событию.
  5. Нажмите кнопку ОК для назначения макроса.
  6. Нажмите кнопку ОК , чтобы закрыть диалоговое окно.

Удаление назначения макроса событию

  1. Выберите параметры Сервис — Настройка и откройте вкладку События .
  2. Укажите, какое назначение следует удалить – глобальное назначение или назначение, действующее только в текущем документе, – путём выбора параметра в окне списка Сохранить в .
  3. Выберите событие, которое содержит удаляемое назначение, из списка Событие .
  4. Нажмите кнопку Удалить .
  5. Нажмите кнопку ОК , чтобы закрыть диалоговое окно.

Impressum (Legal Info) | Privacy Policy | Statutes (non-binding English translation) — Satzung (binding German version) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Mozilla Public License v2.0. “LibreOffice” and “The Document Foundation” are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy. LibreOffice was based on OpenOffice.org.

Help content debug info:

Title is: Макросы, управляемые событиями

Recording a Macro

  1. Откройте документ, для которого нужно записать макрос.
  2. Выберите команды Сервис — Макросы — Записать макрос .

Значок примечания

If Tools — Macros — Record Macro menu item is missing, make sure that macro recording feature is enabled in LibreOffice — Preferences Tools — Options — LibreOffice — Advanced .

Ограничения макрорегистратора

Следующие действия не регистрируются:

  • Открытие окон не регистрируется.
  • Действия, выполненные в других окнах (где регистратор не запущен), не регистрируются.
  • Переключение окон не регистрируется.
  • Действия, не связанные с содержимым документа, не регистрируются. Например, изменения, внесённые в диалоговое окно «Параметры», организатор макросов, настройки.
  • Выделения регистрируются только в том случае, если они выполняются с помощью клавиатуры (перемещением курсора), но не регистрируются при использовании мыши.
  • Макрорегистратор работает только в Calc и Writer.

Impressum (Legal Info) | Privacy Policy | Statutes (non-binding English translation) — Satzung (binding German version) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Mozilla Public License v2.0. “LibreOffice” and “The Document Foundation” are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy. LibreOffice was based on OpenOffice.org.

Help content debug info:

Title is: Запись макроса

Использование макросов в LibreOffice

Хабравчане, хочу вам представить перевод от юзера rze. Его ещё нет на Хабрахабре, но он не отказался бы от инвайта. Отправить можно на почту mail@worze.org.

АПД: спасибо Mithgol, инвайт получен. 🙂

Привет, хабражители!
Сегодня я хочу Вам рассказать об использовании макросов в LibreOffice.

Предисловие
Каждый день дома и на работе мы пользуемся офисными приложениями для выполения каких-либо задач. Часто бывает так, что Вы специализируетесь на одной работе и в итоге выполняете одни и те же задачи: вставляете один и тот же текст, форматируете его, используя большое количество горячих клавиш. Во всех этих случаях можно сэкономить Ваше ценное рабочее время, автоматризировав некоторую Вашу работу.
Далее в статье я Вам расскажу об использовании макросов в LibreOffice.

Что же такое макросы и зачем они?

Макрос — это последовательность определенных действий, который можно записать с помощью обычного меню. Когда вы выбираете запись макроса, выполняемые вами действия автоматически сохраняются в виде кода скрипта. И в дальнейшей вашей работе он будет уже выполняться самостоятельно, в точности повторяя Ваши действия в программе. Макрос может быть как простым, так и очень сложным — все зависит от того, какой Вам необходимо добиться результат. Главные критерии, которые предъявляются к макросам — это быть мощным и одновременно простым в использовании. Макросы пакета LibreOffice отвечают именно таким требованиям. Давайте попробуем это на практике.

Для использования пакета LibreOffice, Вам нужно иметь предустановленную операционную систему Linux, Windows или MacOS, a так же установленный пакет LibreOffice (установить его можно, к примеру, из ppa-репозитиев, как описано в этом топике)

Управление макросами

Перед тем как мы приступим к созданию своего макроса, нам нужно познакомится с инструментом управления макросами. Переходим по пути Tools — Macros — Organize Macros — LibreOffice Basic Macros (Сервис — Макросы — Управление макросами — LibreOffice Basic Macros):

В левой колонке окна мы можем увидеть список установленных макросов по-умолчанию. Нажав на любой из них, можно его отредактировать либо удалить.
Главная задача окна — выбрать нужный Вам макрос, назначить ему кнопку на панели инструментов или связать его с каким-либо событием. Назначение макросу кнопки позволяет быстро выполнять наиболее часто используемые из них.

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

Далее рассмотрим запись макросов

Возьмем простой пример. Мы имеем некий текст, уже вставленный в документ и нам нужно сделать заголовок для него, так как наш текст будет использоваться в деловой переписке.
Наш будущий макрос должен будет уметь:
— расположить текст наверху по центру страницы;
— ввести текст, который и будет использоваться в качестве заголовка.
После того, как создадим макрос, мы назначим ему кнопку на панели инструментов. После достаточно будет одного щелчка мыши, чтобы вставить заголовок в документ.
Выполним последовательность шагов.

Шаг 1.
Открываем текстовый документ. Перейдем Tools — Macros — Record Macro. Появится маленькое окно «Запись макроса» с одной единственной кнопкой «Завершить макрос» (Stop Recording):

Шаг 2.
Создадим заголовок текста. Щелкнем мышью на кнопке «Center alignment» («По центру»), для того, чтобы наш будущий текст был именно по центру документа. Теперь пишем сам текст заголовка. Не стоит задавать различные форматы для него (шрифт или жирный/курсив/подчеркнутый), так как макрос не запоминает такие действия.

Шаг 3.
После того, как создание заголовка завершено, щелкните мышью на кнопке «Завершить макрос» окна «Запись макроса». Сразу появится окно Органайзера макросов. Задайте имя для нового макроса (например,PostHead). Теперь можно сохранить его в то место, где бы вы хотели (например, папка «My Macro«).

Шаг 4.
Теперь нам осталось добавить кнопку на панели инструментов для макроса PostHead. Процесс этот не так прост, как казалось бы на первый взгляд.
Открываем LibreOffice Basic Macros, нажимаем кнопку «Assign» («Назначить»). Появится следующее окно Customize, в котором нам следует перейти на вкладку Toolbars и убедиться в том, что в поле «Панель инструментов» стоит «Стандартная» (Standart) .

Нажимаем в этом окне кнопку «Добавить» (Add). Появится еще одно окно — «Добавление команд» (Add commands).
В списке левого окна «Категории» (Category) находим «LibreOffice Macros» (в самом низу списка). Открываем его и добираемся до нашего макроса. Как только нашли — осталось выполнить последний и самый простой шаг. Перетаскиваем мышью макрос Letterhead в то место панели инструментов, где бы мы хотели его видеть.
Все, с задачей справились.
Теперь все, что нам необходимо делать — это пользоваться кнопкой PostHead, которую мы добавили на панель. Например, открываем новый документ и нажимаем кнопку PostHead. Наш макрос создаст заголовок, именно с тем текстом, который мы «назначили» ему и разместит его наверху документа точно по центру.
Правда удобно?

Итог
Конечно, в моем примере мы создали очень простой макрос. Но с помощью вышеописанных инструментов вы можете создать и очень сложные макросы. И не только в Writer, но и во всех остальных приложениях пакета LibreOffice (Spreadsheet, Presentations и т. п.). Теперь, когда Вы знаете, как создавать макросы, вы можете легко создавать свои собственные, для того, чтобы облегчить свою работу.
Целью данной статьи является изучение основ работы с помощью инструментом для записи макросов.

Простой макрос для LibreOffice Calc (Excel). Где найти информацию?

введите сюда описание изображения

Задача решилась самостоятельно. Спасибо за уделённое время. Ничто так не воодушевляет как поддержка неравнодушных людей.

При написании макроса были использованы ресурсы:

  • Справочник по языку Visual Basic (VBA) для приложений
  • Форум OpenOffice (English)
  • Документация Online LibreOffice (English)
  • LibreOffice Calc Guide 6.4 (English)
  • BASIC IDE (English)
  • BASIC Overview (English)
  • BASIC Structured Data Types (English)
  • BASIC Calc (English)
  • BASIC Events (English)
  • BASIC Runtime Library (English)
  • BASIC Runtime paramenters (English)
  • BASIC Files (English)
  • BASIC Dialogs (English)
  • Apache OpenOffice BASIC Programming Guide (English)

В частности конкретные страницы гайда OpenOffice BASIC:

  • The Structure of Spreadsheet Documents
  • Rows and Columns
  • Cells and Ranges
  • Formatting Spreadsheet Documents
  • Editing Spreadsheet Documents

Решением отметил ответ товарища @JohnSUN.

Код получившегося макроса:

 REM ***** BASIC ***** Sub Main Dim oDoc As Object Dim oSheet As Object Dim oCellRange As Object Dim oCursor As Object Dim lRowCnt As Long Dim lColCnt As Long Dim lRowCur As Long Dim bEmptyRow As Boolean Dim oBorder As Object Dim BLine As New com.sun.star.table.BorderLine ' устанавливаем ширину рисуемой линии BLine.OuterLineWidth = 60 ' устанавливаем цвет рисуемой линии BLine.Color = RGB(0, 0, 0) ' текущий документ oDoc = ThisComponent ' активная страница oSheet = oDoc.getCurrentController.activeSheet ' определяем количество колонок по первой строке lColCnt = 0 While oSheet.getCellByPosition(lColCnt, 0).type <> com.sun.star.table.CellContentType.EMPTY lColCnt = lColCnt + 1 Wend ' определяем количество строк oCursor = oSheet.createCursor oCursor.gotoEndOfUsedArea(True) lRowCnt = Curs.Rows.Count ' устанавливаем текущую строку lRowCur = 1 ' основной цикл макроса while lRowCur < lRowCnt ' проверяем пустая ли текущая строка bEmptyRow = true For cColCur = 0 to lColCnt-1 If oSheet.getCellByPosition(cColCur, lRowCur).Type <>com.sun.star.table.CellContentType.EMPTY Then bEmptyRow = false Next cColCur If bEmptyRow Then ' если найдена пустая строка ' выделяем строку выше oCellRange = oSheet.getCellRangeByPosition(0, lRowCur-1, lColCnt-1, lRowCur-1) ' рисуем линию по нижнему бортику ячеек oBorder = oCellRange.TableBorder oBorder.BottomLine = BLine oCellRange.TableBorder = oBorder ' удяляем одну строку oSheet.rows.removeByIndex(lRowCur, 1) ' количество строк уменьшилось на одно после удаления lRowCnt = lRowCnt - 1 Else ' если найдена не пустая строка ' инкремент индекса текущей строки lRowCur = lRowCur + 1 End If Wend ' дальнейшие строки кода выполняют не входившие в условия задачи действия, ' а именно рисуют внешнюю рамку oCellRange = oSheet.getCellRangeByPosition(0, 0, lColCnt-1, lRowCnt-1) oBorder = oCellRange.TableBorder oBorder.BottomLine = BLine oBorder.TopLine = BLine oBorder.LeftLine = BLine oBorder.RightLine = BLine oCellRange.TableBorder = oBorder End Sub 

Отслеживать
48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 27 окт 2020 в 22:36
7,596 1 1 золотой знак 6 6 серебряных знаков 28 28 бронзовых знаков

Записать макрос, потом отредактировать. Для Excel всё просто, а вот для OOo придётся искать, как узнать значение ячейки (я не знаю, как).

27 окт 2020 в 22:53

@Qwertiy лет 20 назад Visual-Basic был любимым ЯП. Какие славные были времена. Врядли в Excel можно вручную сделать макрос с поиском пустой строки, разве что поиск пустой ячейки.

27 окт 2020 в 22:58

В excel’е написание такого макроса заняло бы несколько минут, а как сделать в OOo я понятия не имею. У MSO красивая объектная модель, позволяющая читать и писать значения, менять стили и всё остальное — надо только записать макрос, добавить проверки и радоваться результату. Когда будет тормозить, то погуглить, как на время выполнения макроса отключить обновление экрана. А у OOo в записанном макросе будет полная жесть — там вызовы каких-то команд и свойств будут внутри строк, передаваемых в другие команды. Никакого автодополнения, никаких хороших идей по модификации кода.

27 окт 2020 в 23:02

в OpenOffice Calc 3 версии появилась возможность выполнять какие то готовые уже макросы из Excel, сделанные на VBA. Для этого эту возможность надо активировать в настройках (хотя например у меня в Libre Office это уже активировано). Но вообще ЯП там называется OpenOffice BASIC и заявляется что он похож на VBA (хотя по API конечно отличается). Макросы на OO не писал, поэтому не подскажу, но в сети можно найти множество даже учебников, так что задача на самом деле решаемая.

27 окт 2020 в 23:56

@DiD Ну, если речь о мануале, то давно признано, что книга Питоньяка даёт не только ответы на самые распространённые вопросы, но и хорошего вдохновляющего пинка к изучению объектной модели офиса. Хоть оригинальная книга(в ODT или в PDF), хоть немного устаревший перевод Дмитрия Чернова Просто столкнувшись с задачей, найти в оглавлении нужный раздел и скопипастить рабочий код.

28 окт 2020 в 9:21

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вообще-то, мысль «сделать это вручную» не так уж и плоха. Если знать некоторые приёмы работы с таблицами, то это действительно быстрее, чем писать макрос.

Например, можно использовать четвёртый способ отсюда

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

Раз уж этот вопрос касался макроса, то код может быть таким:

Option Explicit Sub RemoveEmptyRowsAndMark Dim oSheet As Variant Dim oCursor As Variant Dim LastUsedColumn As Long Dim LastUsedRow As Long Dim oDescriptor As Variant ' Используется как дескриптор филтрацмм и как дескриптор сортировки ' Dim aRows As Variant Dim oRange As Variant Rem Структура aBorder позволит отчеркнуть удалённую строку: Dim aBorder As Variant Rem Лист нужно будет отфильтровать: Dim aFilterFields(0) As New com.sun.star.sheet.TableFilterField Dim aFilterField As New com.sun.star.sheet.TableFilterField Rem В качестве листа для чистки использовать активный лист: oSheet = ThisComponent.getCurrentController().getActiveSheet() Rem С помощью курсора ограничим область просмотра только рабочим диапазоном oCursor = oSheet.createCursor() oCursor.gotoEndOfUsedArea(True) LastUsedRow = oCursor.getRangeAddress().EndRow Rem Если лист весь пустой или есть только одна первая строка, то делать нечего: If LastUsedRow < 1 Then Exit Sub LastUsedColumn = oCursor.getRangeAddress().EndColumn Rem В следующей колонке, первой за LastUsedColumn, пишем формулу, которая проверит текущую строку на наличие хоть чего-нибудь и Rem проставит номер строки или "пустую ячейку" Rem (Чтобы не вычислять букву колонки для формулы вида Rem =IF(COUNTA($A1:1);ROW();"") Rem используем нотацию R1C1. Ввод такой формулы немного сложнее, чем просто .setFormula() setRCFormula("=IF(COUNTA(RC1:RC[-1]);ROW();"""")", oSheet.getCellByPosition(LastUsedColumn+1,0)) Rem И ещё одна формула - "необходимо отчеркнуть текущую строку" setRCFormula("=AND(RC[-1]<>"""";R[1]C[-1]="""")", oSheet.getCellByPosition(LastUsedColumn+2,0)) Rem Заполним этими формулами колонки до LastUsedRow (на 160К+ строк придётся немного подождать) oSheet.getCellRangeByPosition(LastUsedColumn+1, 0, LastUsedColumn+2, LastUsedRow).fillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1) Rem Теперь отфильтруем весь диапазон с этими двумя дополнительными колонками Rem по значению ИСТИНА в последней колонке. Повторяем выделение UsedRange (он теперь шире на две колонки): oCursor = oSheet.createCursor() oCursor.gotoEndOfUsedArea(True) Rem Фильтрация: oDescriptor = oCursor.createFilterDescriptor(True) aFilterField.Field = LastUsedColumn + 2 ' Колонка с признаком "необходимо отчеркнуть текущую строку" aFilterField.IsNumeric = true aFilterField.Operator = com.sun.star.sheet.FilterOperator.EQUAL aFilterField.NumericValue = 1 aFilterFields(0) = aFilterField oDescriptor.setFilterFields(aFilterFields) oCursor.filter(oDescriptor) Rem Теперь видны только строки, которые нужно отчеркнуть линией oRange = oCursor.queryVisibleCells() aBorder = oRange.BottomBorder ' Копируем существующую структуру границ диапазона в переменную ' Rem и изменяем её по своему усмотрению aBorder.OuterLineWidth = 50 ' Толщину линии для отчёркивания можно сделать и больше ' aBorder.Color = 255 ' Цвет можно задать любой ' oRange.BottomBorder = aBorder ' Возвращаем измененную структуру на место - теперь все видимые строки получили нижнюю границу ' Rem Удалим фильтр и отобразим скрытые строки aRows = oCursor.getRows() aRows.IsFiltered = False aRows.IsVisible = True Rem Теперь осталось отсортировать диапазон по предпоследней колонке: Call sortRange(ThisComponent, oCursor, LastUsedColumn + 1, False) Rem . и удалить вспомогательные колонки: oSheet.getColumns().removeByIndex (LastUsedColumn+1, 2) Rem Вот и всё End Sub Sub setRCFormula(sRCFormula As String, oCell As Variant) Rem (см. https://ask.libreoffice.org/en/question/149099/how-to-use-r1c1-formulae-in-calc-macros/) Dim hParser As Variant hParser = ThisComponent.CreateInstance( "com.sun.star.sheet.FormulaParser" ) hParser.FormulaConvention = com.sun.star.sheet.AddressConvention.XL_R1C1 oCell.SetTokens(hParser.ParseFormula(sRCFormula, oCell.CellAddress)) End Sub Sub sortRange(oDoc As Variant, oRange As Variant, Optional nColumn As Long, Optional bContainsHeader As Boolean) Dim aSortFields(0) As New com.sun.star.util.SortField Dim aSortDesc(1) As New com.sun.star.beans.PropertyValue If IsMissing(nColumn) Then nColumn = 0 If IsMissing(bContainsHeader) Then bContainsHeader = True oDoc.getCurrentController().select(oRange) aSortFields(0).Field = nColumn aSortFields(0).SortAscending = TRUE aSortDesc(0).Name = "SortFields" aSortDesc(0).Value = aSortFields() aSortDesc(1).Name = "ContainsHeader" aSortDesc(1).Value = bContainsHeader oRange.Sort(aSortDesc()) Rem уберём выделение oDoc.getCurrentController().Select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) End Sub 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *