Копирование модулей макросов в LibreOffice

Автор timal1234, 18 сентября 2025, 14:40

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

sokol92

Цитата: timal1234 от 19 сентября 2025, 13:24как проверить, существует ли уже такое имя для нового файла ?
и если да, то заменить его.
Обычно в LO при открытии файла по записи ранее существовавший файл с данным путем перезаписывается.

Если нужно избежать диалога с пользователем, то можно удалить существующий файл.

Для удаления файла или папки используется конструкция (фрагмент):
  oSFA = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  If oSFA.exists(pathURL) Then oSFA.kill(pathURL)


Владимир.

timal1234

Цитата: sokol92 от 19 сентября 2025, 13:53Обычно в LO при открытии файла по записи ранее существовавший файл с данным путем перезаписывается.
действительно, перезаписывает и без этого....
ЦитироватьЕсли нужно избежать диалога с пользователем, то можно удалить существующий файл.
Для удаления файла или папки используется конструкция (фрагмент):
  oSFA = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  If oSFA.exists(pathURL) Then oSFA.kill(pathURL)
но на всякий случай мне пригодится где-нибудь  ;D
Спасибо!

теперь осталось сделать мультивыбор файлов для замены....
вроде модуль GET_FILE позволяет указать несколько файлов....
''    oFileDialog.setMultiSelectionMode(True)      ' для выбора нескольких файлов



sokol92

Цитата: timal1234 от 19 сентября 2025, 14:07вроде модуль GET_FILE позволяет указать несколько файлов
Да.
Для определения имен выбранных файлов следует использовать метод getSelectedFiles, который вернет массив полных путей (в формате URL) к выбранным файлам (а не устаревший метод getFiles).
Владимир.

timal1234

Цитата: sokol92 от 19 сентября 2025, 14:56Для определения имен выбранных файлов следует использовать метод getSelectedFiles, который вернет массив полных путей (в формате URL) к выбранным файлам (а не устаревший метод getFiles).
Спасибо!!!
Вроде работает .

sokol92

Кстати, упомянутый выше макрос Питоньяка может быть использован и для копирования библиотек диалогов (сам автор про это не упоминает  :) ).

Владимир.

timal1234

Цитироватьhttps://forumooo.ru/index.php?topic=6576.0
Цитата: Yakov от 14 мая 2019, 09:28
Цитата: vovan_d от 14 мая 2019, 08:46Пробовал в перенести в макросы (имя файла) - макросы не работают.
Настройте "Безопасность макросов".
Сервис->Параметры->LibreOffice  -> Безопасность -> Безопасность макросов (уровень средний, с запросом на запуск макроса)

Цитата: Al_Ex от 12 июня 2017, 13:26а сообщение можно убрать настройкой Macro Security / Low.

а можно это (Безопасность макросов) как-то через макрос настроить?
хотелось бы отключить запрос на время выполнения макроса, а потом вернуть обратно.

timal1234

Сейчас мой макрос копирования библиотек выглядит так....
(вдруг кому пригодится)....
может там что-то лишнее, а может и ошибки есть, но у меня работает  ;D
(в "MyInfoBar" не стал делать прогресс-бар)

Спасибо этому форуму, где я многое нашёл и где мне многое подсказали !!!

Теперь копирование библиотеки Standard в 15 файлов занимает чуть более минуты.

'===================================================================
REM  ***** Copy_Library (Копирование библиотек) *****
'==================================================================
Sub Copy_Library

rem ----------------------------------------------------------------------
' define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
' get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")


if MsgBox ("Выполнить копирование макросов из этого файла?", 4+128+32, "Начало") = 7 then
Exit Sub 'если нажата кнопка НЕТ (=7) то выход из макроса
end if


'===============================================================
'=======   Запуск ->  ИнфоБар - Выполняется макрос     =============
'====================================================
Dim NN as Long   ' число вызовов функции   
Dim oController ' контроллер документа
Dim oIndicator  ' индикатор  статуса
Dim oFA         ' FunctionAccess
Dim title as String
Dim bRed as Boolean

NN=200000
oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
oController=ThisComponent.getCurrentController()
oIndicator=oController.StatusIndicator()  ' создаем индикатор статуса

'---------------------------------------------------------------------------------------
'--- отправляем на проверку открытого "MyInfoBar" ---
HasMyInfoBar()
'------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------

' ------- если "MyInfoBar" открыта, то закрываем её -------------
IF HasMyInfoBar = TRUE THEN
bRed=False
oIndicator.reset() 'Clear progress value and description
oIndicator.end()   ' закрывам индикатор статуса
' ---- или -----
oIndicator = ThisComponent.getCurrentController().frame.createStatusIndicator()
ThisComponent.CurrentController.StatusIndicator.end()
'------------
oIndicator.reset() 'Clear progress value and description
oController.removeInfobar("MyInfoBar")  ' закрываем инфобар
END IF
'--------------------------------------------------------------------

oController.appendInfobar("MyInfoBar", "Выполняется макрос", "Дождитесь завершения работы макроса ! ", 3, Array(), True)
oIndicator.start("Выполняется макрос", NN)    ' стартуем индикатор статуса  
bRed=True
title = "Выполняется макрос"
oIndicator.setText(title)
oIndicator.setValue(NN/2)

' ----- закрытие "MyInfoBar" в конце этого Sub -------
'====================================================
'===============================================================



'-------------------------------------------------------------------------------------------
Dim oSheetMacrosRun As Object 'лист, с  которого запустили макрос
oSheetMacrosRun = ThisComponent.CurrentController.ActiveSheet

Dim SheetMacrosRun_Name ' имя листа, с которого запустили макрос
SheetMacrosRun_Name = oSheetMacrosRun.Name

Dim oSheets As Variant
Dim oSheet As Variant
oSheets = ThisComponent.getSheets()

Dim MacrosSheet As Variant ' лист с кнопкой выполнения макроса
MacrosSheet = ThisComponent.Sheets.GetByName(SheetMacrosRun_Name) 'лист с кнопкой макроса
'------------------------------------------------------------------------------------------

Dim SrcLibName ' имя исходной библиотеки, содержащейся в oSourceLibs
Dim DestLibName 'имя целевой библиотеки, содержащейся в oDestinationLibs

Dim oSourceLibs ' объект контейнер исходной библиотеки
oSourceLibs = ThisComponent.BasicLibraries

' ----- получаем имена библиотек источника -------------------
Dim libName As String    ' имя библиотеки
Dim oLib ' объект для библитотеки
Dim SourceLibs_Arr()  ' массив библиотек источника

i = 0

For Each libName In oSourceLibs.elementNames
oSourceLibs.loadLibrary(libName)
oLib = oSourceLibs.getByName(libName)
ReDim Preserve SourceLibs_Arr(0 to i)
SourceLibs_Arr(i) = libName
i = i + 1
Next libName


SrcLibName = InputBox( "Укажите имя копируемой библиотеки:" _
+ CHR(13) + CHR(13) _
+ Join(SourceLibs_Arr(), CHR(13) ) _
, "Начало", _
libName _
) 'ввести имя библиотеки для копирования

IF SrcLibName = "" or IsNull(SrcLibName) or IsEmpty(SrcLibName) THEN
MsgBox("Пустое имя библиотеки !" & CHR(13) & "Выход из макроса.")
Exit Sub
END IF

IF oSourceLibs.hasByName(SrcLibName) = FALSE THEN
MsgBox("Нет такой библиотеки !" & CHR(13) & SrcLibName & CHR(13) & "Выход из макроса.")
Exit Sub
END IF

DestLibName = SrcLibName
'-------------------------------------------------------


Dim Selected_Files_Arr()
'--------------------------------------------------------------------------------------------------------
' ------ вызываем диалог открытия файла   -----------
GET_FILES(Selected_Files_Arr() ) ' возвращает пути к выбранным файлам в формате URL
'---------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------

Dim oURL 'путь к файлу

IF UBound(Selected_Files_Arr) >= 0 THEN

FOR w = 0 to UBound(Selected_Files_Arr)

oURL = Selected_Files_Arr(w)


If oURL = "" or IsNull(oURL) or IsEmpty(oURL) then
MsgBox("Пустой путь !" & CHR(13) & "Выход из макроса.")
Exit Sub
end if

'------------------------------------------------------------------------------
' ---------------   открываем файл по URL ------------------
'StarDesktop.loadComponentFromURL(URL, Frame, SearchFlags, FileProperties)
Dim oDocDestination As Object
oDocDestination = starDeskTop.loadComponentFromURL(oURL, "_blank", 0, Array() ) 'файл куда копировать
'---------------------------------------------------------------
'------------------------------------------------------------------------------

Dim oDestinationLibs ' объект контейнер библиотеки назначения
oDestinationLibs = oDocDestination.BasicLibraries


'' =========== возврат на лист, с которого запускали макрос  ===============
ThisComponent.CurrentController.ActiveSheet = ThisComponent.Sheets.GetByName(SheetMacrosRun_Name) 'выбираем  лист
'============================================================================


'------------------------------------------------------------------------------
'------------ отправляем на копирование библиотеки ----------
'AddOneLib(sSrcLib$, sDestLib$, oSrcLibs, oDestLibs, bClearDest As Boolean)
'sSrcLib$ - это имя исходной библиотеки, содержащейся в oSrcLibs
'sDestLib$ - это имя целевой библиотеки, содержащейся в oDestLibs
'oSrcLibs - это контейнер исходной библиотеки
'oDestLibs - это контейнер библиотеки назначения
'если значение bClearDest равно True, то библиотека назначения очищается

AddOneLib(SrcLibName, DestLibName, oSourceLibs, oDestinationLibs, TRUE)
'---------------------------------------------------------------------
'------------------------------------------------------------------------------


Dim DestinationPath
DestinationPath = oDocDestination.getURL()


''================================================
' Определение имени нового файла (в ту же директорию) добавляем '(1)' или следующий номер
''=================================================
Dim file 'As String   ' путь к входному файлу
file = ConvertFromURL(oDocDestination.URL) ' Получим URL документа и превратим его в строку
'file = ConvertFromURL(DestinationPath) ' Получим URL документа и превратим его в строку

pos_cut = InStr(file, ".ods") 'Производит поиск номера символа, с которого начинается образец поиска (string2) в заданной строке (string1).
'Поиск начинается от указанной позиции (start) слева.

Dim Cuted_Path
Cuted_Path = Left(file, pos_cut -1) ' обрезанный (без расширения) путь входного файла
'Left(string, length) 'Возвращает строку, содержащую указанное количество (length) первых символов (слева) исходной строки (string).

Dim DestinationPath_NEW ' новый обрезанный (без расширения) путь файла назначения
Dim Next_Number ' следующий номер версии файла
Next_Number = 1

FOR i = Len(Cuted_Path) to 1 STEP -1
if Right(Cuted_Path, 1) = ")" then
for z = Len(Cuted_Path) to 1 STEP -1
IF Mid(Cuted_Path,z,1) = "(" THEN
if isNumeric( Mid(Cuted_Path, z+1, Len(Cuted_Path)-z-1 ) ) and CInt( Mid(Cuted_Path, z+1, Len(Cuted_Path)-z-1 ) ) <> Next_Number then
Next_Number = CInt( Mid(Cuted_Path, z+1, Len(Cuted_Path)-z-1) ) + 1
DestinationPath_NEW = Left(Cuted_Path, z) & Next_Number  & ").ods" 'новое имя выходного файла назначения (полный путь с расширением)
Exit FOR
elseif isNumeric( Mid(Cuted_Path, z+1, Len(Cuted_Path)-z-1 ) ) and CInt( Mid(Cuted_Path, z+1, Len(Cuted_Path)-z-1 ) ) = Next_Number then
Next_Number = Next_Number + 1
DestinationPath_NEW = Left(Cuted_Path, z) & Next_Number  & ").ods" 'новое имя выходного файла назначения (полный путь с расширением)
Exit FOR
end if
ELSEIF Mid(Cuted_Path,z,1) = "\" THEN
DestinationPath_NEW = Cuted_Path & "(1).ods" 'новое имя выходного файла назначения (полный путь с расширением)
Exit FOR
END IF
next z
Exit FOR

elseif Mid(Cuted_Path,i,1) = "." then
IF IsNumeric( Right(Cuted_Path, Len(Cuted_Path)-i) ) and CInt( Right(Cuted_Path, Len(Cuted_Path)-i) ) > 0 THEN
Next_Number = CInt( Right(Cuted_Path, Len(Cuted_Path)-i) ) + 1
DestinationPath_NEW = Left(Cuted_Path, i) & Next_Number & ".ods" 'новое имя выходного файла назначения (полный путь с расширением)
Exit FOR
END IF
elseif Mid(Cuted_Path,i,1) = "\" then
DestinationPath_NEW = Cuted_Path & "(1).ods" 'новое имя выходного файла назначения (полный путь с расширением)
Exit FOR
end if
NEXT i




IF DestinationPath_NEW = "" OR IsNull(DestinationPath_NEW) OR IsEmpty(DestinationPath_NEW) THEN
MsgBox("Что-то не так с новым именем файла назначения" & CHR(13) & "Выход из макроса.",  0+0+48, "ВНИМАНИЕ !!!" )
'---- закрываем открытый файл назначения ---------
oDocDestination.close(true)
'------------------------------------------------
Exit Sub
END IF

'-------------------------------------------------------------------------------------------------------------------
'-------------- Проверка существует ли файл  с новым именем ---------------
'Обычно в LO при открытии файла по записи ранее существовавший файл с данным путем перезаписывается.
'Если нужно избежать диалога с пользователем, то можно удалить существующий файл.
'Для удаления файла или папки используется конструкция (фрагмент):
Dim oSFA   ' объект SimpleFileAccess     
oSFA = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

If oSFA.exists(  ConvertToURL(DestinationPath_NEW)  ) Then
' удалить
' 'oSFA.kill(  ConvertToURL(DestinationPath_NEW) )
' создать копию (переименовать)
'oSFA.copy(SourceURL, DestURL)
' oSFA.copy(  ConvertToURL(DestinationPath_NEW),   ConvertToURL(DestinationPath_NEW & ".bkp") )
' переместить
'oSFA.move(SourceURL, DestURL)
oSFA.move(  ConvertToURL(DestinationPath_NEW),   ConvertToURL(DestinationPath_NEW & ".bkp") )
End If
'-----------------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------------------------------


''=============================================================
'---------------- сохраняем открытый файл назначения ---------------------
'oDocDestination.store() 'Save
oDocDestination.storeAsURL( ConvertToURL( DestinationPath_NEW) , Array()  ) 'Save As'
'oDocDestination.storeToURL( ConvertToURL( DestinationPath_NEW ) )
'-------------------------------------------------------------------------
''=============================================================

''=============================================================
'---------------- закрываем открытый файл назначения ---------------------
oDocDestination.close(true)
'-------------------------------------------------------------------------
''=============================================================

NEXT w
ELSE
MsgBox("Что-то не так с выбором файлов." & CHR(13) & "Попробуйте снова" & CHR(13) & "Выход из макроса.",  0+0+48, "ВНИМАНИЕ !!!" )
Exit Sub
END IF




'=======================================================================
'=======   Завершение ->  ИнфоБар - Выполняется макрос     =============
'=========================================================
bRed=False
oIndicator.reset() 'Clear progress value and description
oIndicator.end()   ' закрывам индикатор статуса
' ---- или -----
'oIndicator = ThisComponent.getCurrentController().frame.createStatusIndicator()
'ThisComponent.CurrentController.StatusIndicator.end()
'------------
oIndicator.reset() 'Clear progress value and description
oController.removeInfobar("MyInfoBar")  ' закрываем инфобар
'====================================================
'===================================================================


MsgBox ("ГОТОВО !", 0+0+48, "Завершение")

End Sub
'========================================
' ------- Конец Copy_Library ----------
'===============================================




'===================================================================
REM  ***** запуск диалога Открыть файл и получить путь к файлам *****
'==================================================================
Sub GET_FILES(Selected_Files_Arr() ) ' возвращает пути к выбранным файлам в формате URL

Dim oFileDialog as Object ' далог Открыть файл
Dim iOpenFile ' результат выполнения диалога
Dim oFiles 'Возвращаемый диалогом выбора файла массив выбранных файлов
'Dim oURL 'as Long 'as Variant 'as String 'путь к файлу


' задать, чтобы фильтр показывал только файлы ods '
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
''oFileDialog.SetDisplayDirectory(ConvertToUrl("X:\")) ' для указания стартовой папки
oFileDialog.setMultiSelectionMode(True)  ' для выбора нескольких файлов
oFileDialog.appendFilter("Электронные таблицы (Calc)", "*.ods" )
iOpenFile = oFileDialog.Execute()
If iOpenFile = 0 Then
MsgBox ("Файлы не выбраны !",  0+0+48)
Exit Sub
Else
oFiles = oFileDialog.getSelectedFiles()
IF UBound(oFiles) >= 0 THEN
Selected_Files_Arr() = oFiles()
END IF
End If

End Sub
'==================================
'-----------==============----------------
'===============================================

 

'================================================================
REM ***** функция проверки открытого инфобара "MyInfoBar" *****
'===============================================================
Function  HasMyInfoBar() as boolean
    hasMyInfoBar = ThisComponent.getCurrentController().hasInfobar("MyInfoBar")
End Function
'===========================================
'-----------------------------------------------------
'===========================================================




'===================================================================
REM  ***** AddOneLib (Скопировать библиотеку) *****
'==================================================================
'Питоньяк "OpenOffice.org Macros Explained" (OOME_4_1.odt)
'Листинг 527. Скопировать библиотеку.
'sSrcLib - это имя исходной библиотеки, содержащейся в oSrcLibs
'sDestLib - это имя целевой библиотеки, содержащейся в oDestLibs
'oSrcLibs - это контейнер исходной библиотеки
'oDestLibs - это контейнер библиотеки назначения
'если значение bClearDest равно True, то библиотека назначения очищается

Sub AddOneLib(sSrcLib$, sDestLib$, oSrcLibs, oDestLibs, bClearDest As Boolean)

  Dim oSrcLib   'The source library to copy - это контейнер исходной библиотеки
  Dim oDestLib  'The destination library to receive the modules in oSrcLib - это контейнер библиотеки назначения
  Dim sNames
  Dim i%
 
  'If there is no destination library then simply return
  'Если целевой библиотеки нет, то просто вернитесь
  If IsNull(oDestLibs) OR IsEmpty(oDestLibs) Then
    Exit Sub
  End If

  'Clear the destination library if requested
  'Очистите целевую библиотеку, если потребуется
  If bClearDest AND oDestLibs.hasByName(sDestLib) Then
    oDestLibs.removeLibrary(sDestLib)
  End If

  'If there is no source library, then there is nothing else to do
  'Если исходной библиотеки нет, то делать больше нечего
  If IsNull(oSrcLibs) OR IsEmpty(oSrcLibs) Then
    Exit Sub
  End If

  'If the source library does not exist, then there is nothing else to do
  'Если исходная библиотека не существует, то больше ничего не остается делать
  If NOT oSrcLibs.hasByName(sSrcLib) Then
    Exit Sub
  End If

  'If the destination library does not exist, then create it
  'Если целевая библиотека не существует, то создайте ее
  If NOT oDestLibs.hasByName(sDestLib) Then
    oDestLibs.createLibrary(sDestLib)
  End If

  'the libraries must be loaded first.
  'Common mistake to not load the libraries first!
  'сначала должны быть загружены библиотеки.
  'Распространенная ошибка - не загружать библиотеки в первую очередь!
  oSrcLibs.loadLibrary(sSrcLib)
  oDestLibs.loadLibrary(sDestLib)

  'Get the source and destination libraries
  'Get all of the contained modules that should be copied
  'Получить исходную и целевую библиотеки
  'Получить все содержащиеся в них модули, которые необходимо скопировать
  oSrcLib = oSrcLibs.getByName(sSrcLib)
  oDestLib = oDestLibs.getByName(sDestLib)
  sNames = oSrcLib.getElementNames()

  'For each module, either add it or replace it
  'Для каждого модуля либо добавьте его, либо замените
  For i = LBound(sNames) To UBound(sNames)
    If oDestLib.hasByName(sNames(i)) Then
      oDestLib.replaceByName(sNames(i), oSrcLib.getByName(sNames(i)))
    Else
      oDestLib.insertByName(sNames(i), oSrcLib.getByName(sNames(i)))
    End If
  Next
End Sub
'----------===============-------------------
'======================================================


sokol92

Цитата: timal1234 от 20 сентября 2025, 10:19а можно это (Безопасность макросов) как-то через макрос настроить?
Менять уровень безопасности макросов программным путем не очень хорошо, особенно на чужом компьютере.
Проще добавить какую-нибудь подпапку Вашей личной папки в список надежных источников

Параметры / LibreOffice / Безопасность / Кнопка "Безопасность макросов" / Вкладка "Надежные источники"

и файлы для копирования размещать там. Альтернатива - программным путем копируем в эту папку целевой файл, открываем целевой файл, меняем целевой файл, копируем в исходную папку.
Владимир.

mikekaganski

Цитата: sokol92 от 20 сентября 2025, 16:12Менять уровень безопасности макросов программным путем не очень хорошо, особенно на чужом компьютере.

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

Правда, нужно сделать так, что даже краш программы или отключение электропитания не оставят за собой опасный уровень - а вот это уже практически нереализуемо. Поэтому я поддерживаю совет настроить надёжные источники.
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 20 сентября 2025, 16:20
Цитата: sokol92 от 20 сентября 2025, 16:12Менять уровень безопасности макросов программным путем не очень хорошо, особенно на чужом компьютере.

Если макрос уже запущен, это значит, что он разрешён.
Макрос разрешён только в открытом файле источнике.
Далее в макросе я открываю указанные файлы назначения и для каждого этого файла появляется вопрос : разрешить макросы или нет.

ЦитироватьПравда, нужно сделать так, что даже краш программы или отключение электропитания не оставят за собой опасный уровень - а вот это уже практически нереализуемо. Поэтому я поддерживаю совет настроить надёжные источники.
Понял.
Спасибо!

sokol92

Нашел подходящий макрос. Пригодится, если будете тиражировать свои решения.
Option Explicit

' lang:ru
' Добавляет папку в список безопасных расположений.
' - Folder путь к папке (в формате ОС или URL формате).
'
' Код возврата:
' 0 - папка добавлена
' 1 - папка уже добавлена ранее
' 2 - ошибка при добавлении
Function SetFolderTr(ByVal Folder As String) as Long
  Dim oConfig, arr, v, ub As Long
  SetFolderTr=2

  If Len(Folder) = 0 Then Exit Function
  Folder = ConvertToUrl(Folder)

  GlobalScope.BasicLibraries.LoadLibrary("Tools")
  oConfig = GetRegistryKeyContent("org.openoffice.Office.Common/Security/Scripting", True)
  arr = oConfig.SecureURL
  For Each v In arr
    If Lcase(v) = LCase(Folder) Then
      SetFolderTr = 1
      Exit Function
    End If
  Next v
 
  ub=Ubound(arr)
  If ub<0 Then
    ReDim arr(0)
    arr(0) = Folder
  Else
    ReDim Preserve arr(ub+1)
    arr(ub+1) = Folder
  EndIf
          
  oConfig.SecureURL = arr
  oConfig.commitChanges
  SetFolderTr = 0
End Function

Sub Test()
  SetFolderTr "C:\temp\temp"
End Sub
Владимир.

mikekaganski

Цитата: timal1234 от 20 сентября 2025, 16:31Макрос разрешён только в открытом файле источнике.
Далее в макросе я открываю указанные файлы назначения и для каждого этого файла появляется вопрос : разрешить макросы или нет.
Это понятно. Смысл моих слов был: "пользователь уже разрешил выполнение макроса, система защиты уже сработала - а значит, дальнейшая сработка на время работы макроса и в самом деле излишня".
С уважением,
Михаил Каганский

timal1234

Цитата: sokol92 от 20 сентября 2025, 16:40Нашел подходящий макрос. Пригодится, если будете тиражировать свои решения.
Спасибо!
Испробую  :)

mikekaganski

Цитата: timal1234 от 20 сентября 2025, 16:31Далее в макросе я открываю указанные файлы назначения и для каждого этого файла появляется вопрос : разрешить макросы или нет.
Постойте, а ведь для этого есть свойство MediaDescriptor "MacroExecutionMode"!

Ну и я бы советовал попробовать выставить его в запрет - Вам ведь на самом деле не требуется выполнять макросы в открываемых вторично документах, только заменять? Я не уверен, что оно сработает при запрете, но попробовать стоило бы.
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от 20 сентября 2025, 17:05Постойте, а ведь для этого есть свойство MediaDescriptor "MacroExecutionMode"!

Ну и я бы советовал попробовать выставить его в запрет - Вам ведь на самом деле не требуется выполнять макросы в открываемых вторично документах, только заменять?
Да
ЦитироватьЯ не уверен, что оно сработает при запрете, но попробовать стоило бы.
Попробую.... завтра или в понедельник  ;D
Спасибо!