Задача такая: есть несколько листов с данными, которые надо объединить в виде одного документа итогового и отправить на печать. Обязательное условие - перед печатью у пользователя должна быть возможность полученный документ просмотреть и при необходимости, отредактировать. В качестве решения я отлавливаю событие Workbook_BeforePrint, проверяю существование такого листа, если нет - создаю и заполняю данными. Что имеем в итоге (видим на экране), когда жмем ctrl-P — открывается только что созданный лист, заполненный данными, но указатель мыши все равно имеет вид песочных часов. При прокрутке колеса мыши вниз-вверх вместо только что внесенных данных начинают отображаться данные листа, из которого была вызвана процедура печати. А если начать "тыкать" мышкой в ячейки, то постепенно проявляются данные листа печати. Короче, вместо того, что нужно отображается одновременно два листа причем неясно где какой. Объяснить это нереально, пример экрана и файла в прицепе. Т.е. суть такая - все создается и заполняется, но отображается черти как. Создавал новый файл с нуля, проверял на разных машинах и офисах 2003, 2007. Косяк где-то в обработке события печати, если повесить тот же код на любое другое событие - все ОК.
[vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim Sh As Worksheet
On Error Resume Next Cancel = True
Set Sh = Sheets("Печать")
If Sh Is Nothing Then Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Печать" End If
End Sub
[/vba]
Задача такая: есть несколько листов с данными, которые надо объединить в виде одного документа итогового и отправить на печать. Обязательное условие - перед печатью у пользователя должна быть возможность полученный документ просмотреть и при необходимости, отредактировать. В качестве решения я отлавливаю событие Workbook_BeforePrint, проверяю существование такого листа, если нет - создаю и заполняю данными. Что имеем в итоге (видим на экране), когда жмем ctrl-P — открывается только что созданный лист, заполненный данными, но указатель мыши все равно имеет вид песочных часов. При прокрутке колеса мыши вниз-вверх вместо только что внесенных данных начинают отображаться данные листа, из которого была вызвана процедура печати. А если начать "тыкать" мышкой в ячейки, то постепенно проявляются данные листа печати. Короче, вместо того, что нужно отображается одновременно два листа причем неясно где какой. Объяснить это нереально, пример экрана и файла в прицепе. Т.е. суть такая - все создается и заполняется, но отображается черти как. Создавал новый файл с нуля, проверял на разных машинах и офисах 2003, 2007. Косяк где-то в обработке события печати, если повесить тот же код на любое другое событие - все ОК.
[vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim Sh As Worksheet
On Error Resume Next Cancel = True
Set Sh = Sheets("Печать")
If Sh Is Nothing Then Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Печать" End If
когда жмем ctrl-P — открывается только что созданный лист, заполненный данными
С какой радости? В макросе нет ни слова о заполнении данными нового листа. И лист печать станет активным только если вновь создан, иначе активным останется лист, с которого вызывалась печать. Вы соберитесь с мыслями, подумайте и объясните доступно, чего хотите.
когда жмем ctrl-P — открывается только что созданный лист, заполненный данными
С какой радости? В макросе нет ни слова о заполнении данными нового листа. И лист печать станет активным только если вновь создан, иначе активным останется лист, с которого вызывалась печать. Вы соберитесь с мыслями, подумайте и объясните доступно, чего хотите.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Какой результат предполагался, и так понятно, я думаю. Что это все не работает - тоже. Объяснять это словами нереально, ошибок никаких нет, но ничего не работает. Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.
KuklP,
Какой результат предполагался, и так понятно, я думаю. Что это все не работает - тоже. Объяснять это словами нереально, ошибок никаких нет, но ничего не работает. Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.Tarukami
Из всех существующих событий вы выбрали самое не подходящее. И задаете вопрос - как заставить работать то, что работать не должно? Возможно, варианты существуют.. .
если повесить тот же код на любое другое событие - все ОК.
И зачем гемор?
Из всех существующих событий вы выбрали самое не подходящее. И задаете вопрос - как заставить работать то, что работать не должно? Возможно, варианты существуют.. .
Tarukami, а не хотите печатать по кнопке? А чтобы у пользователя не было выбора, каким способом печатать, можно просто оставить [vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True End Sub
[/vba]А на кнопку повесить Ваш код[vba]
Код
Sub beforePrint() If PrintSheetExist = True Then DeletePrintSheet Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Печать" ActiveSheet.Range("A1:F11") = "Печать" Application.EnableEvents = False UserForm1.Show vbModeless 'спрашиваем, можно печатать или нет Application.EnableEvents = True End Sub
[/vba]
Tarukami, а не хотите печатать по кнопке? А чтобы у пользователя не было выбора, каким способом печатать, можно просто оставить [vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True End Sub
[/vba]А на кнопку повесить Ваш код[vba]
Код
Sub beforePrint() If PrintSheetExist = True Then DeletePrintSheet Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Печать" ActiveSheet.Range("A1:F11") = "Печать" Application.EnableEvents = False UserForm1.Show vbModeless 'спрашиваем, можно печатать или нет Application.EnableEvents = True End Sub
Из всех существующих событий вы выбрали самое не подходящее. И задаете вопрос - как заставить работать то, что работать не должно?
Я, простите, не очень понимаю, почему это событие более неподходящее, чем остальные. И в связи с этим задаю вопрос, почему не работает то, что на мой взгляд ДОЛЖНО работать. Может у вас где-то есть секретный учебник VBA, в котором прямо перед главой с "HELLO WORLD" черным по белому написано о том, что есть менее подходящие и более подходящие события, скиньте автора, я почитаю.
Возможно, если не вы можете ни один сформулировать, так и не стоит тогда пачкать людям мозг?
Manyasha, Спасибо за конструктив и потраченное время. Честно говоря, я думал, что может эта проблема знакома тем, кто с экселем на "слушай, ты" и есть какой-то известный костыль для ее решения. Но, видимо, да, придется реализовывать другими путями, той же кнопкой как вариант. Но все-таки не понимаю, почему так?
Из всех существующих событий вы выбрали самое не подходящее. И задаете вопрос - как заставить работать то, что работать не должно?
Я, простите, не очень понимаю, почему это событие более неподходящее, чем остальные. И в связи с этим задаю вопрос, почему не работает то, что на мой взгляд ДОЛЖНО работать. Может у вас где-то есть секретный учебник VBA, в котором прямо перед главой с "HELLO WORLD" черным по белому написано о том, что есть менее подходящие и более подходящие события, скиньте автора, я почитаю.
Возможно, если не вы можете ни один сформулировать, так и не стоит тогда пачкать людям мозг?
Manyasha, Спасибо за конструктив и потраченное время. Честно говоря, я думал, что может эта проблема знакома тем, кто с экселем на "слушай, ты" и есть какой-то известный костыль для ее решения. Но, видимо, да, придется реализовывать другими путями, той же кнопкой как вариант. Но все-таки не понимаю, почему так?Tarukami
Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.
Попробовал. В данном файле-примере (8763730.xls) все работает, как и задумывалось. Никаких глюков и "артефактов" не наблюдается... (Win8.1 x64, Excel 2013) У вас и с этим файлом-примером такие же проблемы или только с вашим реальным файлом?
[p.s.]поржал над "огородом": [vba]
Код
Private Function PrintSheetExist() As Boolean Dim Sh As Worksheet On Error Resume Next
Set Sh = Sheets("Печать")
If Sh Is Nothing Then PrintSheetExist = False: Exit Function
PrintSheetExist = True
End Function
[/vba] все решается элегантнее [vba]
Код
Private Function PrintSheetExist() As Boolean On Error Resume Next PrintSheetExist = Not Sheets("Печать") Is Nothing End Function
[/vba][/p.s.] [moder]А вот ржать не надо. Достаточно просто предложить более правильное решение[/moder]
Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.
Попробовал. В данном файле-примере (8763730.xls) все работает, как и задумывалось. Никаких глюков и "артефактов" не наблюдается... (Win8.1 x64, Excel 2013) У вас и с этим файлом-примером такие же проблемы или только с вашим реальным файлом?
[p.s.]поржал над "огородом": [vba]
Код
Private Function PrintSheetExist() As Boolean Dim Sh As Worksheet On Error Resume Next
Set Sh = Sheets("Печать")
If Sh Is Nothing Then PrintSheetExist = False: Exit Function
PrintSheetExist = True
End Function
[/vba] все решается элегантнее [vba]
Код
Private Function PrintSheetExist() As Boolean On Error Resume Next PrintSheetExist = Not Sheets("Печать") Is Nothing End Function
[/vba][/p.s.] [moder]А вот ржать не надо. Достаточно просто предложить более правильное решение[/moder]KSV
да, это уже третий наверное файл и везде результат один и тот же...
Оч. странно... Я не думаю, что 2007 и 2013 по разному обрабатывают события... Но, все же, вам стоит попробовать свой код на 2013, т.к. у меня он отрабатывает без проблем. Еще попробуйте принудительно включить обновление экрана (может оно у вас где-то в коде раньше отключается...), добавив в конце обработчика события Workbook_BeforePrint() вот эту строчку: [vba]
да, это уже третий наверное файл и везде результат один и тот же...
Оч. странно... Я не думаю, что 2007 и 2013 по разному обрабатывают события... Но, все же, вам стоит попробовать свой код на 2013, т.к. у меня он отрабатывает без проблем. Еще попробуйте принудительно включить обновление экрана (может оно у вас где-то в коде раньше отключается...), добавив в конце обработчика события Workbook_BeforePrint() вот эту строчку: [vba]