Копирование макросов из одного документа в другой при помощи BASIC

Автор DigitaLS, 12 марта 2024, 09:38

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

DigitaLS

 :D Добрый день Друзья! Прошу помочь!
Ищу код на BASIC который мог бы скопировать определённый макрос из открытого документа в другой, закрытый.

Например:
 - Открыт документ MyDoc1.ods - в нём есть куча макросов,
 - Копирую определённый макрос "Standard.Folder.MyMacros"
 - Открываю документ MyDoc2.ods
 - "Вставляю" в него макрос по такому же пути ("Standard.Folder.MyMacros")
 - Закрываю документ MyDoc2.ods

sokol92

В общем случае это - непростая задача.
Методы UNO предусматривают управление макросами Basic на уровне модулей, а не отдельных макросов. Я не встречал опубликованных программ (кроме устаревшего XLibraryAccess) , в которых бы предлагались методы для определения списка макросов модуля, удаления, замены, вставки макроса в модуль, работа со строками модуля Basic, которые не относятся ни к одному макросу.
По Вашей схеме можно действовать, если мы работаем с целыми модулями, а не с отдельными макросами.
Подобная техника подробно изложена в главе "17. Library Management" знаменитой книги Питоньяка OOME_4_1.odt.

Кстати, вслед за Питоньяком, рекомендую использовать библиотеку Standard только в определенных случаях, например, для UDF (функции, которые используются в формулах листов Calc).
Владимир.

bigor

Можно еще вариант попробовать -  писать напрямую в архив/файл. Правда как записать более менее понятно, а как из открытого файла вытащить модуль не знаю. Можно с 3 мя файлами, один донор, в другой вставляем, а третий (хотя можно и без него) содержит макрос, который все вышеописанное осуществляет.
Поддержать наш форум можно здесь

sokol92

Цитата: bigor от 12 марта 2024, 20:06как из открытого файла вытащить модуль не знаю.
На уровне модулей нет проблем достать или записать текст.
Например, для библиотеки документа:
textMod=ThisComponent.BasicLibraries.getByName("MyLib").getByName("MyModule")
В не открытый файл писать себе дороже: библиотека может быть защищена паролем, тексты модулей должны быть в xml-формате, должны быть файлы с оглавлением библиотек и файлы оглавления для каждой библиотеки...
Владимир.

bigor

Этот вывод еще придется править для записи в файл, плюс файлы описания.
Поддержать наш форум можно здесь

sokol92

Цитата: bigor от 12 марта 2024, 20:24Этот вывод еще придется править для записи в файл, плюс файлы описания.
Когда документ открыт, мы работаем через соответствующие интерфейсы с "плоскими" текстами, как в цитированной главе книги Питоньяка. И никаких служебных файлов.

ThisComponent.BasicLibraries.getByName("MyLib").replaceByName "MyModule", newtextMod
Владимир.

bigor

Я попробовал просто скопировать папку basic из одного ods в другой. При первом запуске LO ругнулся, что отключит макросы так как файл изменен. После сохранения и переоткрытия файла  макросы заработали. Так что метод работает, но минусов у него достаточно, что бы Питоньяка почитать.
Поддержать наш форум можно здесь

DigitaLS

 :beer: Благодарю Вас за помощь! Всё получилось с Вашими наводящими комментариями:
Вот примерный код копирования модуля с макросами из Активного файла в документ который был сохранён ранее:

Sub CopyMacros
' Копируем Модуль "Folder" с макросами (в нём) из активного документа
   Dim sLib As String
   sLib = ThisComponent.BasicLibraries.getByName("Standard").getByName("Folder")
 
'Присваиваем переменной путь к сохранённому ранее файлу
   Dim sURL As String
   sURL = "file:///C:/........... тут путь до папки с файлом MyDoc2.ods"

'Открываем сохранённый файл MyDoc2.ods
   Dim oDoc2 As Object
   oDoc2 = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())

'Вставляем в файл MyDoc2.ods - скопированные Модуль с макросами внутри.
  oDoc2.BasicLibraries.getByName("Standard").InsertByName("Folder", sLib)
 
  oDoc2.store(True) 'Сохраняем файл MyDoc2.ods
  oDoc2.close(True) 'Закрываем файл MyDoc2.ods
End Sub