Скопировать лист Calc в другой документ "1 в 1"

Автор timal1234, 30 января 2026, 13:38

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

timal1234

Цитата: sokol92 от 30 января 2026, 20:43Так что пока я не могу воспроизвести последовательность действий, приводящих к искажению положения кнопок.
теперь и я не могу воспроизвести при копировании ( через контекстное меню листа)  :o

только через макрос... там уезжают

но задача была именно макросом скопировать.

sokol92

Цитата: timal1234 от 30 января 2026, 20:50но задача была именно макросом скопировать.
Завтра посмотрю на копирование макросом.
Владимир.

timal1234


sokol92

Тестируем макросы.
1. Открываем файлы "Источник_1.ods" и "Шаблон_3.ods" (прилагается).
2. Запускаем макрос TestCopySheet из "Шаблон_3.ods" и сравниваем листы "ВЭ".

У меня без видимых различий.
Владимир.

timal1234

Цитата: sokol92 от 31 января 2026, 16:48Тестируем макросы.
Спасибо!
но команда копирования в вашем макросе та же самая, что и у меня (я о ней писал в начале)....  ;D
с вашим волшебным  "Шаблон_3.ods" нет проблем..
но при попытке вставить из одного моего ("боевого") файла в другой ("боевой") с помощью вашего макроса  - опять кнопки уезжают.
к сожалению, не могу выложить (без предварительной очистки их содержимого) настоящие "боевые" файл-источник и файл-назначения...
эти файлы должны иметь общего родителя (это я про стиль ячеек Default)...

буду тестировать дальше.

P.s. :
у нас тут часто интернет отключают, из-за беспилотных опасностей - поэтому могу долго не появляться

sokol92

Цитата: timal1234 от  1 февраля 2026, 11:22поэтому могу долго не появляться
У нас не контрольная работа - время решения не ограничено.  :)
Я живу в Белгороде, работаю за компьютером во второй половине дня (обычно).
Владимир.

timal1234

Установил:
Version: 25.8.4.2 (X86_64)
Build ID: 290daaa01b999472f0c7a3890eb6a550fd74c6df
CPU threads: 8; OS: Windows 11 X86_64 (build 22631); UI render: Skia/Raster; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: CL threaded
------------

скопировалось как надо даже при попытке вставить из одного моего ("боевого") файла в другой ("боевой") с помощью моего макроса.

думаю проблема решена.

Всем спасибо!
 

timal1234


а что, в 25.8.4.2 нельзя цвета в редакторе Basic изменить ???
(цвет операторов, цвет комментариев и т.д.)
было очень удобно, я уже привык к собственным цветам программного кода.
:'(

и через раз запоминает последнюю папку :'(

sokol92

Цитата: timal1234 от  1 февраля 2026, 18:42а что, в 25.8.4.2 нельзя цвета в редакторе Basic изменить ???
(цвет операторов, цвет комментариев и т.д.)
было очень удобно, я уже привык к собственным цветам программного кода.
Я цвета никогда не менял...
Насколько я понимаю, это в Меню / Сервис / Параметры / LibreOffice / Внешний вид, список "Персонализация", элементы "Идентификатор Basic", "Комментарий Basic", ...
Владимир.

timal1234

Цитата: sokol92 от  1 февраля 2026, 19:19
Цитата: timal1234 от  1 февраля 2026, 18:42а что, в 25.8.4.2 нельзя цвета в редакторе Basic изменить ???
(цвет операторов, цвет комментариев и т.д.)
было очень удобно, я уже привык к собственным цветам программного кода.
Я цвета никогда не менял...
Насколько я понимаю, это в Меню / Сервис / Параметры / LibreOffice / Внешний вид, список "Персонализация", элементы "Идентификатор Basic", "Комментарий Basic", ...
Ух ты, а я даже не поробовал развернуть по стрелочке список "Персонализация"  :roll:
Расстроился  ;D
Спасибо большое!


timal1234

Цитата: sokol92 от 30 января 2026, 19:36
Цитата: timal1234 от 30 января 2026, 19:04подскажите, а как тогда скопировать (узнать в макросе) масштаб листа-источника?
См. свойства ZoomValue и ZoomType контроллера документа.

что-то не могу победить масштаб.
делал так:
oDocSource = ThisComponent
Dim Zoom_Source  As Variant
oDocSource.CurrentController.setActiveSheet( oDocSource.Sheets.GetByName( SheetName_to_Copy) )
Zoom_Source = oDocSource.CurrentController.ZoomValue
' - - -
' - - -
' - - -
' ----- устанавливаем масштаб листа --------------------
oDocDestination.CurrentController.setActiveSheet( oDocDestination.Sheets.GetByName( SheetName_to_Copy) ) ' делаем вкладку активной
oDocSource.CurrentController.ZoomValue = Zoom_Source

в результате масштаб меняется на всех листах, хотя "синхронизировать масштаб листов" - отключено в настройках.

что я делаю не так?

sokol92

Похоже, метод setZoomValue контроллера документа устанавливает масштаб на всех листах документа.
Ниже другой путь, составленный моим "студентом" (DeepSeek, примерно 10-я итерация).
Нужно еще потестировать.
' Назначение: Устанавливает масштаб отображения указанного листа
' Использует DispatchHelper для отправки команды Zoom, что позволяет
' устанавливать масштаб для конкретного активного листа
'
' Параметры:
'   oDoc - объект документа LibreOffice Calc
'   sheetIndex - индекс листа (0 - первый лист, 1 - второй и т.д.)
'   zoomValue - значение масштаба в процентах (рекомендуется 20-400)
'
' Возвращаемое значение:
'   Boolean - True если масштаб успешно установлен, False при ошибке
'
' Пример использования:
'   result = SetSheetZoomValue(ThisComponent, 0, 150) ' 150% для первого листа
'
Function SetSheetZoomValue(ByVal oDoc As Object, ByVal sheetIndex As Long, ByVal zoomValue As Long) As Boolean
    Dim oSheet As Object
    Dim oController As Object
    Dim oDispatcher As Object
    Dim args(1) As New com.sun.star.beans.PropertyValue
    Dim originalSheet As Object
   
    On Error Goto ErrorHandler
   
    ' Проверка входных параметров
    If oDoc Is Nothing Then
        SetSheetZoomValue = False
        Exit Function
    End If
   
    If sheetIndex < 0 Or sheetIndex >= oDoc.Sheets.getCount() Then
        SetSheetZoomValue = False
        Exit Function
    End If
   
    ' Корректировка значения масштаба
    If zoomValue < 20 Then zoomValue = 20
    If zoomValue > 400 Then zoomValue = 400
   
    ' Получение объектов
    oController = oDoc.getCurrentController()
    If oController Is Nothing Then
        SetSheetZoomValue = False
        Exit Function
    End If
   
    ' Запоминаем текущий активный лист
    originalSheet = oController.getActiveSheet()
   
    ' Переключаемся на нужный лист
    oSheet = oDoc.getSheets().getByIndex(sheetIndex)
    oController.setActiveSheet(oSheet)
   
    ' Подготовка аргументов для команды Zoom
    args(0).Name = "Zoom.Value"
    args(0).Value = zoomValue
    args(1).Name = "Zoom.Type"
    args(1).Value = 0  ' 0 = PERCENT, 1 = OPTIMAL, 2 = PAGE_WIDTH, 3 = ENTIRE_PAGE, 4 = ZOOMVALUE
   
    ' Создание DispatchHelper и выполнение команды
    oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    oDispatcher.executeDispatch(oController.getFrame(), ".uno:Zoom", "", 0, args)
   
    ' ВОЗВРАЩАЕМСЯ НА ИСХОДНЫЙ ЛИСТ
    ' Это важно - пользователь не должен видеть переключения
    If Not (originalSheet Is Nothing) Then
        oController.setActiveSheet(originalSheet)
    End If
   
    SetSheetZoomValue = True
    Exit Function
   
ErrorHandler:
    ' Пытаемся вернуться на исходный лист даже при ошибке
    If Not (originalSheet Is Nothing) Then
        If Not (oController Is Nothing) Then
            oController.setActiveSheet(originalSheet)
        End If
    End If
    SetSheetZoomValue = False
End Function
Владимир.

timal1234

Цитата: sokol92 от  2 февраля 2026, 19:17Ниже другой путь,
Да, сам вчера подумал через UNO попробовать....
даже и забыл, что так уже устанавливал масшаб в каком-то макросе...
только тогда я не знал, как получить масштаб копируемого листа и задавал нужное мне значение вручную...
а когда Вы мне подсказали:
Zoom_Source = oDocSource.CurrentController.ZoomValueвроде всё получилось!
буду тестировать дальше....

огромное спасибо!