Срипт печать текущего листа

Автор terminal, 28 июня 2017, 11:33

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

terminal

Сделал скрипт (данные - транспортировать в другой лист, печать) но не могу вписать в скрипт сразу печать текущего листа, попадаю в меню печати, что не совсем удобно

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())   


JohnSUN

Привет, terminal, и добро пожаловать на форум!
Согласен, это совсем неудобно.
Только скажи сначала - а как ты транспонируешь данные в другой лист? Покажешь файл со всем скриптом?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

terminal

файл - это база ремонтов, дата, клиент, телефон, стройство, модель, поломка (все на одном листе, впысываеться строками)
потом транспортирую в квитанцию (вертикальная) с последующей печатью
сделал макрос, кнопку но есть еще проблема с выбором листа и страницы (неудобно)

вот и вопрос как сделать скрипт печати текущего листа

JohnSUN

Сделать-то его не очень сложно - не раз делалось. Например, перебрать все листы книги, запоминая их статус видимости, затем скрыть все, кроме печатаемого, дать команду печати и восстановить предыдущую видимость... Или так, как у Питоньяка в  6.24. Print a Calc range

Но для такой задачи уже найдено альтернативное решение - область печати назначается только на квитанцию: кто бы и как бы не пытался напечатать всю книгу всегда будет получать квитанцию. Тогда и квитанцию можно заполнить не макросом, а одними только формулами VLOOKUP().
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

terminal

перебрать все листы книги, запоминая их статус видимости, затем скрыть все, кроме печатаемого - как это сделать?

JohnSUN

Ну, в далёком 2008-ом это делалось так. С тех пор мало что изменилось (в этой области)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Rafik

Вроде, как бы ThisComponent.print(Array()) выводит на печать активный лист. Если требуется задать количество экземпляров, конкретные страницы или выделенную часть,  то можно вместо Array() указать описание этих параметров в формате com.sun.star.beans.PropertyValue

terminal

Вот скрипт
все равно выводит все листы

REM  *****  BASIC  *****

sub prr
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "aTableName"
args2(0).Value = "ремонти"

dispatcher.executeDispatch(document, ".uno:Hide", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$C$6:$C$19"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "SVD"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = true
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args4())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "aTableName"
args6(0).Value = "ремонти"

dispatcher.executeDispatch(document, ".uno:Show", "", 0, args6())


end sub

Rafik

"Ничего не понимаю" (с), "то ли лыжи не едут..."(с). Короче, не понял зачем куда-то копировать-вставлять и оттуда печатать. Не проще ли сделать 1:1 как у Питоньяка (см. совет от JohnSUN). Пример  6.24. Print a Calc range задает диапазон печати и выводит на принтер. Простенько и надежно.

terminal

когда так делаю, все рано макрос попадает в меню принтера

Rafik

Цитата: terminal от  2 июля 2017, 11:05
когда так делаю, все рано макрос попадает в меню принтера
Попробуй вместо
Цитата: terminal от 30 июня 2017, 09:19dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())
поставить ThisComponent.print(Array()) и никакого диалога принтера не будет.У Питоньяка в 6.24 стоит именно эта команда, а не вызов диспетчера (как в твоем макросе). ThisComponent.print(Array()) без всяких диалогов "втихую" выводит на принтер, который привязан к документу. Для привязки принтера: Файл - Настройки принтера и сохранить.

terminal

с принтером вышло, но теперь другая проблема, пишу скрипт чтобы печатоло только 1 страницу, всранво печатает все

Rafik

Попробуй так:Sub PrintDoc1(oDoc As object,cPages As String,nCount As Integer)
' Параметры: Ссылка_на_документ, страницы_для_печати, кол-во_экземпляров
' страницы_для_печати: пустая_строка "" - все,
' страницы перечисляются через запятую, диапазоны страниц — через тире
' например "1,3-6" - первая и с третьей по шестую
Dim Props(2) As New com.sun.star.beans.PropertyValue
Props(0).Name="Pages"
Props(0).Value=cPages
Props(1).Name="CopyCount"
Props(1).Value=nCount
Props(2).Name = "Collate"
If nCount = 1 Then ' Включить разбор по копиям, если кол-во экз. <>1
    Props(2).Value = False
Else
    Props(2).Value = True
End If
oDoc.Print(Props())
End Sub

terminal

не работает и все

другой вопрос
таблица : вводим фамилию в одну ячейку, в следующую - телефон
как сделать чтобы при повторном вводе фамилий (другой день) высвечивался номер телефона клиента в следующей ячейке?


economist

Тут нужно написать несложную формулу с функцией =ВПР() (или =VLOOKUP() если это OpenOffice)

Данная функция обязательна к пониманию и изучению, это самая важная функция эл. таблиц.
Её незнание - у нас означает "непрохождение" ежегодной аттестации и влечет за собой увольнение. В принципе только такой подход позволил уйти от "мартышкиного" труда. Кол-во уволенных по данной "статье" за 15 лет - 3.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...