Как писать макросы?

Автор AlexWorkStream, 28 сентября 2017, 12:09

0 Пользователи и 1 гость просматривают эту тему.

AlexWorkStream

Добрый день. Появилась мысль освоить написание макросов.
Вопрос в том, стоит ли и сколько это займет времени? Если стоит, то не могли бы Вы ткнуть носом в учебники по созданию макросов для Calc с нуля.
Заранее спасибо за ответы!

JohnSUN

Дельная мысль, однозначно стоит: медики уверяют, что у людей, которые постоянно нагружают мозг разными задачами, болезнь Альцгеймера и старческое слабоумие начинаются гораздо позже. А уж в программировании этих самых разных задач хоть пруд пруди. Так что написание макросов - путь к долголетию! Вперёд и попутного ветра!
Первые макросы займут секунд 20-30. Реально!
Для начала идёшь в Сервис - Параметры - LibreOffice - Расширенные параметры, чтобы убедиться, что на пункте "Разрешить запись макросов" стоит птичка.
Затем при какой-нибудь открытой книге Calc выбираешь из меню Сервис - Макросы - Записать макрос (появится панелька с единственной кнопкой "Завершить запись"
Щелкаешь мышкой по какой-то ячейке, пишешь "Здравствуй, мир!", жмёшь Enter и щёлкаешь по этой самой "Завершить..."
В появившемся окне сохранения в поле Имя макроса пишешь что-нибудь вроде HelloW или Macro1.
Теперь или Alt+F11 или из меню Сервис - Макросы - Управление макросами - LibreOffice Basic выбираешь этот свой макрос и нажимаешь Править. Вот они - десять строк кода твоего первого макроса.
Ставишь курсор в любую строчку и жмёшь F5 - переключаешься обратно в книгу и видишь - ВАУ! - что макрос работает, он написал "Здравствуй, мир!" в еще одну ячейку.
Жмёшь Alt+F11 и кнопку Выполнить - еще в одной ячейке появился текст.
Возвращаешься в редактор макроса и пытаешься прочитать, что там написано... Сложно, но можно... Меняешь .Value на что-то другое - выполняешь - работает.
Таким же образом записываешь какие-то другие действия (например, выделить диапазон и закрасить его каким-то цветом). Ещё что нибудь...

Ну, а потом, как тут сейчас все начнут советовать - читаешь Питоньяка, устанавливаешь MRI, пишешь более сложные программы...

И имей в виду - большая часть нужных программ уже давным давно написана, нужно только найти готовые куски кода и слепить из них свою программу.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

#2
Макросы для OpenOffice|LibreOffice Calc (язык StarBasic) могут в себе содержать и целые куски макросов для Microsoft Excel (язык VBA), по которому литературы, информации и примеров доступно в десятки раз больше (а сам VBA чуть попроще, не такой "многословный"). Эти языки имеют примерно 50% общего, а алгоритмы, принципы и приемы автоматизации - вообще совпадают 1:1, за вычетом пустяков.

Изучая макросы электронных таблиц "вообще" - есть хороший шанс вырасти как специалист и начать "стоить" не как обычный бухгалтер, экономист, 1С-ник, админ или PHP-ист (с окладом ~25-30 тыс. руб.), а как "самостоятельный лоскутный офисный автоматизатор" (с окладом ~40-65 тыс. руб.) Я не шучу, цифры из реальной жизни и не только моей. В крупном городе эти цифры можно умножить на 1,5...

Самое удивительно в макросах то, что их результат - "ближе всего" к бизнесу, его хозяевам и вашим коллегам. Нет лучшего способа показать себя, чем написать макрос, который делает работу целого дня - за один час. Или ещё реальный пример: 4 человека считали зарплату и налоги для 1000 работников за 20 дней. После написания макроса - 1 человек считает её же - за 4 дня. 80/4=20 раз (во столько снизились трудозатраты). Зарплата этого человека теперь в 4 раза больше чем у тех 4-х. Зарплатный рычаг 1:5 (на сколько выросла ЗП от суммы экономии) - за рубежом назвали бы грабежом, но в нашей действительности любой объективный рост зарплаты - достижение, так что дерзайте!

Чтобы освоить макросы до "заметного уровня" - понадобится не менее 80 часов (~2 месяца по 2 часа каждый рабочий день).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

PaulEfremoff

Цитата: JohnSUN от 28 сентября 2017, 12:44Так что написание макросов - путь к долголетию!
Я уже поседел от макросов.
Извините.

KSumatokhin

Здравствуйте, пытаюсь освоить макросы OpenOffice Basiс. Основную более менее понятную информацию нашел только для VBA. Прошу помочь перевести данный код для VBA в рабочий код OOB.
Исходный код:
Public Sub FromExcelToWord()
MsgBox Range("A1").Text
MsgBox Range("A2").Text
MsgBox Range("A3").Text
Dim oWord As Word.Application
Dim oDoc As Word.Document
Set oWord = CreateObject("Word.Application")
oWord.Visible = True
Set oDoc = oWord.Documents.Add()
oDoc.Activate
oWord.Selection.TypeText "Вставляемый текст"
End Sub

eeigor

#5
Вы в одном коде используете раннее связывание (требует установки ссылки на com-объект) и позднее (вызов CreateObject) одновременно. Вряд ли эта информация Вам более или менее понятна... Надо что-то одно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

KSumatokhin

#6
eeigor, это был код из книги про VBA. Я его выполнил, все получилось. Мне интересно, что нужно написать на OOB, что бы получилось подобное в OpenOffice. Я же только начинаю это изучать.
Конкретный исходник:
ЦитироватьЗадание для самостоятельной работы 3.1:
Работа с переменными и операторами
Подготовка:
1. Создайте новую книгу Excel и сохраните ее как C:\LabVariablesOperators.xls.
Введите в ячейки A1, A2 и A3 этой книги любые значения.
2. Откройте редактор Visual Basic в Excel и создайте в этой книге новый
стандартный модуль (см. разд. 2.2).
Синтаксис и программные конструкции VBA 53
3. При помощи меню Tools | References добавьте в ваш проект ссылку на
библиотеку Microsoft Word 11.0 Object Library.
4. Введите в созданном вами стандартном модуле следующий код:
Этот код должен выводить в окна сообщений значения ячеек A1, A2 и A3,
а затем открыть Word и впечатать в начало нового документа строку
"Вставляемый текст".
5. Убедитесь, что код работает без ошибок.

eeigor

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

А какая стоит задача, кроме учебной? Для учебных задач есть книга А.Питоньяка.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

KSumatokhin

eeigor, у меня был такой опыт с AutoCAD-ом. Начал изучать AutoLISP, задач изначально не было ни каких, по ходу изучения появлялись идеи, что можно сделать. За 10 лет достиг неплохого результата. Для расчетов использую Calc, потому что в свое время отказались от покупки Excell. Сейчас у меня очень хорошая расчетная таблица, я получаю к ней доступ из CAD'а, автоматически вставляю данные из CAD туда, обрабатываю и получаю обратно, но вот до программирования в Calc руки так и не дошли. Поэтому у меня нет четкого ТЗ, потому что не знаю всех возможностей.
К примеру в каждом файле ODS я храню БД (просто таблицу), значения которой подставляются в определенные строки, они интерполируются, из них выбираются параметры и т.д. Но очень не удобно, когда БД нужно поменять. Вот было бы хорошо организовать отдельную БД и ссылаться на нее. Но вот как проще/лучше я не знаю. Сейчас все на именованных диапазонах.
Потом хорошо бы записать все мои формулы в виде модуля. Ну например, для того чтобы автоматически вставлять рассчитываемые строки. В моем случае каждая строка это токоприемник с параметрами и полученными результатами. Ищу пути для наиболее быстрого создания этих токоприемников, может что то типа, написал определенный запрос получил сразу вставленные строки. (это просто рассуждения, а может лучше их копировать из файла шаблона...)
И если с VBA хоть что то понятно, хотя бы понятна объектная модель, то с OO пока совсем беда. А вот некоторые коды Питоньяка у меня вообще просто вызвали ошибку. Поэтому я решил, что старый метод разбора кода поможет более лучше понять логику.

eeigor

#9
Цитата: KSumatokhin от 22 августа 2022, 15:53Введите в ячейки A1, A2 и A3 этой книги любые значения.
Код ниже выполнить из Calc.
Sub Main()
Dim oSheet As Object, oCell As Object

oSheet = ThisComponent.CurrentController.ActiveSheet

oCell = oSheet.getCellByPosition(0, 0)  'ByName("A1")
MsgBox oCell.String, MB_ICONINFORMATION, ThisComponent.Title

oCell = oSheet.getCellRangeByName("A2")
MsgBox oCell.String, , ThisComponent.Title

oCell = oSheet.getCellByPosition(0, 2)  'ByName("A3")
MsgBox oCell.String, Title:=ThisComponent.Title


Dim oDoc As Object
Dim oText As Object, oViewCursor As Object, oTextCursor As Object
Dim s$: s = "Вставляемый текст"

oDoc = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array())
oText = oDoc.Text
oViewCursor = oDoc.CurrentController.ViewCursor
oTextCursor = oText.createTextCursorByRange(oViewCursor.Start)

oText.insertString(oTextCursor, s, False)
End Sub

Не разобрался, как загрузить файл
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: KSumatokhin от 22 августа 2022, 19:27вот некоторые коды Питоньяка у меня вообще просто вызвали ошибку
Считаю книгу А.Питоньяка OOME_4_0.odt лучшим руководством по переходу с VBA на LibreOffice Basic. Готов дать необходимые пояснения (или исправления) по конкретным вопросам, затронутым в книге.
Другие актуальные источники от А.Питоньяка:
AndrewBase.odt - книга о компоненте Base, написанная на столь же высоком (научном, учебном и стилевом) уровне.
AndrewMacro.odt - большой набор макросов на разные темы. Часть этих макросов вошла в книгу OOME_4_0.odt.
Владимир.

KSumatokhin

sokol92, скачал OOME_4_0, спасибо за рекомендацию (а есть на русском?) внутри книги есть кнопки, но они у меня не работают. Вернее сказать я не знаю как сделать так, что бы на кнопку можно было нажать и она выполнила макрос. Подскажите если знаете, как это сделать. Пользуюсь Apache OpenOffice 4.1.10.

sokol92

Цитата: KSumatokhin от 23 августа 2022, 10:34Пользуюсь Apache OpenOffice 4.1.10.
Я использую LibreOffice (как и большинство помогающих здесь). LibreOffice - "живой" продукт (в отличие от OpenOffice), некоторые его разработчики активно участвуют в работе данного сайта.  :)

Документы в формате .odt открываются в компоненте Writer. Для того, чтобы элементы управления (например, кнопки) могли работать в интерфейсе пользователя (например, реагировать на щелчок мыши), необходимо отключить "Режим разработки" (Меню / Формы / Режим разработки). Чтобы не делать это каждый раз при открытии документа нужно отключить опцию "Открывать в режиме разработки" (Меню / Формы / ) и сохранить документ.
Владимир.

sokol92

#13
Цитата: KSumatokhin от 23 августа 2022, 10:34а есть на русском
А.Питоньяк - американец и его родной en_US Google Translate переводит очень хорошо.  :)
Владимир.

gabix

Цитата: KSumatokhin от 23 августа 2022, 10:34а есть на русском?

Было даже издано в виде печатной книги под названием «OpenOffice.org pro. Автоматизация работы». Давно, правда, в 2008 году, но и изменения в оригинале с тех пор не такие уж радикальные.