1

Тема: VBA: "Тихая" печать их MS Excel

Доброго всем времени суток.
В общем вопрос вот в чём. Я запускаю книгу Excel из под сторонней программы. При этом Excel на экран не выводится. Запускается макрос, который отправляет на печать форму с заполненными данными, то есть просто делает "тихую" печать. Но вот загвоздка в том, что печать идёт не на принтер по умолчанию, а на какой-то другой в системе. Раньше на другой ОС (Windows 7) всё отлично работало, а теперь, когда у меня новый компьютер с установленной на нём Windows 10, происходит это недоразумение.
Подскажите, может кто-то с сталкивался с подобной проблемой или может знает, как её победить.
Заранее спасибо.

Прилагаю текст макроса, хотя я что-то уверен, что дело не в нём, потому что, если открыть файл через Excel, и выполнить макрос, печать идёт на принтер по умолчанию.

+ открыть спойлер

Sub Макрос()
Worksheets("Данные").Range("I2:N2").Copy
Worksheets("Шаблон").Range("J2:O2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("J53:O53").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I3:M3").Copy
Worksheets("Шаблон").Range("R2:V2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("R53:V53").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I4:AR4").Copy
Worksheets("Шаблон").Range("M11:AV11").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("M62:AV62").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I5:AR5").Copy
Worksheets("Шаблон").Range("M12:AV12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("M63:AV63").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I6:AR6").Copy
Worksheets("Шаблон").Range("M13:AV13").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("M64:AV64").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I8:K8").Copy
Worksheets("Шаблон").Range("S20:U20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("S71:U70").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I9:J9").Copy
Worksheets("Шаблон").Range("V20:W20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("V71:W71").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I12:AS12").Copy
Worksheets("Шаблон").Range("K28:AU28").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("K79:AU79").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I10:N10").Copy
Worksheets("Шаблон").Range("I36:N36").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("I87:N87").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I7:AA7").Copy
Worksheets("Шаблон").Range("AC45:AU45").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("AC96:AU96").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I15:AR15").Copy
Worksheets("Шаблон").Range("M10:AV10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("M61:AV61").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I17:AH17").Copy
Worksheets("Шаблон").Range("W15:AV15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("W66:AV66").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("U10:AA10").Copy
Worksheets("Шаблон").Range("X20:AD20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("X71:AD71").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Данные").Range("I11:K11").Copy
Worksheets("Шаблон").Range("AM20:AO20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Worksheets("Шаблон").Range("AM71:AO71").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Sheets("Шаблон").Select
Rows("1:101").Select
Selection.Copy
Sheets("Результат").Select
Rows("1:1").Select
Selection.Insert Shift:=xlDown
Sheets("Результат").PrintOut Copies:=1, Collate:=True
Application.DisplayAlerts = False
Application.Quit
End Sub

2 (изменено: red2881, 2018-08-14 12:24:16)

Re: VBA: "Тихая" печать их MS Excel

Проверь: Параметры Устройства -> Принтеры и сканеры и отключите опцию «Разрешить Windows управлять принтером по умолчанию».

+ открыть спойлер

https://www.white-windows.ru/wp-content/uploads/2016/11/4759191_5.png

3 (изменено: ospts, 2018-08-14 12:33:16)

Re: VBA: "Тихая" печать их MS Excel

red2881, там всё отключено, я сразу тоже на это подумал, ан нет.

4 (изменено: red2881, 2018-08-14 13:03:04)

Re: VBA: "Тихая" печать их MS Excel

Sub Принтер()
    a = Application.ActivePrinter
End Sub

https://d.radikal.ru/d04/1808/c2/b0b8c1c2054d.jpg

Еще посмотри https://www.excel-vba.ru/chto-umeet-exc … lya-excel/

5

Re: VBA: "Тихая" печать их MS Excel

red2881, я так и сделал, как появилась проблема, забил на трёх сотрудников их принтеры по умолчанию но у нас все сотрудники могут печатать, а это где-то около 50. К тому же принтеры по-умолчанию могут меняться, то сломаются или ещё что. За всем этим уследить просто нереально. Так что нужно искать корень проблемы...

6

Re: VBA: "Тихая" печать их MS Excel

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

7

Re: VBA: "Тихая" печать их MS Excel

red2881, но на старом компе с Win7 нормально же работало. Я вот грешу на то, что Win10 с Excel конфликтуют как-то...

8

Re: VBA: "Тихая" печать их MS Excel

После запуска макроса принтер по умолчанию меняется на новый в настройках?

9

Re: VBA: "Тихая" печать их MS Excel

red2881, в том-то и дело, что не меняется

10 (изменено: red2881, 2018-08-14 15:45:51)

Re: VBA: "Тихая" печать их MS Excel

т.е так не работает?

Sub Принтер()
    a = Application.ActivePrinter
тут часть Вашего кода
     Application.ActivePrinter = a
отправка на печать
End Sub

11

Re: VBA: "Тихая" печать их MS Excel

red2881 пишет:

т.е так не работает?

Sub Принтер()
    a = Application.ActivePrinter
тут часть Вашего кода
     Application.ActivePrinter = a
отправка на печать
End Sub

Да, не работает. Отправляет на другой принтер.

12

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

Я запускаю книгу Excel из под сторонней программы.

Эта сторонняя программа запускается под тем же пользователем? Не требует при запуске повышения привилегий?

red2881 пишет:

т.е так не работает?

Разве этот код что-то меняет? У него изначально не тот активный принтер. Так что нужна ещё одна строка — которая задаёт потребный активный принтер перед печатью.

13

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

Разве этот код что-то меняет?

Да кто же его знает.

Как вариант взять значение принтера по умолчанию из реестра.

14

Re: VBA: "Тихая" печать их MS Excel

Не поняли Вы меня. Не нужно ничего рать из реестра».  Принтер по умолчанию известен, его просто нужно задать при:

ospts пишет:

Я запускаю книгу Excel из под сторонней программы. При этом Excel на экран не выводится. Запускается макрос, который отправляет на печать форму с заполненными данными,

Ибо, как я понимаю, в этом случае принтером по умолчанию является иной принтер (который и будет Application.ActivePrinter, посему я и пишу, что толку от такого кода не будет). А вот посмотреть тем же кодом Application.ActivePrinter, какой принтер является умолчальным в этот момент, стоило бы.

15

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

Эта сторонняя программа запускается под тем же пользователем? Не требует при запуске повышения привилегий?

Программа запускается из под своей учётки. Нет ничего не требует.
Кстати, я покопался в реестре и нашёл, что для этого пользователя не меняется оперативно принтер по умолчанию, т.е. когда я меняю его из под своей учётки, у которой права админа, на той учётке не изменяется сразу, только спустя время. Не знаю даже каким таким образом это происходит...
Хотя читал я в инете, что если меняется принтер из под учётки с правами админа, то принтер меняется для всех. Вот на 7-ке видимо так и было, но на 10-ке что-то не так...

16

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

А вот посмотреть тем же кодом Application.ActivePrinter, какой принтер является умолчальным в этот момент, стоило бы.

Я смотрел, там не тот стоит, а который я нашёл в реестре для той учётки.

17

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

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

Я даже не очень понимаю, как Вы это делаете. Ибо для каждой учётной записи свой умолчальный принтер.

ospts пишет:

Программа запускается из под своей учётки.

Вот и ответ. Войдите интерактивно под той учётной записью, поменяйте принтер по умолчанию. Откройте искомую рабочую книгу «ручками», проверьте, какой принтер задан для печати в настройках. Если не тот — поменяйте и там.

18 (изменено: ospts, 2018-08-16 13:17:36)

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

Вот и ответ. Войдите интерактивно под той учётной записью, поменяйте принтер по умолчанию. Откройте искомую рабочую книгу «ручками», проверьте, какой принтер задан для печати в настройках. Если не тот — поменяйте и там.

Она запоролена.
Вы предлагаете в книге установить по умолчанию конкретный принтер?

19

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

Она запоролена.

И что?

ospts пишет:

Вы предлагаете в книге установить по умолчанию конкретный принтер?

Предлагаю проверить принтер по умолчанию под указанной учётной записью. Затем предлагаю открыть книгу и проверить принтер ручками. Программно устанавливать — пока нет, это последнее средство.

20

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

И что?

Я не могу интерактивно на неё зайти.

alexii пишет:

Предлагаю проверить принтер по умолчанию под указанной учётной записью. Затем предлагаю открыть книгу и проверить принтер ручками. Программно устанавливать — пока нет, это последнее средство.

А как это сделать, подскажите

21 (изменено: alexii, 2018-08-17 09:59:15)

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

Я не могу интерактивно на неё зайти.

Почему не можете — для неё отключён интерактивный вход? Можете временно включить. Не знаете пароль? Но как-то же Вы ту стороннюю программу запускаете от имени этой учётной записи, не так ли?

ospts пишет:

А как это сделать, подскажите

Для начала нужно как раз войти под той учётной записью и глазками посмотреть в Панели управления, какой принтер задан умолчальным для этой учётной записи. Если — «никак, совсем никак» — я буду смотреть, можно ли получить сие программным способом.

22

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

Почему не можете — для неё отключён интерактивный вход? Можете временно включить. Не знаете пароль? Но как-то же Вы ту стороннюю программу запускаете от имени этой учётной записи, не так ли?

Вот именно, что не знаю. Программа при установке сама создаёт пользователя,видимо вместе с паролем, и при запуске она не требует пароль. Возможно она сама как-то его ставит... не знаю.

23

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

и при запуске она не требует пароль.

Тогда давайте описывайте — что за приложение, её версию, как именно Вы осуществляете её запуск на исполнение. Покажите скриншот Process Explorer'а со включённым столбцом «User Name», на котором будут видны имена текущего пользователя и пользователя, от имени которого исполняется приложение (можете попробовать сделать скриншот в момент печати, чтобы был виден и excel.exe).

24

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:
ospts пишет:

и при запуске она не требует пароль.

Тогда давайте описывайте — что за приложение, её версию, как именно Вы осуществляете её запуск на исполнение. Покажите скриншот Process Explorer'а со включённым столбцом «User Name», на котором будут видны имена текущего пользователя и пользователя, от имени которого исполняется приложение (можете попробовать сделать скриншот в момент печати, чтобы был виден и excel.exe).

https://pastenow.ru/43e1379d72e77f8af9126a793480369d
Вот. Только я что-то сомневаюсь, что это поможет решить проблему. Дело же не в приложении, а скорее в Win10

25 (изменено: alexii, 2018-08-17 11:55:47)

Re: VBA: "Тихая" печать их MS Excel

Я пока не вижу ничего, что было бы связано с версией ОС. Аналогичная ситуация может быть на любой ОС, начиная с Windows NT.

Вы не показали и не ответили на:

ospts пишет:

что за приложение, её версию, как именно Вы осуществляете её запуск на исполнение.

26

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

Я пока не вижу ничего, что было бы связано с версией ОС. Аналогичная ситуация может быть на любой ОС, начиная с Windows NT.

Вы не показали и не ответили на:

ospts пишет:

что за приложение, её версию, как именно Вы осуществляете её запуск на исполнение.

До 10-ки программа 5 лет работала на Win7 и таких проблем не было. Так что дело всё-таки с 10-кой.
На скриншоте же видно, что за прога - Стек. Прога написана на Java, поэтому сначала запускается Java, которая запускает саму прогу. Это делается через батник.

+ открыть спойлер

start jre1.6.0_07\bin\javaw.exe -Xmx512m -jar JavaStackClient.jar

27

Re: VBA: "Тихая" печать их MS Excel

В общем, пока вы думали, я нашёл другое решение, которое более удовлетворительное, чем то временное, о котором я писал ранее.
Буду запускать Excel видимым (в этом случае он запускается от текущего пользователя), потом форма отправляется на печать и excel закрывается через секунду, это всё через макрос. Будет конечно мерцать excel, но зато будет виден сам процесс работы)

Так что спасибо, что пытались помочь мне!

28

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

До 10-ки программа 5 лет работала на Win7 и таких проблем не было. Так что дело всё-таки с 10-кой.

После — не значит вследствие.

Рассказываю: был один принтер, он же был принтером по умолчанию. Добавили другой/подключили сетевой. Назначили его умолчальным. Под той учётной записью, которая была активна в тот момент. У всех остальных учётных записей умолчальным остался прежний. Могут быть и другие сценарии, приводящие к указанной ситуации.

ospts пишет:

На скриншоте же видно, что за прога - Стек. Прога написана на Java, поэтому сначала запускается Java, которая запускает саму прогу.

На скриншоте виден исполняемый файл с именем stack.exe. javaw.exe не видно.

Ну, да ладно. Имя Вашего принтера знаете, нет? Откройте Вашу Рабочую книгу, добавьте код:

    Dim objSWbemObjectEx As Object
    Dim strOutput As String
    
    
    strOutput = "Default" & vbTab & "Printer Name" & vbCrLf & "-------------------------------------------" & vbCrLf
    
    For Each objSWbemObjectEx In CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery("SELECT * FROM Win32_Printer")
        strOutput = strOutput & objSWbemObjectEx.Default & vbTab & objSWbemObjectEx.Name & vbCrLf
    Next
    
    MsgBox strOutput

в Ваш макрос, сохраните книгу. Выполните программу. Посмотрите на появившееся сообщение вида:
https://i.imgur.com/huPbIPR.png
Скопируйте его содержимое посредством Ctrl-C. Вставьте сюда. Прокомментируйте — присутствует ли искомый принтер в списке, назначен ли именно он принтером по умолчанию?

29

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

Буду запускать Excel видимым (в этом случае он запускается от текущего пользователя),

Мы явно говорим на разных языках.

30

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:
ospts пишет:

Буду запускать Excel видимым (в этом случае он запускается от текущего пользователя),

Мы явно говорим на разных языках.

А что вам непонятно?

alexii пишет:

Прокомментируйте — присутствует ли искомый принтер в списке, назначен ли именно он принтером по умолчанию?

Я уже проверял и знаю, что для этого пользователя стоит по умолчанию другой принтер. Но, как я понял, он зависит от изменения принтера по умолчанию под текущей учёткой. Если я его меняю, то меняется и на той, но только через какое-то время, не сразу, и я не пойму почему. Это может есть в каких-то настройках самой винды, типа какой-то синхронизации для пользователей или чего-то подобного...

31

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

А что вам непонятно?

В моём понимании нет никакой зависимости между видимостью окна приложения и запуском от имени другой учётной записи.

ospts пишет:

Я уже проверял и знаю, что для этого пользователя стоит по умолчанию другой принтер.

Хорошо. Если знаете имя потребного принтера — вставьте в книгу следующий код:

    Dim objSWbemObjectEx As Object

    For Each objSWbemObjectEx In CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery("SELECT * FROM Win32_Printer")
        If StrComp(objSWbemObjectEx.Name, "Microsoft XPS Document Writer", vbTextCompare) = 0 And Not objSWbemObjectEx.Default Then
            objSWbemObjectEx.SetDefaultPrinter
        End If
    Next

где вместо «Microsoft XPS Document Writer» вставьте имя искомого принтера, и сделайте так, чтобы он выполнился под той учётной записью хотя бы один раз (затем можно удалить или оставить на будущее).

32

Re: VBA: "Тихая" печать их MS Excel

alexii пишет:

В моём понимании нет никакой зависимости между видимостью окна приложения и запуском от имени другой учётной записи.

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

alexii пишет:

Если знаете имя потребного принтера — вставьте в книгу следующий код:

Ну если бы один пользователь печатал бы эти формы, но печатать может любой, кому поручат. А у нас их около 50 человек.
Вот если бы как-то вытащить принтер по умолчанию для каждого пользователя, тогда можно было бы использовать этот код.

33

Re: VBA: "Тихая" печать их MS Excel

ospts пишет:

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

Я уже писал про «после — не значит вследствие». Точно так же и здесь: что пользователи разные, говорит лишь о том, что процесс приложения исполняется под разными учётными записями. Видимость/невидимость окна приложения тут не играет роли.

ospts пишет:

Ну если бы один пользователь печатал бы эти формы, но печатать может любой, кому поручат. А у нас их около 50 человек.

И каждый на своей машине, со своим умолчальным принтером — Вы это хотите сказать?

34 (изменено: alexii, 2018-08-17 17:05:08)

Re: VBA: "Тихая" печать их MS Excel

Если последнее предположение верное, и приложение запускается, как Вы писали, пакетным файлом, давайте попробуем заменить его, например, на скрипт, который будет получать имя принтера по умолчанию текущего пользователя, исполняющего скрипт, где-нибудь его сохранять, а код в Рабочей книге, открытой в Microsoft Excel, исполняющейся уже в контексте другого пользователя, будет пытаться устанавливать тот же принтер по умолчанию, что и у вызвавшего скрипт пользователя.

Что скажете? Если готовы — для начала проверьте у себя работоспособность этого кода. А то, ежели мои предположения не верны, то и затеваться не стоит.