Нашел вот такой вот код для выбора принтера и печат, но он заточен под диапозон или лист, а я хочу печатать нужны 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
Посмотрю, что там есть. Использую для печати 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
тоже решал вопрос с печатью формы, вот слепил из нескольких кусков, может кому пригодится
Код
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