1

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

Добрый день!
Есть макрос для печати

Sub a_Printing()
 Selection.EndKey Unit:=wdStory
pn = Selection.Information(wdActiveEndPageNumber)

For i = 1 To pn
x = ("" & i & "")
a = i Mod 2
 If a <> 0 Then y = MsgBox("Печать страницы " & i & " из " & pn & vbCrLf & "Вставьте лист" & vbCrLf & vbCrLf & "Продолжить?", 35, "Печать документа")
If a = 0 Then y = MsgBox("Печать страницы " & i & " из " & pn & vbCrLf & "Переверните страницу" & vbCrLf & vbCrLf & "Продолжить?", 35, "Печать документа")
Select Case y
Case 6 '''' Да
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
        wdPrintDocumentContent, Copies:=1, Pages:=x, PageType:=wdPrintAllPages, _
         ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _
        False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
        PrintZoomPaperHeight:=0
 Dialogs(wdDialogFilePrint).Show
Case 7 '''' Нет
Case 2 ' Отмена
   End
End Select
Next
End Sub

Строку  Dialogs(wdDialogFilePrint).Show применяю для запуска печати страницы( без применения идет считывание заданий в пам'ять принтера)

Нужно сделать то же самое, но следующим образом: диалог(MgBox) – ответ(да, нет, отмена) – выполнение(печать указанной страницы-одной страницы !!!) – снова диалог( в цикле), но все это без вызова окна диалога параметров печати.

Отредактировано admin (18.10.2010 17:31:12)

2

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

Советую вместо Show попробовать:

Application.Dialogs(wdDialogFilePrint).Execute

Параметры также можно ввести в диалог не открывая его.

Свойства диалога wdDialogFilePrint:
Background, AppendPrFile, Range, PrToFileName, From, To, Type, NumCopies, Pages, Order, PrintToFile, Collate, FileName, Printer, OutputPrinter, DuplexPrint, PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight, ZoomPaper.

Отредактировано Вождь (19.10.2010 06:35:17)

Макросы под заказ и готовый пакет - mtdmacro.ru

3

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

По поводу PrintOut. Для печати текущей страницы есть команда:

ActiveDocument.PrintOut Range:=wdPrintCurrentPage
Макросы под заказ и готовый пакет - mtdmacro.ru

4

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

Команда: Application.Dialogs(wdDialogFilePrint).Execute выполняет печать всего документа, а нужно постранично(т.е. нужно отправить на печать страницу-“х”(не текущую), открывается MsgBox, выбирается действие, повторяется цикл).
Для выполнения этого в диалоге настройки печати выбирается “отмена” – вот эту команду и нужно автоматизировать.

5

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

div85 пишет:

...Execute выполняет печать всего документа...

Нет. Эта команда соответствует нажатию кнопки "ОК" в диалоге печати, а что и как печатать задается параметрами (см. выше).

Пример печати со 2-ой по 3-ю страницы:

    With Application.Dialogs(wdDialogFilePrint)
        .Pages = "2-3"
        .Execute
    End With

То же, но с помощью PrintOut:

ActiveDocument.PrintOut Pages:="2-3"
Макросы под заказ и готовый пакет - mtdmacro.ru

6

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

Можно и так:  Application.PrintOut Range:=wdPrintFromTo, From:=2, To:=3
Но вопрос не в этом. В приведенном мною макросе нужно убрать появление диалога печати, либо программно нажать в этом диалоге “отмена”.
Повторюсь: открытие диалога печати вызвано тем, что нужно печатать по ОДНОЙ!!! странице, разделяя процесс печати выбором действия в  MsgBox
( без диалога печати – выбранные в MsgBox страницы считываются в память в цикле и печатаются все вместе подряд)

7

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

div85 пишет:

...нужно печатать по ОДНОЙ!!! странице...

По-моему получится то, что надо, если заменить в Вашем коде PrintOut  и Show на:

With Application.Dialogs(wdDialogFilePrint)
        .Pages = CStr(i)
        .Execute
End With

или на:

ActiveDocument.PrintOut Pages:=CStr(i)

Это что не работает?

Отредактировано Вождь (19.10.2010 12:48:23)

Макросы под заказ и готовый пакет - mtdmacro.ru

8

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

.Execute - выполнить. Печатается весь документ. Параметры печати не вводятся.
Если можно, скопируйте мой код и выполните( в документе для проверки по 1 слову на страницу) Сразу все будет видно. Попробуйте подредактировать для получения нужного эффекта.

9

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

Да, я неполный код привел. В обоих случаях надо указать, откуда брать параметры (Range) и признак немедленной печати (Background).

Полный рабочий код в двух вариантах:

Dim PN&, i&, Y&
Dim S$

    Selection.EndKey Unit:=wdStory
    PN = Selection.Information(wdActiveEndPageNumber)
    For i = 1 To PN
        If (i Mod 2) <> 0 Then
            S = "Вставьте лист"
        Else
            S = "Переверните страницу"
        End If
        S = "Печать страницы " & i & " из " & PN & vbLf & _
            S & vbLf & vbLf & _
            "Продолжить?"
        Y = MsgBox(Prompt:=S, _
                   Buttons:=vbYesNoCancel + vbQuestion, _
                   Title:="Печать документа")
        Select Case Y
            Case vbYes ' 6 - Да
                'ActiveDocument.PrintOut _
                    Background:=False, _
                    Range:=wdPrintRangeOfPages, _
                    Pages:=CStr(i)
                With Application.Dialogs(wdDialogFilePrint)
                    .Background = False
                    .Range = wdPrintRangeOfPages ' 4
                    .Pages = CStr(i)
                    .Execute
                End With
            'Case vbNo ' 7 - Нет
            Case vbCancel ' 2 - Отмена
               End
        End Select
    Next i
Макросы под заказ и готовый пакет - mtdmacro.ru

10

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

Спасибо! Все работает. Насчет (Range) все понятно, а (Background) я не доглядел, что  у меня - True

11

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

Если уж оптимизировать код, то у Вас ошибка - неверное чередование сообщений "Вставьте лист" и "Переверните страницу". Правильно так:

Dim PN&, i&, Y&
Dim S$
Dim P2 As Boolean

    Selection.EndKey Unit:=wdStory
    PN = Selection.Information(wdActiveEndPageNumber)
    P2 = False ' признак обратной стороны листа
    For i = 1 To PN
        If P2 Then
            S = "Переверните страницу"
        Else
            S = "Вставьте лист"
        End If
        S = "Печать страницы " & i & " из " & PN & vbLf & vbLf & _
            S & vbLf & vbLf & _
            "Продолжить?"
        Y = MsgBox(Prompt:=S, _
                   Buttons:=vbYesNoCancel + vbQuestion, _
                   Title:="Печать документа")
        Select Case Y
            Case vbYes ' 6 - Да
                'ActiveDocument.PrintOut _
                    Background:=False, _
                    Range:=wdPrintRangeOfPages, _
                    Pages:=CStr(i)
                With Application.Dialogs(wdDialogFilePrint)
                    .Background = False
                    .Range = wdPrintRangeOfPages ' 4
                    .Pages = CStr(i)
                    .Execute
                End With
                P2 = Not P2
            'Case vbNo ' 7 - Нет
            Case vbCancel ' 2 - Отмена
               End
        End Select
    Next i
Макросы под заказ и готовый пакет - mtdmacro.ru

12

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

Необходимость сообщения "Вставьте лист" и "Переверните страницу" субъективна.
В любом случае в последнем коде для правильной работы "P2 = Not P2" нужно вынести за пределы Select (в противном случае при печати к примеру со 2-й страницы и соответственно выборе в первом диалоге "нет" чередование сообщений становится неверным)

13

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

Ну так идея не моя smile Я правил код, а не задумку.

Правильнее выводить отдельное сообщение "Переверните страницу" после печати нечетных, а в запрос на печать ввести текст "Лицевая сторона"/"Обратная сторона" и т.п.

Макросы под заказ и готовый пакет - mtdmacro.ru