powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Список принтеров для печати формы.
13 сообщений из 13, страница 1 из 1
VBA Список принтеров для печати формы.
    #34503701
VipFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Печатаю форму таким способом:
UserForm.PrintForm

Подскажите, пожалуйста, как получить список принтеров и указать "программе" нужный (получить его название, если выбирает пользователь) при таком способе печати? Возможно существуют другие способы печати формы с параметрами?

Хотел бы разместить ListBox, в котором пользователь бы указывал нужный принтер без каких либо других настроек как в диалоговых окнах печати Excel. А я, на основании этого значения, посылал бы из кода форму на печать. При загрузки формы, хотелось бы получать, также, значение принтера установленного по умолчанию.

Заранее благодарен.
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34503893
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как самое простое:
Код: plaintext
commondialog1.showprinter
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34504110
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Человек работает с VBA. Не имея установленного VB, он не сможет воспользоваться контролом CommonDialog.

VipFedor, почему бы тебе не воспользоваться таким вариантом?

Код: plaintext
Application.Dialogs(xlDialogPrint).Show 

Если любишь "тяжелые" варианты, то смотри статью - ACC: Enumerating Local and Network Printers .
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34504142
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе имея установленного VB, он не сможет воспользоваться контролом CommonDialog. М..да. Точно. Посмотрел на машине без VB, нету. Спасибо за инфу. :)
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34505167
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня встречный вопрос - почему может не работать UserForm.PrintForm? В браузере объектов она есть, но когда висываешь её в код, VBA ругается, что её нет... ;(

Приходится мучится - переностить данные на лист. :(
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34506333
VipFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ШыфлУ меня встречный вопрос - почему может не работать UserForm.PrintForm? В браузере объектов она есть, но когда висываешь её в код, VBA ругается, что её нет... ;(

Приходится мучится - переностить данные на лист. :(

Ну тут, только одна причина может быть. Это то, что UserForm имеет другое имя (например UserForm1) :)
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34506337
VipFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AshtonЧеловек работает с VBA. Не имея установленного VB, он не сможет воспользоваться контролом CommonDialog.

VipFedor, почему бы тебе не воспользоваться таким вариантом?

Код: plaintext
Application.Dialogs(xlDialogPrint).Show 

Если любишь "тяжелые" варианты, то смотри статью - ACC: Enumerating Local and Network Printers .

От Application.Dialogs(xlDialogPrint).Show я никаким образом не смогу получить значение выбранного принтера. Это приемлимо, только в том случае, если печать происходит средствами Excel. А так толку от этого мало. И хочется, все реализовать через свой выпадающий список, а то, пользователь может нажать Установка... и другие не нужные кнопки... Идея такая:

Пользователь выбрал принтер.
Код(программа) получила это значение
Указала Windows через какой Принтер печатать (и можно еще какие-нибудь параметры)
Послала форму на печать.

API посмотрю, спасибо.

Еще есть какие-нибудь идеи?
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34506489
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VipFedor ШыфлУ меня встречный вопрос - почему может не работать UserForm.PrintForm? В браузере объектов она есть, но когда висываешь её в код, VBA ругается, что её нет... ;(

Приходится мучится - переностить данные на лист. :(

Ну тут, только одна причина может быть. Это то, что UserForm имеет другое имя (например UserForm1) :)
Проблема явно не в этом. Можешь поверить

З.Ы. Может быть у меня не та библиотека подключена? <_< Или конфликт версий... Потому как форма не хочет распечатываться ни в какую. В какой библиотеке прописана эта функция, если кто-нить знает?
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34506522
VipFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шыфл
З.Ы. Может быть у меня не та библиотека подключена? <_< Или конфликт версий... Потому как форма не хочет распечатываться ни в какую. В какой библиотеке прописана эта функция, если кто-нить знает?

А попробуй такую вот комбинацию: Me.PrintForm
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34509634
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. тут Changing Windows' Default Printer

и вложенный пример на Access 97.
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34509645
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34509651
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня формочка, реализованная на этих идеях, выглядит так
...
Рейтинг: 0 / 0
VBA Список принтеров для печати формы.
    #34511269
VipFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы.
Пример под Access97 у меня не работает. У меня MS Office 2003
Решил так:

На время устанавливаю один из принтеров как Default и печатаю через него.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
Option Explicit

Private Declare Function GetProfileString Lib "Kernel32" _
    Alias "GetProfileStringA" _
    (ByVal lpAppName As String, _
    ByVal lpKeyName As String, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString As String, _
    ByVal nSize As Long) As Long
    
Private Declare Function WriteProfileString Lib "Kernel32" _
    Alias "WriteProfileStringA" _
    (ByVal lpszSection As String, _
    ByVal lpszKeyName As String, _
    ByVal lpszString As String) As Long

Private Declare Function SendMessage Lib "user32" _
    Alias "SendMessageA" _
    (ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lparam As String) As Long

Private Const HWND_BROADCAST = &HFFFF
                                                                                
Private Const WM_WININICHANGE = &H1A

Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String *  128 
End Type


Private Declare Function GetVersionExA Lib "Kernel32" _
    (lpVersionInformation As OSVERSIONINFO) As Integer

Private Declare Function OpenPrinter Lib "winspool.drv" _
    Alias "OpenPrinterA" _
    (ByVal pPrinterName As String, _
    phPrinter As Long, _
    pDefault As PRINTER_DEFAULTS) As Long

Private Declare Function SetPrinter Lib "winspool.drv" _
    Alias "SetPrinterA" _
    (ByVal hPrinter As Long, _
    ByVal Level As Long, _
    pPrinter As Any, _
    ByVal Command As Long) As Long

Private Declare Function GetPrinter Lib "winspool.drv" _
    Alias "GetPrinterA" _
    (ByVal hPrinter As Long, _
    ByVal Level As Long, _
    pPrinter As Any, _
    ByVal cbBuf As Long, _
    pcbNeeded As Long) As Long

Private Declare Function lstrcpy Lib "Kernel32" _
    Alias "lstrcpyA" _
    (ByVal lpString1 As String, _
    ByVal lpString2 As Any) As Long

Private Declare Function ClosePrinter Lib "winspool.drv" _
    (ByVal hPrinter As Long) As Long

Private Declare Function GetLastError Lib "Kernel32" () As Long

Private Const CCHDEVICENAME =  32 
Private Const CCHFORMNAME =  32 

Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const PRINTER_ACCESS_ADMINISTER = &H4
Private Const PRINTER_ACCESS_USE = &H8
Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

Private Const PRINTER_ATTRIBUTE_DEFAULT =  4 

Private Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmLogPixels As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
    dmICMMethod As Long
    dmICMIntent As Long
    dmMediaType As Long
    dmDitherType As Long
    dmReserved1 As Long
    dmReserved2 As Long
End Type

Private Type PRINTER_INFO_5
    pPrinterName As String
    pPortName As String
    Attributes As Long
    DeviceNotSelectedTimeout As Long
    TransmissionRetryTimeout As Long
End Type

Private Type PRINTER_DEFAULTS
    pDatatype As Long
    pDevmode As DEVMODE
    DesiredAccess As Long
End Type

Private m_sCurrPrinterDevName As String
Private m_sPrevPrinterDevName As String
Private m_sPrevPrinterDriver As String
Private m_sPrevPrinterPort As String

Private Function PtrCtoVbString(Add As Long) As String
    'Source - Article ID: Q78304
    Dim sTemp As String *  512 , x As Long
    
    x = lstrcpy(sTemp, Add)
    If (InStr( 1 , sTemp, Chr( 0 )) =  0 ) Then
         PtrCtoVbString = ""
    Else
         PtrCtoVbString = Left(sTemp, InStr( 1 , sTemp, Chr( 0 )) -  1 )
    End If
End Function

Private Function SetDefaultPrinter(ByVal DeviceName As String, ByVal DriverName As String, ByVal PrinterPort As String) As Boolean
    Dim DeviceLine As String
    Dim r As Long
    Dim l As Long
    
    DeviceLine = DeviceName & "," & DriverName & "," & PrinterPort

    r = WriteProfileString("windows", "Device", DeviceLine)
    
    If r Then

        l = SendMessage(HWND_BROADCAST, WM_WININICHANGE,  0 , "windows")
        SetDefaultPrinter = True
        m_sCurrPrinterDevName = DeviceName
    Else
        SetDefaultPrinter = False
    End If
End Function

Private Function Win95SetDefaultPrinter(ByRef DeviceName As String) As Boolean
    Dim Handle As Long
    Dim pd As PRINTER_DEFAULTS
    Dim x As Long
    Dim need As Long
    Dim pi5 As PRINTER_INFO_5
    Dim LastError As Long


    If DeviceName = "" Then
        Win95SetDefaultPrinter = False
        Exit Function
    End If


    pd.pDatatype =  0 &
    pd.DesiredAccess = PRINTER_ALL_ACCESS


    x = OpenPrinter(DeviceName, Handle, pd)

    If x = False Then
        Win95SetDefaultPrinter = False
        Exit Function
    End If

    x = GetPrinter(Handle,  5 , ByVal  0 &,  0 , need)

    ReDim t((need \  4 )) As Long

    x = GetPrinter(Handle,  5 , t( 0 ), need, need)

    If x = False Then
        Win95SetDefaultPrinter = False
        Exit Function
    End If

    pi5.pPrinterName = PtrCtoVbString(t( 0 ))
    pi5.pPortName = PtrCtoVbString(t( 1 ))
    pi5.Attributes = t( 2 )
    pi5.DeviceNotSelectedTimeout = t( 3 )
    pi5.TransmissionRetryTimeout = t( 4 )


    pi5.Attributes = PRINTER_ATTRIBUTE_DEFAULT


    x = SetPrinter(Handle,  5 , pi5,  0 )
    
    If x = False Then
        Win95SetDefaultPrinter = False
        Exit Function
    End If

    Call ClosePrinter(Handle)
    m_sCurrPrinterDevName = DeviceName
    Win95SetDefaultPrinter = True
End Function

Private Sub GetDriverAndPort(ByVal Buffer As String, ByRef DriverName As String, ByRef PrinterPort As String)
    Dim iDriver As Integer
    Dim iPort As Integer
    
    DriverName = ""
    PrinterPort = ""

    iDriver = InStr(Buffer, ",")
    If iDriver >  0  Then

        DriverName = Left(Buffer, iDriver -  1 )

        iPort = InStr(iDriver +  1 , Buffer, ",")

        If iPort >  0  Then

            PrinterPort = Mid(Buffer, iDriver +  1 , iPort - iDriver -  1 )
        End If
    End If
End Sub

Private Function WinNTSetDefaultPrinter(ByRef DeviceName As String) As Boolean
    Dim Buffer As String
    Dim DriverName As String
    Dim PrinterPort As String
    Dim r As Long
    
    If DeviceName <> "" Then

        Buffer = Space( 1024 )
        r = GetProfileString("PrinterPorts", DeviceName, "", Buffer, Len(Buffer))
        

        Call GetDriverAndPort(Buffer, DriverName, PrinterPort)

        If DriverName <> "" And PrinterPort <> "" Then
            WinNTSetDefaultPrinter = SetDefaultPrinter(DeviceName, DriverName, PrinterPort)
        Else
            WinNTSetDefaultPrinter = False
        End If
    End If
End Function

Function SetPrinterAsDefault(ByVal DeviceName As String) As Boolean
    Dim osinfo As OSVERSIONINFO
    Dim retvalue As Integer

    osinfo.dwOSVersionInfoSize =  148 
    osinfo.szCSDVersion = Space$( 128 )
    retvalue = GetVersionExA(osinfo)
    

    If m_sCurrPrinterDevName <> DeviceName Then

        If osinfo.dwMajorVersion =  3  And osinfo.dwMinorVersion =  51  And osinfo.dwBuildNumber =  1057  And osinfo.dwPlatformId =  2  Then
            SetPrinterAsDefault = WinNTSetDefaultPrinter(DeviceName)

        ElseIf osinfo.dwMajorVersion =  4  And osinfo.dwPlatformId =  1  Then
            SetPrinterAsDefault = Win95SetDefaultPrinter(DeviceName)

        ElseIf osinfo.dwMajorVersion =  4  And osinfo.dwMinorVersion =  0  And osinfo.dwBuildNumber =  1381  And osinfo.dwPlatformId =  2  Then
            SetPrinterAsDefault = WinNTSetDefaultPrinter(DeviceName)
            
        ElseIf osinfo.dwMajorVersion >  4  Then
            SetPrinterAsDefault = WinNTSetDefaultPrinter(DeviceName)
        End If
    Else
        SetPrinterAsDefault = True
    End If
End Function

Private Sub Class_Initialize()
    Dim Buffer As String
    Dim r As Long
    
    Buffer = Space( 8192 )
    r = GetProfileString("windows", "Device", "", Buffer, Len(Buffer))
    If r Then
        
        Buffer = Mid(Buffer,  1 , r)
        
        m_sPrevPrinterDevName = Mid(Buffer,  1 , InStr(Buffer, ",") -  1 )
        m_sPrevPrinterDriver = Mid(Buffer, InStr(Buffer, ",") +  1 , InStrRev(Buffer, ",") - InStr(Buffer, ",") -  1 )
        m_sPrevPrinterPort = Mid(Buffer, InStrRev(Buffer, ",") +  1 )
    Else
        m_sPrevPrinterDevName = ""
        m_sPrevPrinterDriver = ""
        m_sPrevPrinterDevName = ""
    End If
    m_sCurrPrinterDevName = m_sPrevPrinterDevName
End Sub

Private Sub Class_Terminate()

    Call SetPrinterAsDefault(m_sPrevPrinterDevName)
End Sub
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Список принтеров для печати формы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]