Макрос для печати

Автор imitator, 30 марта 2018, 14:22

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

imitator

Добрый день.
Когда пользовались Экселем, то там у нас был макрос на скрытие при печати пустых строк, а потом автоматически раскрывало их обратно

Перешли на OpenOffice Calc, скрипты с Экселя не работают. Если есть возможность то помогите.
Нужен скрипт, который при печати будет автоматически скрывать пустые строки в диапазоне A16:A24, после чего должно отправится на печать 2 странички, после печати скрытые строки должны вернутся.

Пример Макроса в Экселе


Public avArr(), avCngArr()
Sub HideRows()
    Dim bChange As Boolean
    Dim lr As Long, lc As Long
    Dim vTmp
    Dim x(), i&, hr As Range: Application.ScreenUpdating = 0
avCngArr = ActiveSheet.UsedRange.Value
    On Error Resume Next
    vTmp = avArr(1, 1)
    If Err.Number = 0 Then
        For lr = 1 To UBound(avArr, 1)
            For lc = 1 To UBound(avArr, 2)
                If avCngArr(lr, lc) <> avArr(lr, lc) Then
                    bChange = 1
                    Exit For
                End If
            Next lc
            If bChange Then Exit For
        Next lr
    Else
        bChange = 1
    End If
    If bChange Then
        avArr = ActiveSheet.UsedRange.Value
        With Range([B1], Cells(Rows.Count, 2).End(xlUp))
x = .Value
For i = 3 To UBound(x)
If x(i, 1) = Empty Then
If hr Is Nothing Then Set hr = .Cells(i) Else Set hr = Union(hr, .Cells(i))
End If
Next i
.EntireRow.Hidden = False
End With
If Not hr Is Nothing Then hr.EntireRow.Hidden = True
Application.ScreenUpdating = 1
        ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=2
    End If
Call HideRows2
End Sub

Sub HideRows2()
Dim x(), i&, hr As Range: Application.ScreenUpdating = 0
With Range([A1], Cells(Rows.Count, 1).End(xlUp))
x = .Value
For i = 3 To UBound(x)
If x(i, 1) = Empty Then
If hr Is Nothing Then Set hr = .Cells(i) Else Set hr = Union(hr, .Cells(i))
End If
Next i
.EntireRow.Hidden = False
End With
If Not hr Is Nothing Then hr.EntireRow.Hidden = True
Application.ScreenUpdating = 1
End Sub


Во вложении пример таблички

bigor

#1
в A16:A24 нет пустых ячеек, сделал проверку по b16:b24

ps нужно прописать в макросе имя принтера, на который будет осуществляться печать

PrintName = "Foxit Reader PDF Printer"
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

imitator

#2
Цитата: Bigor от 30 марта 2018, 15:16
ps нужно прописать в макросе имя принтера, на который будет осуществляться печать

PrintName = "Foxit Reader PDF Printer"
А если принтер стоит по умолчанию, то его как прописать? или надо прописывать конкретно название? Просто если файлом будут пользоваться несколько человек и у них разные сетевые принтеры, то тогда как?

-----

Так же макрос скрывает все пустые строчки по столбцу В а не в выбранном диапазоне, Хотя в Екселе так же было.
Но есть еще вопрос, если в ячейке стоит формула, то можно ли при определенном результате эту строку не печатать (скрыть)? например результат слово  ERROR?

А вообще спасибо, это то что надо, только вот маленькие но есть.  :beer:

bigor

Вот с принтером по умолчанию.

И несколько более тормозной, но работающий именно с указанным диапазоном, и скрывающий в том числе ячейки с формулами (b17)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

bigor

Цитата: imitator от 30 марта 2018, 14:42например результат слово  ERROR
скорее всего у вас нет обработки ошибок, смотрите iferror.
Если error все же нужна, то допишите в условиях второй and и проверку на error
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

imitator

Цитата: Bigor от 30 марта 2018, 17:50
Цитата: imitator от 30 марта 2018, 14:42например результат слово  ERROR
скорее всего у вас нет обработки ошибок, смотрите iferror.
Если error все же нужна, то допишите в условиях второй and и проверку на error
Нет Error не нужен, то просто так для понимания.
Спасибо огромное.

bigor

Ошибся
допишите в условиях второй and or
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

imitator

А еще такой вопрос, может кто знает, как сделать так, что бы рисунок в таблицах не выводился на печать? Например в Екселе была функция "выводить на печать", тут я найти не могу.

rami

Зайдите в соответствующий стиль страницы (по умолчанию это Базовый), на вкладке Лист есть "птички" что печатать, а что нет.

imitator

Цитата: rami от 30 марта 2018, 18:35
Зайдите в соответствующий стиль страницы (по умолчанию это Базовый), на вкладке Лист есть "птички" что печатать, а что нет.
Пасипки, и последний вопрос, если добавлять кол-во распечатанных копий (например 4 шт) то где и как в макросе это добавить?

bigor

Цитата: imitator от 30 марта 2018, 17:09кол-во распечатанных копий (например 4 шт) то где и как в макросе это добавить?

Раз
Dim oOpt (1) as new com.sun.star.beans.PropertyValue

Два
oOpt (1).Name = "CopyCount" ' число копий '
oOpt (1).Value = 4 '
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

imitator

Цитата: Bigor от  1 апреля 2018, 22:41

Раз
Dim oOpt (1) as new com.sun.star.beans.PropertyValue

Два
oOpt (1).Name = "CopyCount" ' число копий '
oOpt (1).Value = 4 '

Хм, а я добавил еще строчки
ThisComponent.Print(oOpt()) Или так лучше не делать?
Для 4 копий например


...
ThisComponent.Print(oOpt())
ThisComponent.Print(oOpt())
ThisComponent.Print(oOpt())
ThisComponent.Print(oOpt())
...

bigor

Как у тебя, это примерно тоже, что ты 4 раза нажмешь кнопку печать, как у меня один раз нажал печать и выбрал 4 копии.
Что у тебя что у меня отпечатает 4 копии, но мой вариант должен быстрее это сделать :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

imitator

Цитата: Bigor от  1 апреля 2018, 23:46
но мой вариант должен быстрее это сделать :)
Вот оно что, пасипки. Скорость это тоже хорошо.