Как предотвратить печать диалогового окна при использовании метода Excel PrintOut
-
09-06-2019 - |
Вопрос
Когда я использую метод PrintOut для печати объекта Worksheet на принтере, отображается диалоговое окно «Печать» (показывающее имя файла, целевой принтер, напечатанные страницы и кнопку «Отмена»), даже если я установил DisplayAlerts = False.Приведенный ниже код работает в макросе Excel, но то же самое происходит, если я использую этот код в приложении VB или VB.Net (с изменениями ссылок, необходимыми для использования объекта Excel).
Public Sub TestPrint()
Dim vSheet As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set vSheet = ActiveSheet
vSheet.PrintOut Preview:=False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
РЕДАКТИРОВАТЬ:Ответ ниже проливает больше света на этот вопрос (что это может быть диалоговое окно Windows, а не диалоговое окно Excel), но не отвечает на мой вопрос.Кто-нибудь знает, как запретить его отображение?
РЕДАКТИРОВАТЬ:Спасибо за дополнительное исследование, Кевин.Очень похоже, что это то, что мне нужно.Просто не уверен, что хочу слепо принимать такой код API.Есть ли у кого-нибудь еще какие-либо сведения об этих вызовах API и о том, что они делают то, что задумал автор?
Решение
Когда вы говорите «Диалоговое окно «Печать», я предполагаю, что вы имеете в виду диалоговое окно «Теперь печатаем xxx on», а не стандартное диалоговое окно печати (выбор принтера, количество копий и т. д.).Взяв приведенный выше пример и опробовав его, я увидел именно такое поведение: сообщение «Сейчас печатается...» отображалось на короткое время, а затем автоматически закрывалось.
То, что вы пытаетесь контролировать, может быть не связано с Excel, а быть поведением на уровне Windows.Если им можно управлять, вам необходимо а) отключить его, б) выполнить печать, в) снова включить.Если ваш код даст сбой, существует риск, что он не будет повторно включен для других приложений.
РЕДАКТИРОВАТЬ:Попробуйте это решение: Как предотвратить печать диалогового окна при использовании метода Excel PrintOut.Кажется, это точно описывает то, что вам нужно.
Другие советы
Если вы не хотите отображать диалог печати, просто выполните проверку макроса следующим образом;он не будет отображать диалог печати, обнаружит принтер по умолчанию и немедленно напечатает.
sub test()
activesheet.printout preview:= false
end sub
Запустите этот макрос, и он напечатает активный в данный момент лист без отображения диалогового окна печати.
Вызовы API в статье, на которую ссылается Кевин Хейнс, скрывают диалоговое окно «Печать» следующим образом:
- Получите дескриптор диалогового окна «Печать».
- Отправьте сообщение окну, чтобы оно не перерисовывалось.
- Сделайте окно недействительным, что приведет к перерисовке, которая никогда не происходит.
- Скажите Windows перерисовать окно, в результате чего оно исчезнет.
Это мягко говоря упрощенно.
Вызовы API безопасны, но вам, вероятно, захочется убедиться, что для обновления экрана для диалогового окна «Печать» установлено значение «Истина», если ваше приложение выйдет из строя.