Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2012, 00:24   #21
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Ну что же сегодня с помощью Hugo121, удалось получить приемлемое решение, которое завтра начну развивать. А пока опишу чего добился:
Был написано макрос, который выводит указанные листы в один pdf файл.
Макрос в работе использует библиотеку Ghostscript, а так же требует установить виртуальный принтер (на базе этой же библиотеки). Теперь по порядку:
1. Качаем библиотеку и устанавливаем виртуальный принтер как описано здесь. Причем нужно настроить виртуальный принтер так что бы он всегда печатал всегда в один файл. Пусть это будет "техническим" принтером.
2. Теперь в нужную книгу переносим этот код:
Код:
Sub ПечатьPDF()
    ПринтерPDF = "PDF Printer"
    'Запоминаем активный принтер, чтобы после выполнения кода был нужный принтер.
    Принтер = Application.ActivePrinter
    Temp = "c:\gs\temp\"
    'Список листов для печати.
    Листы = "Лист1||Лист2||Лист3"
    'Очищаем темповскую папку от возможных остатков предыдущей печати, что бы не было конфликтов имен.
    Kill Temp & "*.pdf"
    'Создаем pdf для каждого листа.
    For n = 1 To words(Листы, "||")
        Sheets(word(Листы, n, "||")).PrintOut ActivePrinter:=ПринтерPDF
        'Ждем когда сможем переименовать темповский файл.
        Do
            DoEvents
            DoEvents
            On Error Resume Next: Err.Clear
            Name Temp & "!tmp.pdf" As Temp & "Лист" & n & ".pdf"
        Loop Until Err = 0
        Список = Список & " " & Temp & "Лист" & n & ".pdf"
    Next n
    'Объединяем все листы в один pdf.
    Shell "c:\gs\gs8.70\bin\gswin32c.exe -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=" & Temp & "combinedpdf.pdf " & Список
    'Возвращаем на место прежний активный принтер.
    Application.ActivePrinter = Принтер
End Sub

Function word(str, Number, Optional Разделитель = "") As String
'Функция возвращает n-ное слово в указанной строке. Аналог команды Rexx.
'На входе:
'str           - Строковая переменная.
'Number        - Номер слова.
'Разделитель   - Символ разделитель. При отсутствие за разделитель принимаются пробел и таб.
'На выходе:
'word          - n-ное слово или пустую строку если слова с таким номером нет.

    If Number > words(str, Разделитель) Then
            word = ""
    Else
        If Разделитель = "" Then
            word = Split(Application.Trim(Replace(str, vbTab, " ")), " ")(Number - 1)
        Else
            word = Application.Trim(Replace(Split(Application.Trim(Replace(Replace(str, " ", Chr(160)), Разделитель, " ")), " ")(Number - 1), Chr(160), " "))
        End If
    End If
End Function

Function words(str, Optional Разделитель = "") As Long
'Определяет количество слов в строковой переменной. Аналог команды Rexx.
'На входе:
'str           - Строковая переменная.
'Разделитель   - Символ разделитель. При отсутствие за разделитель принимаются пробел и таб.
'На выходе:
'words         - Количество слов в переменной.
    If Разделитель = "" Then
        words = UBound(Split(Application.Trim(Replace(str, vbTab, " ")), " ")) + 1
    Else
        words = UBound(Split(Application.Trim(Replace(Replace(str, " ", Chr(160)), Разделитель, " ")), " ")) + 1
    End If
End Function
На забываем проверить: имя принтера (PDF Printer), пути к вашей версии библиотеки (c:\gs\gs8.70\bin\), пути к TEMP папке (c:\gs\temp\), имя временного файла (!tmp.pdf), а также указать свои имена листов для печати.
Собственно все. Можно запускать печать. :))
Разумеется все это пока прототип, поэтому изменять и настраивать макрос по вкусу.
С уважением, Алексей.

Последний раз редактировалось tae1980; 26.02.2012 в 00:31.
tae1980 вне форума Ответить с цитированием
Старый 26.02.2012, 10:12   #22
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> Передо мной стоит задача: есть книгу с n количеством листов, нужно распечатать любое количество листов в произвольном порядке в один pdf.

Я для себя такую задачу решил с помощью FinePrint (он установлен принтером по умолчанию). Причем в более общем виде: собрать в одно задание печати произвольное количество листов из разных приложений. Потом отправить на принтер - реальный или PDF.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 26.02.2012, 10:51   #23
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Я для себя такую задачу решил с помощью FinePrint (он установлен принтером по умолчанию). Причем в более общем виде: собрать в одно задание печати произвольное количество листов из разных приложений. Потом отправить на принтер - реальный или PDF.
"Где же ты был раньше?" (с) :))
Может ли он работать по фону, то есть можно ли управлять всеми параметрами и процессами из VBA?
Например, можно ли написать макрос который одним действием распечатает любое количество листов, в любой последовательности и сохранить результат по автоматически собранному пути (пользователь при этом должен нажать только одну кнопку)? Было бы интересно посмотреть на код какого либо примера.
С уважением, Алексей.

Последний раз редактировалось tae1980; 26.02.2012 в 10:56.
tae1980 вне форума Ответить с цитированием
Старый 26.02.2012, 18:19   #24
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> можно ли управлять всеми параметрами и процессами из VBA?

Не знаю, не пробовал. Если погуглить "fineprint api", кое-что находится, например
http://fineprint.chat.ru/fpdk.html
www.context-gmbh.de/bin/fpdk.pdf
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 26.02.2012, 19:37   #25
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
> можно ли управлять всеми параметрами и процессами из VBA?
Не знаю, не пробовал. Если погуглить "fineprint api", кое-что находится, например
http://fineprint.chat.ru/fpdk.html
www.context-gmbh.de/bin/fpdk.pdf
Интересный материал, стоит присмотреться подробнее. Но платное в конченом счете.
Есть пара идей для развитии печати (например выводить на разные принтера чб и цветную печать для экономии цветного тонора). Буду разбираться потихоньку дальше, найденный подход на текущий момент закрыл срочность. Одним из его плюсов могу назвать универсальность: он будут работать в любой ОС, на любом языке программирования.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PDF двухсторонняя печать VladimirVB Microsoft Office Word 3 23.11.2010 12:23
печать листов excel ара Помощь студентам 10 07.04.2010 10:12
печать на PDF принтере Frost.sapr Мультимедиа в Delphi 1 12.10.2008 23:17
печать нескольких листов checkbox Microsoft Office Excel 2 16.01.2008 00:50