Calc - Поиск текста в макросах

Автор timal1234, 27 марта 2024, 18:18

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

timal1234

Всем привет!

есть файл ods с кучей макросов (встроены в файл), у каждого макроса своя версия.

хочу узнать какой макрос имеет самую последнюю версию и вывести её на лист.

Вопрос такой:
можно ли как-то (с помощью макроса) запустить поиск текста по всем макросам в файле, чтобы найти последнюю версию и вывести её на лист (в качестве текста допустим кнопки или другого элемента управления)

sokol92

Макросы Basic в документе Calc лежат в библиотеках. Библиотеки состоят из модулей (и диалогов), модули могут содержать отдельные макросы (подпрограммы, функции...).
Что Вы имеете в виду под версией макроса?
Владимир.

timal1234

Цитата: sokol92 от 27 марта 2024, 20:19Макросы Basic в документе Calc лежат в библиотеках. Библиотеки состоят из модулей (и диалогов), модули могут содержать отдельные макросы (подпрограммы, функции...).
Что Вы имеете в виду под версией макроса?
ну это я сам присваиваю номер версии в теле макроса
типа такого:
'==========================================
REM  *************** версия 32.12.6  *******************
'=========================================

sokol92

Вот схема для обработки текстов.

' Обработка текстов всех модулей всех библиотек.
Sub LibraryProc()
  Dim oLibs                ' библиотеки документа
  Dim oLib                 ' объект для библитотеки
  Dim libName As String    ' имя библиотеки
  Dim modName As String    ' имя модуля
  Dim modText As String    ' текст модуля
  Dim arr                  ' строки модуля          
  
  Dim n As Long            ' Общее число строк всех модулей
 
  oLibs=ThisComponent.BasicLibraries
  For Each libName In oLibs.elementNames
    oLibs.loadLibrary(libName)
    oLib=oLibs.getByName(libName)
   
    For Each modName In oLIb.elementNames
      modText=oLib.GetByName(modName)
      arr=Split(modText, Chr(10))
      n=n+Ubound(arr)+1
    Next modName 
  Next libName
  
  Msgbox "Число строк во всех модулях документа :" & n
End Sub
Владимир.

timal1234

Цитата: sokol92 от 27 марта 2024, 21:10Вот схема для обработки текстов.
Спасибо!
Завтра попробую.

timal1234

Цитата: timal1234 от 27 марта 2024, 21:46
Цитата: sokol92 от 27 марта 2024, 21:10Вот схема для обработки текстов.
Спасибо!
Завтра попробую.
Работает!
Спасибо!!!

А как теперь передать значение версии в элемент управления (вписать в кнопку или текстовое поле), если такое конечно возможно ?

timal1234

пока код такой:'===========================================================
REM  *************** версия 0032.14.03  *******************
'============================================================
Sub Last_Macros_Version()
'=============================================================
REM  ***** Last_Macros_Version (Поиск последней версии макроса) *****
'=============================================================
' Обработка текстов всех модулей всех библиотек.

  Dim oLibs                ' библиотеки документа
  Dim oLib                 ' объект для библитотеки
  Dim libName As String    ' имя библиотеки
  Dim modName As String    ' имя модуля
  Dim modText As String    ' текст модуля
  Dim arr                  ' строки модуля         
 
  Dim n As Long            ' Общее число строк всех модулей
  Dim Last_Version As String
  Last_Version = ""
 
  oLibs=ThisComponent.BasicLibraries
  For Each libName In oLibs.elementNames
    oLibs.loadLibrary(libName)
    oLib=oLibs.getByName(libName)
   
    For Each modName In oLIb.elementNames
      modText=oLib.GetByName(modName)
      arr=Split(modText, Chr(10))
      FOR m = 0 to Ubound(arr)      'ищем в массиве строку c версией
      If InStr(arr(m), "версия") > 0 then 'если в строке есть слово "ВЕРСИЯ"
          IF Last_Version < Mid(arr(m), InStr(arr(m), "версия") +7, 10) THEN 'если версия в текущей строке больше, чем последняя записанная
      Last_Version = Mid(arr(m), InStr(arr(m), "версия") +7, 10) 'перезаписываем последнюю версию
      END IF
      end if
NEXT m     
     
      n=n+Ubound(arr)+1
'        Msgbox ("Last_Version = " + Last_Version) 'проверка'
    Next modName
  Next libName
 
 ' Msgbox "Число строк во всех модулях документа :" & n
  Msgbox ("Last_Version = " + Last_Version)
 
End Sub