Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

11 Август 2022, 01:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Адаптировать макрос Excel под LibreOffice Calc  (Прочитано 873 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Keny
Новичок
*
Offline Offline

Сообщений: 4


« Стартовое сообщение: 17 Май 2022, 23:17 »

Доброе время суток.
На работе неожиданно перешли с 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
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 976


WWW
« Ответ #1: 18 Май 2022, 14:12 »

Цитата:
"Вы будете долго смеяться" (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
Новичок
*
Offline Offline

Сообщений: 4


« Ответ #2: 18 Май 2022, 17:07 »

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

Сообщений: 4


« Ответ #3: 26 Май 2022, 22:05 »

Доброе время суток.
Мне подкинули ещё одну задачку: при нажатии на копку "Печать документа" на листе "Ввод данных" должны распечататься определенные листы (к примеру лист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
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 976


WWW
« Ответ #4: 27 Май 2022, 14:02 »

"Родной" аналог может быть таким:
Код:
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), то будет отпечатан только текущий лист.
« Последнее редактирование: 27 Май 2022, 14:14 от sokol92 » Записан

Владимир.
Keny
Новичок
*
Offline Offline

Сообщений: 4


« Ответ #5: 27 Май 2022, 21:47 »

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

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

Огромное спасибо!!!
Записан
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 976


WWW
« Ответ #6: 27 Май 2022, 21:49 »

Успехов!
Записан

Владимир.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!