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

Автор almaster13, 25 октября 2024, 12:18

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

almaster13

Вставил код макроса. Есть у него только один недостаток, он будет копировать поверх содержимого страниц и если запустить его несколько раз, то тех же графиков будет наложено друг на дружку ровно столько же!

Sub CopyGrafik_new

oDoc=thiscomponent

firstUrl = "file:///cifs/DATA/DNT/PLAN-2024-Astra.ods"
firstDoc = StarDesktop.loadComponentFromUrl(convertToURL(firstUrl), "_blank", 0, dimArray())

selectSheetByName(firstDoc, "Блок №1")

  dispatchURL(firstDoc,".uno:SelectAll")
  dispatchURL(firstDoc,".uno:Copy")

selectSheetByName(oDoc, "График блок 1")
  dispatchURL(oDoc,".uno:Paste")
 
  selectSheetByName(firstDoc, "Блок №2")
    dispatchURL(firstDoc,".uno:SelectAll")
    dispatchURL(firstDoc,".uno:Copy")

selectSheetByName(oDoc, "График блок 2")
  dispatchURL(oDoc,".uno:Paste")
 
    selectSheetByName(firstDoc, "Блок №3")
    dispatchURL(firstDoc,".uno:SelectAll")
    dispatchURL(firstDoc,".uno:Copy")

selectSheetByName(oDoc, "График блок 3")
  dispatchURL(oDoc,".uno:Paste")
 
    selectSheetByName(firstDoc, "Блок №4")
    dispatchURL(firstDoc,".uno:SelectAll")
    dispatchURL(firstDoc,".uno:Copy")

selectSheetByName(oDoc, "График блок 4")
  dispatchURL(oDoc,".uno:Paste")
 
firstDoc.close (true)
End Sub

Sub selectSheetByName(document, sheetName)
  document.getCurrentController.select(document.getSheets().getByName(sheetName))
End Sub

Sub dispatchURL(document, aURL)
  Dim noProps()
  Dim URL As New com.sun.star.util.URL

  frame = document.getCurrentController().getFrame()
  URL.Complete = aURL
  transf = createUnoService("com.sun.star.util.URLTransformer")
 transf.parseStrict(URL)

  disp = frame.queryDispatch(URL, "", com.sun.star.frame.FrameSearchFlag.SELF _
         OR com.sun.star.frame.FrameSearchFlag.CHILDREN)
  disp.dispatch(URL, noProps())
End Sub

Sirius34

Цитата: sokol92 от 28 октября 2024, 14:33Что касается метода close, то Михаил выше объяснял назначение его параметра логического типа. В "обычной" ситуации метод close в LO, независимо от параметра, "молча" закроет документ, даже если в нем есть не сохраненные изменения. Это поведение отличается от поведения метода Workbook.Close в Excel.
Да, был не прав, проглядел эту часть.
Собственно, никогда не закрывал просто так, если вносил какие-то изменения. Всегда сначала делал сохранение, поэтому даже не предполагал такое поведение Calc.
Век живи - век учись...
Спасибо!

almaster13

А как можно наиболее просто очистить лист макросом от содержимого? Способ выделить и удалить выдает меню, в котором нужно нажать ОК:

selectSheetByName(oDoc, "График блок 1")
  dispatchURL(oDoc,".uno:SelectAll")
  dispatchURL(oDoc,".uno:Delete")

А хотелось бы, чтобы лист очищался перед вставкой данных молча!

Sirius34

Цитата: almaster13 от 31 октября 2024, 14:20А хотелось бы, чтобы лист очищался перед вставкой данных молча!
Я делаю примерно так
oDelRng = oSht.getCellRangeByPosition(0, 0, oLastCol(oSht), oLastRow(oSht))
oDelRng.ClearContents(1 OR 2 OR 4 OR 8 OR 16 OR 32 OR 64 OR 128 OR 256 OR 512)
Единственное, что нужно - найти (вычислить) oLastCol и oLastRow.
У меня специальные функции сделаны, чтобы не приходилось каждый раз километр кода писать.
Но можно предварительно сделать
args1(0).Name = "Sel"
args1(0).Value = false
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args1())
и считать текущую позицию.
Здесь уже небольшой простор для манёвра

Sirius34

В принципе, можно и так сделать

Args1(0).Name = "ToPoint"
Args1(0).Value = "A1"
dispatcher.executeDispatch(CCF, ".uno:GoToCell", "", 0, Args1())

Args2(0).Name = "Sel"
Args2(0).Value = True
dispatcher.executeDispatch(CCF, ".uno:GoToEndOfData", "", 0, Args2())

Args3(0).Name = "Flags"
Args3(0).Value = "R"
dispatcher.executeDispatch(CCF, ".uno:DeleteCell", "", 0, Args3())

bigor

Цитата: Sirius34 от 31 октября 2024, 16:09oDelRng.ClearContents(1 OR 2 OR 4 OR 8 OR 16 OR 32 OR 64 OR 128 OR 256 OR 512)
эквивалентно oDelRng.ClearContents(1023)
А диапазон можно с избытком задать фиксированный

Поддержать наш форум можно здесь

almaster13

Прошу пояснить еще один вопрос по выложенному в листинге макросу. Он замечательно работает, если запускать его из окна отладки макросов, но при привязке его к кнопке на странице листа файла, не копирует графики и ошибку тоже не выдает. Может быть, есть какой то секрет настройки самой кнопки или это недостаток макроса?

bigor

Цитата: almaster13 от  1 ноября 2024, 08:40вопрос по выложенному в листинге макросу
к макросу нужен ваш файл.
Поддержать наш форум можно здесь

almaster13

Цитата: bigor от  1 ноября 2024, 13:24
Цитата: almaster13 от  1 ноября 2024, 08:40вопрос по выложенному в листинге макросу
к макросу нужен ваш файл.


Вот два файла. Файл пояснительная записка с помощью макроса должен копировать 4 листа из файла Plan-2024-Astra. Макрос и кнопка в файле пояснительной записки. Макрос из окна отладки макросов работает, с кнопки оставляет страницы пустыми. Ошибок не выдается.