Как предотвратить диалог печати при использовании метода Excel PrintOut

Когда я использую метод 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 и о том, что они делают то, что задумал автор?


person James Roes    schedule 15.09.2008    source источник


Ответы (3)


Когда вы говорите «Диалог печати», я предполагаю, что вы имеете в виду диалоговое окно «Сейчас печатаем xxx на», а не стандартное диалоговое окно печати (выберите принтер, количество копий и т. Д.). Взяв ваш пример выше и попробовав его, я увидел то поведение, которое я видел - «Сейчас печатается ...» на короткое время отображалось, а затем автоматически закрывалось.

То, что вы пытаетесь контролировать, может быть связано не с Excel, а с поведением на уровне Windows. Если это управляемо, вам нужно: а) отключить его, б) выполнить печать, в) снова включить. Если ваш код не работает, есть риск, что он не будет повторно включен для других приложений.

РЕДАКТИРОВАТЬ: попробуйте это решение: Как предотвратить диалоговое окно печати при использовании метода Excel PrintOut. Кажется, это точно описывает то, что вам нужно.

person Kevin Haines    schedule 16.09.2008
comment
Да, ваши предположения верны - извините, я не уточнил. В дополнение к этому ответу, кто-нибудь знает, это поведение Excel или Windows? - person James Roes; 16.09.2008

Если вы не хотите отображать диалоговое окно печати, просто выполните макротест следующим образом; он не будет отображать диалоговое окно печати, а обнаружит принтер по умолчанию и немедленно выполнит печать.

sub  test()

 activesheet.printout preview:= false

end sub

Запустите этот макрос, и он распечатает текущий активный лист без отображения диалогового окна печати.

person Raghbir Singh    schedule 04.10.2012

Вызовы API в статье, на которую ссылается Кевин Хейнс, скрывают диалоговое окно печати следующим образом:

  1. Получите дескриптор диалогового окна печати.
  2. Отправить в окно сообщение, чтобы оно не перерисовывалось
  3. Сделать окно недействительным, что приводит к перерисовке, которая никогда не происходит
  4. Скажите Windows перекрасить окно, в результате чего оно исчезнет.

Это, мягко говоря, упрощенно.

Вызовы API безопасны, но вы, вероятно, захотите убедиться, что для обновления экрана для диалогового окна «Печать» установлено значение «Истина», если ваше приложение не работает.

person Robert S.    schedule 22.09.2008