Страницы: 1
RSS
vba: печать скрытого листа защищенной книги
 
Подскажите, пожалуйста: есть защищенная книга, в которой на скрытом листе формируется форма для печати. Затем по нажатию кнопки на видимом пользователю листе идет вывод на печать скрытого листа. Скрытый лист не защищен.  
При попытке сделать активным скрытый лист и пустить на печать  
 
(Private Sub CommandButton1_Click()  
Application.ScreenUpdating = False  
Sheets("Форма").Select  
ActiveSheet.PrintOut  
Application.ScreenUpdating = True  
End Sub)  
 
выдается ошибка "Метод Select из класса WorkSheet завершен неверно". Как можно без ошибок вывести скрытый лист на печать, не сделав его видимым пользователю?
 
Так годится?  
 
Private Sub CommandButton1_Click()  
Application.ScreenUpdating = False  
Sheets("Форма").Visible = True  
Sheets("Форма").Select  
ActiveSheet.PrintOut  
Sheets("Форма").Visible = False  
Application.ScreenUpdating = True  
End Sub
 
Лучше правда без селектов обходиться:  
 
Private Sub CommandButton1_Click()  
Application.ScreenUpdating = False  
Sheets("Форма").Visible = True  
Sheets("Форма").PrintOut  
Sheets("Форма").Visible = False  
Application.ScreenUpdating = True  
End Sub
 
{quote}{login=Hugo}{date=08.02.2010 01:18}{thema=Re: vba: печать скрытого листа защищенной книги}{post}Так годится?...{/post}{/quote}  
Пишет "нельзя установить свойство Visible класса WorkSheet"
 
Все, справилась сама - сняла защиту книги ThisWorkbook.Unprotect ("XXX"), дальше пустила на печать и снова защитила книгу.
 
Ещё такой вариант (про защиту книги ничего не пишу), лист суперскрыт, через меню его не открыть:  
 
Private Sub CommandButton1_Click()  
Application.ScreenUpdating = False  
Sheets("Форма").Visible = xlSheetVisible  
Sheets("Форма").PrintOut  
Sheets("Форма").Visible = xlSheetVeryHidden  
Application.ScreenUpdating = True  
End Sub
 
{quote}{login=Hugo}{date=08.02.2010 01:31}{thema=Re:  Re: vba: печать скрытого листа защищенной книги}{post}Ещё такой вариант (про защиту книги ничего не пишу), лист суперскрыт, через меню его не открыть...{/post}{/quote}  
Спасибо всем за помощь, варианты решений возьму на заметку! ;) (а всего делов-то было в снятии защиты - извините валенка в vba!)
 
Все эти варианты решений подходят если команду привязать к кнопке.  
А если распечать скрытый лист стандартной кнопкой печати. Отобразить скрытый лист получается, но вот скрыть - нет. Печататься начинает после выполнения процедуры в модуле книги, т.е. после слов End Sub. И как после этого запустить команду скрыть лист?  
 
Может не совсем понятно чего хочу, поэтому приложу файл. Набросал на скорую руку, прошу сильно не смеяться. Важно с печатью разобраться.
The truth is out there
 
Файл не смотрел...  
А если, на событие Workbook_BeforePrint вызвать макрос CommandButton1_Click (тот, что на кнопке), а потом уже строчку со скрытием?
 
Сразу признаюсь, знания у меня не богатые.  
В событии Workbook_BeforePrint у меня написана команда, которая берет информацию с двух листов и с помощью камеры размещает их на третьем листе. Этот третий лист скрытый. Фокус получается в том что какой бы лист не был активен - всегда распечатывается третий. Так же и предварительный просмотр - всегда третий лист. И если в Workbook_BeforePrint добавить команду /отобразить лист/распечатать/скрыть, то это все выполняется без нареканий, но по завершении процедуры, распечатывется активный лист, в то время как третий уже скрыт. Т.е. или 1-ый или 2-ой.  
Private Sub Workbook_BeforePrint(Cancel As Boolean)  
   ПодстройкаКамер  
   Application.ScreenUpdating = False  
   With Sheets("Отчет")  
   Sheets("Отчет").Visible = -1: .PrintOut: .Visible = 0 'или 2 - если нужен очень скрытый лист  
   End With  
   Application.ScreenUpdating = True  
End Sub  
При таком коде печатается и 3-ий (который нужен) и еще один (который не нужен)
The truth is out there
 
:-) Тогда попробуйте:  
- сначала отобразить нужный лист;  
- остальные скрыть;  
- вывод на печать единственного оставшегося;  
- отображаем ранее скрытые;  
- прячем нужный.
 
Юрий М, давайте все по порядку:  
 
Клавишей F8 пошагово смотрю, что происходит.  
1. Нажимаю Print(на панели)  
2. Начинает выполняться код, и отображает лист  
3. Когда он доходит до PrintOut в коде, начинает выполнять команду сначала.  
4. Потом лист скрывает    
5. И когда доходит до End Sub печатает два листа.    
Получается 2 раза на печать отправляю. Вот второй не нужно печатать.  
А после End Sub никак команду не вставить. Может отменить как-то можно последнюю команду на печать? или прервать команду после того как первый раз отправляет на печать.
The truth is out there
 
Давайте.  
В макросе Книги вызываем на исполнение макрос, который отобразит лист "Отчет", скроет остальные, выведет единственный оставшийся лист на печать.  
Private Sub Workbook_BeforePrint(Cancel As Boolean)  
ПодстройкаКамер  
Application.ScreenUpdating = False  
Call Макрос1 'Тот самый макрос  
тут снова отображаем остальные листы, затем скрываем "Отчет"  
Application.ScreenUpdating = True  
End Sub  
И получится, что после End Sub Макрос1 мы выполним ещё ряд действий. На всякий случай можно ещё вставить паузу...
 
Блин... Ничего не получается...  
 
Если скрыть 1-ый и 2-ой лист, то 3-ий распечатывется как надо. Но теперь как вернуть все обратно 1 и 2 отобразить а 3 скрыть?  
 
Если, как вы говорите, скрыть 1 и 2, отобразить 3, дать команду - печать, потом отобразить 1 и 2 и скрыть 3, то у меня это не работает. У меня печатать начинает когда код полностью выполнен. т.е. от чего ушли к тому и пришли 1 и 2 отображены, а 3 скрыт. И потом только печать почему-то. Посредине кода не хочет.  
 
А можно макрос запустить просто ткнув в защищенный 3 лист? И уже этот макрос все поставит на свои места.  
 
P.S. у меня вместо принтера стоит Snagit(утилита захвата экрана), поэтому я тут же пробую как это все в действии. А ничего не работает как надо.
The truth is out there
 
Загляните в тему: http://www.planetaexcel.ru/forum.php?thread_id=22625.  
Там показано, как в цикле отслеживать открыто ли окно диспетчера печати. Вот этот участок кода:  
Sub CloseImageWriter()  
Dim hApp&  
Do  
hApp = FindWindow("PrintUI_PrinterQueue", vbNullString)  
If hApp = 0 Then Exit Do  
'Call SendMessage(hApp, WM_CLOSE, 0, 0)- эти строки Вам не нужны  
'Call DestroyWindow(hApp)  
Loop  
End Sub
Я сам - дурнее всякого примера! ...
 
Единственное, что я понял в этой теме дак это то, что мне явно не хватает теории.
The truth is out there
 
Что-то цитата не удалась.  
Там хотел сказать, что по ссылке которую указал KukLP, слишком сложным для меня языком написано.  
 
Вот здесь нашел интересные события. А ведь давным давно уже был здесь, да не запомнил.  
Если на детском уровне, то можно решить так:  
1. В Private Sub Workbook_BeforePrint(Cancel As Boolean) - отобразить 3 лист и распечатать его;  
2. Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range) - скрыть 3 лист; (Вызывается при переходе от одной ячейки к другой)  
или  
2. Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)- (Вызывается в момент смены листа для того листа, с которого уходят)  
т.е. скрытый лист видно, но не надолго :)
 
Думаю подойдет  
Dim sH As String  
 
Private Sub GoBack()  
On Error Resume Next  
Sheets(sH).Select  
   Sheets("Отчет").Visible = xlSheetVeryHidden  
   Application.ScreenUpdating = True  
End Sub  
 
Private Sub Workbook_BeforePrint(Cancel As Boolean)  
Dim msg&  
sH = ActiveSheet.Name  
If ActiveSheet.Name <> "Отчет" Then  
msg = MsgBox("Распечатать отчет?", vbYesNoCancel)  
If msg = vbNo Then Exit Sub  
If msg = vbCancel Then Cancel = True: Exit Sub  
   Application.ScreenUpdating = False  
   Sheets("Отчет").Visible = xlSheetVisible  
   Sheets("Отчет").Select  
End If  
Application.OnTime Now, "ЭтаКнига.GoBack"  
End Sub
 
Private Sub Workbook_BeforePrint(Cancel As Boolean)  
   Sheets("Отчет").Visible = True  
   Sheets("Лист1").Visible = False  
   Sheets("Лист3").Visible = False  
   Application.EnableEvents = False  
   Sheets("Отчет").PrintOut  
   Cancel = True  
   Sheets("Лист1").Visible = True  
   Sheets("Лист3").Visible = True  
   Sheets("Отчет").Visible = False  
   Application.EnableEvents = True  
End Sub
 
RAN и Юрий М - большое спасибо!!!  
Оба способа работают!!! И как надо!!!  
В ваших ответах много нового для себя открыл.  
 
RAN  
только поменял (OnTime Now, "ЭтаКнига.GoBack") на (OnTime Now, "GoBack"), ошибку почему-то выдавало, что не может макрос найти.  
Первую часть вставил в модуль книги, а вторую в стандартный модуль процедур.  
Чтоб это узнать, откуда ошибка, пришлось форумы пошелестить :).  
Спасибо! Открыли для меня - OnTime Now  
 
Юрий М  
Вы открыли для меня - Cancel = True  
Я про нее не знал, поэтому вчера вас и не понял.  
   
Всем кто откликнулся - СПАСИБО!!!
The truth is out there
 
Не додумал Application.EnableEvents = False (True)  
Скрывать листы без нать.  
Просто запустить так  
Private Sub Workbook_BeforePrint(Cancel As Boolean)  
msg = MsgBox("Распечатать отчет?", vbYesNoCancel)  
If msg = vbNo Then Exit Sub  
If msg = vbCancel Then Cancel = True: Exit Sub  
   Application.ScreenUpdating = False  
Sheets("Отчет").Visible = True  
''''''''''Sheets("Лист1").Visible = False  
''''''''''Sheets("Лист2").Visible = False  
Application.EnableEvents = False  
Sheets("Отчет").PrintOut  
Cancel = True  
''''''''''Sheets("Лист1").Visible = True  
''''''''''Sheets("Лист2").Visible = True  
Sheets("Отчет").Visible = 2  
Application.EnableEvents = True  
Application.ScreenUpdating = True  
End Sub
 
Не могли бы помочь мне адапритировать макрос печати для OpenOffice?  
Он должен просто распечатать заданные листы книги.  
 
Спасибо
 
Вопросы по OpenOffice следует задавать на соответствующем форуме. Здесь форум по Excel.
Страницы: 1
Читают тему
Наверх