Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/BeforePrint и создание листа - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » BeforePrint и создание листа (Иное/Other)
BeforePrint и создание листа
Tarukami Дата: Четверг, 09.04.2015, 10:04 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
Задача такая: есть несколько листов с данными, которые надо объединить в виде одного документа итогового и отправить на печать. Обязательное условие - перед печатью у пользователя должна быть возможность полученный документ просмотреть и при необходимости, отредактировать. В качестве решения я отлавливаю событие 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]
К сообщению приложен файл: 5556052.jpg (78.8 Kb) · 7352909.xls (27.0 Kb)
 
Ответить
СообщениеЗадача такая: есть несколько листов с данными, которые надо объединить в виде одного документа итогового и отправить на печать. Обязательное условие - перед печатью у пользователя должна быть возможность полученный документ просмотреть и при необходимости, отредактировать. В качестве решения я отлавливаю событие 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]

Автор - Tarukami
Дата добавления - 09.04.2015 в 10:04
KuklP Дата: Четверг, 09.04.2015, 17:03 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
когда жмем ctrl-P — открывается только что созданный лист, заполненный данными
С какой радости? В макросе нет ни слова о заполнении данными нового листа. И лист печать станет активным только если вновь создан, иначе активным останется лист, с которого вызывалась печать. Вы соберитесь с мыслями, подумайте и объясните доступно, чего хотите.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
когда жмем ctrl-P — открывается только что созданный лист, заполненный данными
С какой радости? В макросе нет ни слова о заполнении данными нового листа. И лист печать станет активным только если вновь создан, иначе активным останется лист, с которого вызывалась печать. Вы соберитесь с мыслями, подумайте и объясните доступно, чего хотите.

Автор - KuklP
Дата добавления - 09.04.2015 в 17:03
Tarukami Дата: Четверг, 09.04.2015, 21:44 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
KuklP,

Какой результат предполагался, и так понятно, я думаю. Что это все не работает - тоже. Объяснять это словами нереально, ошибок никаких нет, но ничего не работает. Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.
К сообщению приложен файл: 8763730.xls (32.5 Kb)
 
Ответить
СообщениеKuklP,

Какой результат предполагался, и так понятно, я думаю. Что это все не работает - тоже. Объяснять это словами нереально, ошибок никаких нет, но ничего не работает. Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.

Автор - Tarukami
Дата добавления - 09.04.2015 в 21:44
RAN Дата: Четверг, 09.04.2015, 21:49 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Из всех существующих событий вы выбрали самое не подходящее.
И задаете вопрос - как заставить работать то, что работать не должно?
Возможно, варианты существуют..
.
если повесить тот же код на любое другое событие - все ОК.

И зачем гемор?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеИз всех существующих событий вы выбрали самое не подходящее.
И задаете вопрос - как заставить работать то, что работать не должно?
Возможно, варианты существуют..
.
если повесить тот же код на любое другое событие - все ОК.

И зачем гемор?

Автор - RAN
Дата добавления - 09.04.2015 в 21:49
Manyasha Дата: Четверг, 09.04.2015, 23:14 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
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]
К сообщению приложен файл: 8763730_2.xls (53.0 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщение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]

Автор - Manyasha
Дата добавления - 09.04.2015 в 23:14
Tarukami Дата: Пятница, 10.04.2015, 11:49 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
RAN,
Из всех существующих событий вы выбрали самое не подходящее.
И задаете вопрос - как заставить работать то, что работать не должно?

Я, простите, не очень понимаю, почему это событие более неподходящее, чем остальные. И в связи с этим задаю вопрос, почему не работает то, что на мой взгляд ДОЛЖНО работать. Может у вас где-то есть секретный учебник VBA, в котором прямо перед главой с "HELLO WORLD" черным по белому написано о том, что есть менее подходящие и более подходящие события, скиньте автора, я почитаю.

Возможно, варианты существуют..

Возможно, если не вы можете ни один сформулировать, так и не стоит тогда пачкать людям мозг?




Manyasha,
Спасибо за конструктив и потраченное время. Честно говоря, я думал, что может эта проблема знакома тем, кто с экселем на "слушай, ты" и есть какой-то известный костыль для ее решения. Но, видимо, да, придется реализовывать другими путями, той же кнопкой как вариант.
Но все-таки не понимаю, почему так?
 
Ответить
СообщениеRAN,
Из всех существующих событий вы выбрали самое не подходящее.
И задаете вопрос - как заставить работать то, что работать не должно?

Я, простите, не очень понимаю, почему это событие более неподходящее, чем остальные. И в связи с этим задаю вопрос, почему не работает то, что на мой взгляд ДОЛЖНО работать. Может у вас где-то есть секретный учебник VBA, в котором прямо перед главой с "HELLO WORLD" черным по белому написано о том, что есть менее подходящие и более подходящие события, скиньте автора, я почитаю.

Возможно, варианты существуют..

Возможно, если не вы можете ни один сформулировать, так и не стоит тогда пачкать людям мозг?




Manyasha,
Спасибо за конструктив и потраченное время. Честно говоря, я думал, что может эта проблема знакома тем, кто с экселем на "слушай, ты" и есть какой-то известный костыль для ее решения. Но, видимо, да, придется реализовывать другими путями, той же кнопкой как вариант.
Но все-таки не понимаю, почему так?

Автор - Tarukami
Дата добавления - 10.04.2015 в 11:49
KSV Дата: Пятница, 10.04.2015, 17:47 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

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

Попробовал. В данном файле-примере (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.VBA@gmail.com
Яндекс.Деньги: 410011921213333


Сообщение отредактировал Pelena - Пятница, 10.04.2015, 18:29
 
Ответить
Сообщение
Вот я допилил пример, в котором все наглядно видно, открывайте, тыкайте, смотрите на результат.

Попробовал. В данном файле-примере (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
Дата добавления - 10.04.2015 в 17:47
Tarukami Дата: Пятница, 10.04.2015, 21:14 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
KSV,

Поржать можно — реально огород. И спасибо за пример — красота.

По поводу
У вас и с этим файлом-примером такие же проблемы или только с вашим реальным файлом?

— да, это уже третий наверное файл и везде результат один и тот же...
 
Ответить
СообщениеKSV,

Поржать можно — реально огород. И спасибо за пример — красота.

По поводу
У вас и с этим файлом-примером такие же проблемы или только с вашим реальным файлом?

— да, это уже третий наверное файл и везде результат один и тот же...

Автор - Tarukami
Дата добавления - 10.04.2015 в 21:14
KSV Дата: Пятница, 10.04.2015, 23:32 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
да, это уже третий наверное файл и везде результат один и тот же...

Оч. странно...
Я не думаю, что 2007 и 2013 по разному обрабатывают события... Но, все же, вам стоит попробовать свой код на 2013, т.к. у меня он отрабатывает без проблем.
Еще попробуйте принудительно включить обновление экрана (может оно у вас где-то в коде раньше отключается...),
добавив в конце обработчика события Workbook_BeforePrint() вот эту строчку:
[vba]
Код
Application.ScreenUpdating = True
[/vba]
К сообщению приложен файл: 2363327.xls (46.0 Kb)


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333


Сообщение отредактировал KSV - Пятница, 10.04.2015, 23:34
 
Ответить
Сообщение
да, это уже третий наверное файл и везде результат один и тот же...

Оч. странно...
Я не думаю, что 2007 и 2013 по разному обрабатывают события... Но, все же, вам стоит попробовать свой код на 2013, т.к. у меня он отрабатывает без проблем.
Еще попробуйте принудительно включить обновление экрана (может оно у вас где-то в коде раньше отключается...),
добавив в конце обработчика события Workbook_BeforePrint() вот эту строчку:
[vba]
Код
Application.ScreenUpdating = True
[/vba]

Автор - KSV
Дата добавления - 10.04.2015 в 23:32
Мир MS Excel » Вопросы и решения » Вопросы по VBA » BeforePrint и создание листа (Иное/Other)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!