макрос для печати листа на основе диапазона значений

Автор Morozbl4, 10 октября 2018, 17:34

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

Morozbl4

Уважаемые форумчане, здравствуйте!
Необходима помощь ввиду полной некомпетенции в программировании (опыт pascal 25 лет назад это не опыт  :roll:)
У меня есть лист, который при изменении значения в ячейке условно E5, автоматически заполняет определенные поля в sheet1, выполняет поиск и возвращает значения из таблицы на другом листе - sheetTable). Поэтому после изменения ячейки E5, sheet1 в основном готов к печати.

На просторах интернета нашел следующий макрос, работающий в Excel:
ЦитироватьSub Fill_Print()
    Dim Rng As Range, r As Range
    Dim sh1 As Worksheet, shTable As Worksheet

    Set sh1 = Sheets("Sheet1")
    Set shTable = Sheets("sheetTable")
    Set Rng = Selection

    For Each r In Rng
     sh1.Range("E5").Value = r.Value
     sh1.PrintOut
    Next r
End Sub
Помогите, пожалуйста, переписать его для LibreOffice.
Спасибо!

bigor

Добрый день.
А не могли бы Вы приложить файл с примером, работающим в Excel. Мне кажется приведенный макрос не соответствует описанию задачи.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Цитата: Bigor от 11 октября 2018, 09:35
Мне кажется приведенный макрос не соответствует описанию задачи.

Почему не соответствует? Макрос в цикле меняет E5 на значения из выделенного диапазона, и при каждом изменении распечатывает Sheet1...
С уважением,
Михаил Каганский

bigor

Из описания он должен выполнять гораздо больше действий :) но если это финальная часть, то она должна в LO работать с Option VBASupport 1. А если переписывать под SB, то наверно нужно все переписать.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Я задачу понял так:

"У меня уже есть книга с листом, в котором формулы завязаны на E5 так, что при изменении её всё нормально пересчитывается, и лист готов к печати. Теперь мне нужно распечатать этот лист при последовательном внесении в E5 значений, которые заданы где-то на другом листе в выделенном диапазоне."

Я попробовал с VBASupport - код не ругается, но PrintOut выдаёт на печать не свой объект, а текущий лист...
С уважением,
Михаил Каганский

bigor

Цитата: mikekaganski от 11 октября 2018, 08:39Я попробовал с VBASupport - код не ругается, но PrintOut выдаёт на печать не свой объект, а текущий лист...
печатает активный лист. Как вариант перед sh1.PrintOut  вставить sh1.Activate
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Morozbl4

Цитата: mikekaganski от 11 октября 2018, 08:39"У меня уже есть книга с листом, в котором формулы завязаны на E5 так, что при изменении её всё нормально пересчитывается, и лист готов к печати. Теперь мне нужно распечатать этот лист при последовательном внесении в E5 значений, которые заданы где-то на другом листе в выделенном диапазоне."
Именно так. При смене значени Е5 выдергиваются значения с других листов и формируется некий протокол-отчет на одном листе. Просто вручную отправлять на печать порядка 1500 листов довольно долго и муторно...

Цитата: mikekaganski от 11 октября 2018, 08:39Я попробовал с VBASupport - код не ругается, но PrintOut выдаёт на печать не свой объект, а текущий лист...
Именно так. Печатает абсолютно весь лист. А там много(

Morozbl4

Цитата: mikekaganski от 11 октября 2018, 08:39Я попробовал с VBASupport - код не ругается, но PrintOut выдаёт на печать не свой объект, а текущий лист...
Есть еще одна проблемка при использовании VBASupport - адовое подвисание LO и периодический краш

mikekaganski

Цитата: Morozbl4 от 11 октября 2018, 11:09
Цитата: mikekaganski от 11 октября 2018, 08:39Я попробовал с VBASupport - код не ругается, но PrintOut выдаёт на печать не свой объект, а текущий лист...
Именно так. Печатает абсолютно весь лист. А там много(

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

bigor

Если у вас 1500 листов, то подвисание и краш может быть из-за очереди принтера.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Morozbl4

Цитата: mikekaganski от 11 октября 2018, 11:12
Цитата: Morozbl4 от 11 октября 2018, 11:09
Цитата: mikekaganski от 11 октября 2018, 08:39Я попробовал с VBASupport - код не ругается, но PrintOut выдаёт на печать не свой объект, а текущий лист...
Именно так. Печатает абсолютно весь лист. А там много(
Хм... а если Вы работаете на одном листе, и на этом листе есть не только то, что Вам надо напечатать, но и другое - то что Вы ожидаете при распечатке? Попробуйте задать диапазон для печати.

Я этот макрос с добавлением одной строчки тестировал в Excel и все работало нормально... ( Печатался именно тот лист который мне нужен с подставлением соответсвующих значений в ячейки с соседних листов. т.е. я на первом листе выделяю диапазон ячеек, эти ячейки вставляются в по очереди в ячейку Е5 отчета, в остальные ячейки подставляются значения из указанных листов и вуаля!

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Morozbl4

Цитата: Bigor от 11 октября 2018, 09:23Про нужный лист посмотрите ответ #5
Спасибо, попробую, несколько позже отпишусь!

Morozbl4

Всем огромное спасибо!
Все вроде как работает, отдельное спасибо Bigor!
Периодически валится LO, но, это наверное больше его проблема)

bigor

#14
Вот на скорую руку на  SB с областью печати
sub SB_print()
 Dim oOpts(0) as New com.sun.star.beans.PropertyValue
 Dim oRanges(0) As New com.sun.star.table.CellRangeAddress
 
 sh1=ThisComponent.Sheets(0)
 shTable=ThisComponent.Sheets(1)
 oSelection = ThisComponent.CurrentSelection()


oRanges(0).Sheet = 0
oRanges(0).StartColumn = 0 : oRanges(0).StartRow = 0 'A1
oRanges(0).EndColumn = 5 : oRanges(0).EndRow = 5 'f6
ThisComponent.CurrentController.setActiveSheet(sh1)
ThisComponent.CurrentController.getActiveSheet().setPrintAreas(oRanges())
oOpts(0).Name = "Wait"
oOpts(0).Value = True

  For i =oSelection.RangeAddress.StartRow To oSelection.RangeAddress.EndRow
    sh1.getCellByPosition(4,4).Value = shTable.getCellByPosition(oSelection.RangeAddress.StartColumn,i).Value
   
    ThisComponent.Print(oOpts())
   
   Next
End Sub


ps по ответу #5 строчку sh1.Activate лучше вставить до начала цикла
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут