Адаптировать макрос Excel под LibreOffice Calc

Автор Keny, 17 мая 2022, 23:17

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

Keny

Доброе время суток.
На работе неожиданно перешли с Excel на LO. Не все сотрудники готовы каждый раз при открытии файла "подвязывать" макросы к кнопкам. Большую часть макросов мне уже удалось адаптировать с помощью "просторов интернета" (я не специалист в области программирования), а один (пока один) мне не поддается.
Не могли бы вы помочь переписать  этот макрос для  LO версии 7.3.2.2 (x64)?

Option VBASupport 1
Sub Макрос2()
Sheets("ИНФОЛИСТЫ").Select
    PalletsNumber = Sheets("Данные").Cells(4, 3).Value + 1
    ActiveWindow.SelectedSheets.PrintOut From:=1, To:=PalletsNumber, Copies:=1, Collate _
        :=True
    Sheets("Данные").Select
End Sub

Заранее спасибо.

sokol92

Цитировать"Вы будете долго смеяться" (c)
но данный конкретный макрос работает без изменений и в LibreOffice.

"Родной" макрос может быть таким:

Sub TestPrint
  Dim oDoc, oSheet
  Dim props(1) As New com.sun.star.beans.PropertyValue
  oDoc=ThisComponent
  oSheet=oDoc.Sheets.GetByName("ИНФОЛИСТЫ")
  oDoc.CurrentController.setActiveSheet oSheet
  props(0).Name="Pages"
  props(0).Value="1-" & (oDoc.Sheets.GetByName("Данные").getCellByPosition(2,3).Value + 1)
  props(1).Name="Wait"
  props(1).Value=True
  oDoc.Print props
  oDoc.CurrentController.setActiveSheet oDoc.Sheets.GetByName("Данные")   
End Sub
Владимир.

Keny

Да, макрос Excel работает, но файл каким-то образом вечно "ломают" (пришлось снять пароль, стали сохранять непонятно как, хотя было сказано "НЕ СОХРАНЯТЬ"). Приходилось постоянно корректировать.
Надеюсь теперь проблем не будет.
Огромное спасибо.
Переназначила макросы, сохранила в родном формате  - всё работает.

Keny

Доброе время суток.
Мне подкинули ещё одну задачку: при нажатии на копку "Печать документа" на листе "Ввод данных" должны распечататься определенные листы (к примеру лист3, лист5 и листы 8-9). В Excel у меня на этот случай был макрос:

Sub PrintReg
Sheets(Array("Лист3", "Лист5", "Лист8", "Лист9")).Select
    Sheets("Ввод данных").Activate
    ActiveWindow.SelectedSheets.PrintOut Copies:=4, Collate:=True
End Sub

При сохранение в формате .xlsm макрос "теряется".
Хотелось бы его переписать под "родной" формат. Попытки сделать это самой не увенчались успехом.

Заранее спасибо.

sokol92

#4
"Родной" аналог может быть таким:
Sub TestPrint2
Dim aPrn(2) as new com.sun.star.beans.PropertyValue
Dim aSel(0) as new com.sun.star.beans.PropertyValue

aSel(0).Name="Tables"
aSel(0).Value=Array(2, 3)      ' индексы листов для печати (нумерация от 0)
With createUnoService("com.sun.star.frame.DispatchHelper")  
   .executeDispatch(ThisComponent.CurrentController.Frame, ".uno:SelectTables", "", 0, aSel)
End With  

aPrn(0).Name  = "Wait"        ' ожидать пока напечатается
aPrn(0).Value = True
aPrn(1).Name  = "CopyCount" ' количество экземпляров
aPrn(1).Value = 2
aPrn(2).Name  = "Collate"    ' разобрать по экземплярам
aPrn(2).Value = True

ThisComponent.Print(aPrn())
End Sub


Обратите внимание, что мы указываем индексы (от 0) листов, а не их имена. Узнать индекс листа по его имени можно, например, так:

sheetIndex=ThisComponent.Sheets.getByName("Sheet4").RangeAddress.Sheet

Еще один нюанс. В указанном выше примере отпечатаются листы с индексами 2 и 3, а также лист, который является текущим (выделенным) на начало выполнения макроса. Если это нежелательно, то нужно до выполнения макроса выделить лист, который принадлежит множеству листов для печати.

И еще. Если документ в момент старта макроса находится в режиме предварительного просмотра (Print Preview), то будет отпечатан только текущий лист.
Владимир.

Keny

Дополнила двумя строчками:

      oDoc = Thiscomponent
      oDoc.CurrentController.setActiveSheet oDoc.Sheets.GetByName("Ввод данных")
и "вуаля" - всё работает.

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

sokol92

Владимир.