Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
 Аватар для Dimasterfrom4e
9 / 8 / 0
Регистрация: 27.09.2015
Сообщений: 837

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

25.10.2019, 11:04. Показов 6337. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2019, 11:04
Ответы с готовыми решениями:

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

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

Выбор принтера для печати на пленке
Добрый вечер. Очень нужен ваш совет уважаемые форумчане. Имеется прозрачная пленка под запайку лотков (материал PET, PE, толщина 50-80...

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

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

Добавлено через 15 секунд
Цитата Сообщение от mobile Посмотреть сообщение
DeviceName
библиотеку нужную нашел, теперь на devicename ругается...
0
Заблокирован
25.10.2019, 12:55
Списки принтеров от Игоря-
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
 Аватар для Dimasterfrom4e
9 / 8 / 0
Регистрация: 27.09.2015
Сообщений: 837
25.10.2019, 13:21  [ТС]
Цитата Сообщение от Остап Бонд Посмотреть сообщение
Sub ПолучениеСпискаПринтеров_версия2()
* * With CreateObject("Shell.Application").NameSp ace(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").NameSp ace(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
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
25.10.2019, 14:17
Виноват, показал обращение к аксовской коллекции принтеров.

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

.Item.Name туда?
0
Заблокирован
25.10.2019, 16:10
примерно так
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
 Аватар для Dimasterfrom4e
9 / 8 / 0
Регистрация: 27.09.2015
Сообщений: 837
25.10.2019, 16:19  [ТС]
Цитата Сообщение от Остап Бонд Посмотреть сообщение
printer
Ругается на printer. Снова в reference что то нужно?
0
Заблокирован
25.10.2019, 16:21
Visual Basic
1
dim printer
добавьте выше ошибки
1
 Аватар для Dimasterfrom4e
9 / 8 / 0
Регистрация: 27.09.2015
Сообщений: 837
25.10.2019, 17:02  [ТС]
Цитата Сообщение от Остап Бонд Посмотреть сообщение
добавьте выше ошибки
Добавил. Спасибо. А как сделать так, чтобы всякие виртуальные принтеры в список не попадали? Типа "Отправить в OneNote", Fax и тп, которыми не пользуются?
0
Заблокирован
25.10.2019, 18:02
Лучший ответ Сообщение было отмечено 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
 Аватар для Dimasterfrom4e
9 / 8 / 0
Регистрация: 27.09.2015
Сообщений: 837
25.10.2019, 22:14  [ТС]
Цитата Сообщение от Остап Бонд Посмотреть сообщение
Могу предположить, что в список попадут только сетевые принтеры?
Попали в список именно сетевые, спасибо вам))

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

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

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
 Аватар для Dimasterfrom4e
9 / 8 / 0
Регистрация: 27.09.2015
Сообщений: 837
28.10.2019, 15:54  [ТС]
Цитата Сообщение от Остап Бонд Посмотреть сообщение
посмотрите, должно помочь...
Добрый день.

Почитал, попробовал. Вот такому методу в одной из тем. Учитывая, что в конце после наименования принтера должен указываться в скобках порядковый номер порта типа (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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2019, 15:54
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru