Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
1

Выбор принтера для печати по фрагменту имени

25.10.2019, 11:04. Показов 3504. Ответов 18
Метки нет (Все метки)

Добрый день.

Подскажите пожалуйста.

Есть фиксированная таблица наименований принтеров, которые выводятся в комбобоксе в пользовательской форме.

Задача у пользователя такая: выбрать в комбобоксе нужный принтер из этой таблицы (скрин вложил) и нажать кнопку Печать.

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

Где-то имя принтера может быть "3D 6.42 на tkv03756", а где-то просто начало "3D 6.42", но начало наименований всегда совпадает, то есть это номера принтеров

Начал писать код для выполнения печати, но он ссылается на точное наименование в комбобоксе Ch_label.cmbxPrint.Value, поэтому не работает.

Visual Basic
1
2
3
4
5
6
7
8
9
Dim s
s = Application.ActivePrinter
 
ActivePrinter = Ch_label.cmbxPrint.Value
 
objDoc98.PrintOut
 
ActivePrinter = s
End If
Подскажите пожалуйста, как можно правильно написать код для проверки части его имени в таблице и правильного выбора принтера для печати?
Миниатюры
Выбор принтера для печати по фрагменту имени  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2019, 11:04
Ответы с готовыми решениями:

Выбор принтера для печати
Какая переменная отвечает за текущий принтер, т.е. принтер на который работает DoCmd.OpenReport ?...

Выбор принтера для печати объявлений
собственно хочу взять принтер для печати объявлений. вот что на примете взять простой струнник...

Выбор принтера для печати на пленке
Добрый вечер. Очень нужен ваш совет уважаемые форумчане. Имеется прозрачная пленка под запайку...

Выбор принтера для печати на пленке
Доброго времени суток! Необходим принтер для ч/б печати на прозрачной пленке в маленьких объемах....

18
Эксперт MS Access
26716 / 14396 / 3190
Регистрация: 28.04.2012
Сообщений: 15,782
25.10.2019, 12:11 2
Найти нужный принтер можно, сделав цикл по коллекции Printers
Visual Basic
1
2
3
4
Dim p As Printer
For Each p In Application.Printers
    If p.DeviceName Like ПеременнаяПоисковогоШаблона & "*" Then <Действия для выбранного принтера>
Next
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 12:42  [ТС] 3
Цитата Сообщение от mobile Посмотреть сообщение
Dim p As Printer
Что-то у меня debug ошибка на Printer выскакивает... В reference мне ничего включить не нужно случайно?

Добавлено через 6 минут
Цитата Сообщение от mobile Посмотреть сообщение
DeviceName
библиотеку нужную нашел, теперь на devicename ругается...

Добавлено через 15 секунд
Цитата Сообщение от mobile Посмотреть сообщение
DeviceName
библиотеку нужную нашел, теперь на devicename ругается...
0
Заблокирован
25.10.2019, 12:55 4
Списки принтеров от Игоря-
Visual Basic
1
2
3
4
5
6
7
Sub ПолучениеСпискаПринтеров()
    Set AllPrinters = GetObject("winmgmts://./root/CIMV2").ExecQuery("SELECT * FROM Win32_Printer", , 48)
    For Each printer In AllPrinters
       n = n + 1: Debug.Print "Принтер №" & n & ": " & printer.Name
    Next
    Debug.Print "Всего принтеров: " & n
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub ПолучениеСпискаПринтеров_версия2()
    With CreateObject("Shell.Application").NameSpace(4).Items
        For n = 1 To .Count - 1
            Debug.Print "Принтер №" & n & ": " & .Item(n).Name
            Debug.Print vbTab & "Путь к принтеру №" & n & ": " & .Item(n).Path
        Next
        Debug.Print "Всего принтеров: " & .Count - 1
    End With
    Debug.Print "Активный принтер: " & Application.ActivePrinter
End Sub
0
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 13:21  [ТС] 5
Цитата Сообщение от Остап Бонд Посмотреть сообщение
Sub ПолучениеСпискаПринтеров_версия2()
* * With CreateObject("Shell.Application").NameSpace(4).Items
* * * * For n = 1 To .Count - 1
* * * * * * Debug.Print "Принтер №" & n & ": " & .Item(n).Name
* * * * * * Debug.Print vbTab & "Путь к принтеру №" & n & ": " & .Item(n).Path
* * * * Next
* * * * Debug.Print "Всего принтеров: " & .Count - 1
* * End With
* * Debug.Print "Активный принтер: " & Application.ActivePrinter
End Sub
Полученный список из Debug Print мне как-то в таблицу закинуть нужно... Я не знаю этого...

Поэтому ориентир в моем вопросе на начало имени принтера... Таблица с началом имени уже есть..

Добавлено через 15 секунд
Цитата Сообщение от Остап Бонд Посмотреть сообщение
Sub ПолучениеСпискаПринтеров_версия2()
* * With CreateObject("Shell.Application").NameSpace(4).Items
* * * * For n = 1 To .Count - 1
* * * * * * Debug.Print "Принтер №" & n & ": " & .Item(n).Name
* * * * * * Debug.Print vbTab & "Путь к принтеру №" & n & ": " & .Item(n).Path
* * * * Next
* * * * Debug.Print "Всего принтеров: " & .Count - 1
* * End With
* * Debug.Print "Активный принтер: " & Application.ActivePrinter
End Sub
Полученный список из Debug Print мне как-то в таблицу закинуть нужно... Я не знаю этого...

Поэтому ориентир в моем вопросе на начало имени принтера... Таблица с началом имени уже есть..

Добавлено через 10 минут
Цитата Сообщение от mobile Посмотреть сообщение
If p.DeviceName Like ПеременнаяПоисковогоШаблона & "*" Then <Действия для выбранного принтера>
Next
Подскажите пожалуйста, как мне найденный принтер по части имени назначить принтером, на который далее можно запустить печать? Никак не получается настроить правильное условие...
0
Эксперт MS Access
26716 / 14396 / 3190
Регистрация: 28.04.2012
Сообщений: 15,782
25.10.2019, 14:17 6
Виноват, показал обращение к аксовской коллекции принтеров.

Цитата Сообщение от Dimasterfrom4e Посмотреть сообщение
как мне найденный принтер по части имени назначить принтером
Найти нужный принтер также как я уже показывал. Для примера первый вариант от Остап Бонд. Переменная процедуры это и есть искомый поисковый шаблон
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub ПолучениеСпискаПринтеров_версия2(ПеременнаяПоисковогоШаблона )
    With CreateObject("Shell.Application").NameSpace(4).Items
        For n = 1 To .Count - 1
             if .Item(n).Name like ПеременнаяПоисковогоШаблона  & "*" then
                  'Здесь надо указать найденный принтер как активный
                  'Как это делается в Excel не знаю точно
                  Exit For  'выйти из цикла после удачного поиска
             End If
        Next
    End With
End Sub
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 15:21  [ТС] 7
Цитата Сообщение от mobile Посмотреть сообщение
Sub ПолучениеСпискаПринтеров_версия2(ПеременнаяПоисковогоШаблона )
Cпасибо, но вот в Sub в скобках переменную поискового шаблона это что указывать? Выбор из таблицы в комбобоксе идет.

Добавлено через 7 минут
Цитата Сообщение от mobile Посмотреть сообщение
Найти нужный принтер также как я уже показывал. Для примера первый вариант от Остап Бонд. Переменная процедуры это и есть искомый поисковый шаблон
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim s, n
s = Application.ActivePrinter
    If Ch_label.cmbxPrint.Value <> "" Then
    
        With CreateObject("Shell.Application").Namespace(4).Items
            For n = 1 To .Count - 1
                 If .Item(n).Name Like Ch_label.cmbxPrint.Value & "*" Then
                      ActivePrinter = .Item(n).Name 'Здесь надо указать найденный принтер как активный
                      'Как это делается в Excel не знаю точно
                      objDoc98.PrintOut
                        ActivePrinter = s
                      
                      Exit For  'выйти из цикла после удачного поиска
                 End If
            Next
        End With
    End If
Попробовал что-то. Но тут что-то точно не так...

Добавлено через 43 минуты
Никак не получается...(((
0
Заблокирован
25.10.2019, 15:31 8
Цитата Сообщение от Dimasterfrom4e Посмотреть сообщение
Есть фиксированная таблица наименований принтеров, которые выводятся в комбобоксе в пользовательской форме.
Зачем нужна фиксированная таблица? Вам показали, как получить список доступных принтеров - им и заполняйте комбобокс.
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 15:41  [ТС] 9
Цитата Сообщение от Остап Бонд Посмотреть сообщение
им и заполняйте комбобокс.
никогда не пробовал такое... Каким образом?
0
Заблокирован
25.10.2019, 15:51 10
Dimasterfrom4e, где находится комбобокс? на форме, листе? В зкселе, ворде?
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 16:02  [ТС] 11
Цитата Сообщение от Остап Бонд Посмотреть сообщение
где находится комбобокс?
в экселе на форме. Я знаю, как туда из динамической таблицы на листе подгружать значения... А вот теперь как?

.Item.Name туда?
0
Заблокирован
25.10.2019, 16:10 12
примерно так
Visual Basic
1
2
3
4
5
6
Private Sub UserForm_Initialize()
    cmbxPrint.Clear
    For Each printer In GetObject("winmgmts://./root/CIMV2").ExecQuery("SELECT * FROM Win32_Printer", , 48)
       cmbxPrint.AddItem printer.Name
    Next
End Sub
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 16:19  [ТС] 13
Цитата Сообщение от Остап Бонд Посмотреть сообщение
printer
Ругается на printer. Снова в reference что то нужно?
0
Заблокирован
25.10.2019, 16:21 14
Visual Basic
1
dim printer
добавьте выше ошибки
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 17:02  [ТС] 15
Цитата Сообщение от Остап Бонд Посмотреть сообщение
добавьте выше ошибки
Добавил. Спасибо. А как сделать так, чтобы всякие виртуальные принтеры в список не попадали? Типа "Отправить в OneNote", Fax и тп, которыми не пользуются?
0
Заблокирован
25.10.2019, 18:02 16
Лучший ответ Сообщение было отмечено Dimasterfrom4e как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
Private Sub UserForm_Initialize()
cmbxPrint.Clear
For Each printer In GetObject("winmgmts://./root/CIMV2").ExecQuery("SELECT * FROM Win32_Printer", , 48)
  If Not printer.local Then
    cmbxPrint.AddItem printer.Name
  End If
Next
End Sub
Могу предположить, что в список попадут только сетевые принтеры?
Возможны и другие проверки, но не на чём тестировать.
1
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
25.10.2019, 22:14  [ТС] 17
Цитата Сообщение от Остап Бонд Посмотреть сообщение
Могу предположить, что в список попадут только сетевые принтеры?
Попали в список именно сетевые, спасибо вам))

Вот только дальше почему то печать не срабатывает... Взял из какого-то найденного способа код и подработал...

Но наверняка снова ошибся...(((

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub PrintProc()
Dim s
Dim p As printer
 
    s = Application.ActivePrinter
   
            ActivePrinter = Ch_label.cmbxPrint.Value
            objDoc98.PrintOut
            ActivePrinter = s
 
End Sub
Подумаю еще над этим... Может знаете, что не так?
0
8 / 7 / 0
Регистрация: 27.09.2015
Сообщений: 835
28.10.2019, 15:54  [ТС] 19
Цитата Сообщение от Остап Бонд Посмотреть сообщение
посмотрите, должно помочь...
Добрый день.

Почитал, попробовал. Вот такому методу в одной из тем. Учитывая, что в конце после наименования принтера должен указываться в скобках порядковый номер порта типа (Ne31: ).

Visual Basic
1
2
3
4
5
6
7
8
Private Sub UserForm_Initialize()
Dim OnePrinter As Object
Dim x As Long
For Each OnePrinter In GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Printer")
    ListBox1.AddItem OnePrinter.name  & " Ne" & Format(x, "00")
    x = x + 1
Next
End Sub
Но по этой функции порядковый номер активного принтера (Ne33: ) - влез виртуальный "Microsoft XPS Document Writer" и еще какой-то, а через вывод списка доступных принтеров - (Ne31: ).

Если я делаю фильтр по нелокальным принтерам, то в список не все нужные принтеры попадают, и считаются неверно. Как быть подскажете???

Добавлено через 1 час 30 минут
Я нашел код с одного из сайтов, где выясняются реальные имена принтеров с Ne... и тд. Но не знаю, как прикрутить его к своему комбобоксу.

Выводит он корректные имена в debug.print. Подскажите пож-ста как подкрутить его в подстановку наименований принтеров в комбобокс?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim Arr               As Variant
   Dim Arr1()            As Variant
   Dim Device            As Variant
   Dim Devices           As Variant
   Dim msg               As String
   Dim RegObj            As Object
   Dim RegValue          As String
   Dim i As Long
   Const HKEY_CURRENT_USER = &H80000001
   Set RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
   RegObj.enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr
   ReDim Arr1(1 To 1)
   For Each Device In Devices
   i = i + 1
    If i > 1 Then ReDim Preserve Arr1(1 To i)
      RegObj.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue
      Arr1(i) = Device & " (" & Split(RegValue, ",")(1) & ")"
   Next
   Debug.Print Join(Arr1, vbCr)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2019, 15:54

Выбор принтера для качественной печати фотографий
Доброго времени суток)) Нужен принтер для качественной печати фотографий, а что выбрать фиг его...

Выбор принтера для печати на плотной бумаге
добрый день. на работу необходимо приобрести принтер для печати на плотной бумаге, а конкретнее для...

Выбор лазерного принтера для печати иллюстраций?
Добрый день, хочу просить у вас совета в покупке принтера для печати комиксов, иллюстраций и...

Выбор принтера/МФУ для печати на пленке
Доброго времени суток! Необходимо выбрать принтер для цветной печати на пленке (пример), размер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.