Страницы: 1
RSS
Печать UserForm из VBA
 
Добрый день.

Нашел вот такой вот код для выбора принтера и печат, но он заточен под диапозон или лист, а я хочу печатать нужны UserForm, а точнее выбирать между печатью и сохранением в PDF.

Что необходимо подправить, чтобы все заработало?
Вот ссылка на источник ссылка
Код
Option Explicit

Public sNowPrinter As String

Sub ChangePrinter()
    sNowPrinter = "Set"
    Dim v, s
    s = Application.ActivePrinter
        v = Application.Dialogs(xlDialogPrinterSetup).Show
     If v = True Then
        sNowPrinter = Application.ActivePrinter
    End If
    Application.ActivePrinter = s
End Sub

Function DoPrint(Optional rr As Range = Nothing, Optional lCopies As Long = 1)
    Dim sActPrinter As String
      If sNowPrinter = "" Or sNowPrinter = "Set" Then
                Call ChangePrinter
               If sNowPrinter = "Set" Then
            If MsgBox("Не выбран принтер для печати. Использовать установленный в качестве активного", vbCritical + vbYesNo) = vbNo Then
                Exit Function
            End If
            sActPrinter = Application.ActivePrinter
        Else
            sActPrinter = sNowPrinter
        End If
    End If
  If rr Is Nothing Then
                ActiveSheet.PrintOut Copies:=lCopies, ActivePrinter:=sActPrinter
    Else
       
        rr.PrintOut Copies:=lCopies, ActivePrinter:=sActPrinter
    End If
  End Function
 
http://www.planetaexcel.ru/forum/index.php?FID=1&MID=504167&PAGE_NAME=message&am...
Согласие есть продукт при полном непротивлении сторон
 
Посмотрю, что там есть.
Использую для печати PrintForm, но данная функция отправляет на принтер, который стоит по умолчанию, а я хочу выбирать принтеры. Вот в этом вся беда.
 
Т.к. приведенный код мой - то могу подсказать небольшой финт. Просто вместо диапазона отправляйте на печать форму, засунув это в функцию DoPrint:
Код
'по нажатию кнопки печатаем форму
Private Sub CommandButton1_Click()
    DoPrint
End Sub

Function DoPrint()
    Dim sActPrinter As String
    If sNowPrinter = "" Or sNowPrinter = "Set" Then
        Call ChangePrinter
        If sNowPrinter = "Set" Then
            If MsgBox("Не выбран принтер для печати. Использовать установленный в качестве активного", vbCritical + vbYesNo) = vbNo Then
                Exit Function
            End If
            sActPrinter = Application.ActivePrinter
        Else
            sActPrinter = sNowPrinter
        End If
    End If
    Me.printform
End Function
если надо распечатать PDF, то просто выбираем встроенный в офис виртуальный PDF(или XPS) принтер.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
если надо распечатать PDF, то просто выбираем встроенный в офис виртуальный PDF(или XPS) принтер.
Не работает!
PrintForm отправляет на тот принтер который выбран по умолчанью в Windows, а ChangePrinter меняет принтер только в настройках Excel, он игнорируется так как печать идет на прямую из VBA
 
Видимо, надо смотреть в сторону SetPrinter (API). Если с API не работали до этого, то не думаю, что это лучший вариант.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ну и ладно. Просто вывожу на экран сообщение о том какой принтер сейчас выбран по умолчанию.
 
Добрый день,

тоже решал вопрос с печатью формы, вот слепил :) из нескольких кусков, может кому пригодится
Код
Sub PrintFm()
v = Application.Dialogs(xlDialogPrinterSetup).Show ' диалого выбора принтера
If v = True Then
        strPrinterName = Application.ActivePrinter ' если принтер выбран запоминамем выбор
Else: Exit Sub ' если отмена то выходим
End If

Set wshPrint = CreateObject("WScript.Shell") ' получаем принтер по умолчанию
Prn = wshPrint.RegRead("HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device")
tmparr = Split(Prn, ",")
DefPrint = tmparr(LBound(tmparr)) ' получаем имя принтера по умолчанию

Set WshNetwork = CreateObject("Wscript.Network")
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set Printers = objWMI.ExecQuery("Select * From Win32_Printer")

For Each printer In Printers
    sPrName = Left(strPrinterName, Len(printer.Name)) ' для корректного сравнения обрезаем имя до кол-ва знаков переменной printer.Name (убираем (Ne02:)
    'MsgBox (s & ",  " & printer.Name)
 If printer.Name = sPrName Then
  WshNetwork.SetDefaultPrinter sPrName ' устанавливаем выбранный принтер принтером по умолчанию
  Exit For
 End If
Next

With Print_A4 'печатаем форму
    h = .Height
    .Height = 860
    .PrintForm
    .Height = h
End With


WshNetwork.SetDefaultPrinter DefPrint ' восстанавливаем принтер по умолчанию
    
End Sub
Изменено: YuryK80 - 08.09.2018 13:12:42
Страницы: 1
Наверх