Страницы: 1
RSS
Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
Добрый день, форумчане!  
В Excel  использую форму UserForm1 и кнопки управления. UserForm1 соответственно визуализируется - UserForm1.Show
Одна из кнопок запускает Sub, которая заполняет лист и запускает перед печатью предварительный просмотр
Код
Worksheets("Лист").PrintPreview

И дело в том, что окно предварительного просмотра оказывается под формой UserForm1.
Невозможно посмотреть результат  и невозможно закрыть форму просмотра и код по сути висит.

1. Подскажите, как можно  форму предварительного просмотра листа Excell перед печатью вывести кодом VBA поверх формы UserForm1 ?
   (Ну или - как можно UserForm1 спрятать под окно  предварительного просмотра перед печатью и потом вернуть назад?)
2. Форму предварительного просмотра можно вообще-то потом закрыть,  нажав "Х".
   А как можно перехватить событие, что окно предварительного просмотра закрыто?

Спасибо за идеи и код!  
 
как вариант
Код
Sub ShowPrintPreview()
    ' Скрываем UserForm1
    UserForm1.Hide
    
    ' Отображаем предварительный просмотр
    Worksheets("Лист").PrintPreview
    
    ' Снова показываем UserForm1
    UserForm1.Show
End Sub
 
online, спасибо!
так собственно пробовал, но почему то не подошло.
Но сейчас думаю, что все устраивает.

Конечно,  хотелось бы понять, как перехватить событие от "х" - закрытие окна предварительного просмотра.
Но видимо это уже другая история.
 
Изменено: YGrigor18 - 09.12.2024 22:57:08
 
А если так попробовать
Код
Private Sub CommandButton1_Click()
    ' Скрываем UserForm перед запуском предварительного просмотра
    Me.Hide

    ' Проводим предварительный просмотр листа
    Worksheets("Лист").PrintPreview
    
    ' Ожидание закрытия окна предварительного просмотра
    Dim previewOpen As Boolean
    previewOpen = True

    ' Цикл, который продолжает работу, пока окно продолжает быть открытым.
    Do While previewOpen
        ' Проверка, открыто ли окно PrintPreview
        previewOpen = Application.CommandBars("Print Preview").Visible
        DoEvents ' Позволяет другим событиям выполняться
    Loop

    ' Показываем UserForm снова после закрытия окна предпросмотра
    Me.Show
End Sub
 
online, добрый день! красивое решение.
при выполнении кода, к сожалению, ошибка на строке:
previewOpen = Application.CommandBars("Print Preview").Visible

Ругается на "Print Preview", имя не воспринимает - требует индекс. (?)
 
х....))), а если простую задержку использовать...
Код
Private Sub CommandButton1_Click()
    ' Скрываем UserForm перед запуском предварительного просмотра
    Me.Hide
    
    ' Проводим предварительный просмотр листа
    Worksheets("Лист").PrintPreview
    
    ' Даем небольшую паузу для системы
    Do While Me.Visible = False
        DoEvents ' Позволяет другим событиям выполняться
        Application.Wait (Now + TimeValue("0:00:01")) ' Одинарная секунда ожидания
    Loop

    ' Показываем UserForm снова после закрытия окна предпросмотра
    Me.Show
End Sub
 
Цитата
online написал:
а если простую задержку использовать
И путь в никуда
 
Цитата
написал:
И путь в никуда

⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣷⣷⣷⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣷⠄⠄⠄⠄⠄⠄⠄⠄⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿⣿⣷⠄⠄⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⠄⠄⣷⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠄⠄⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠄⠄⠄⠄⠄⣿⣿⣿
⣿⣿⣿⣿⣿⠄⠄⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⣷⣿
⣿⣿⣿⣿⣿⠄⠄⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⣷
⣿⣿⣿⣿⣿⠄⠄⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣷⠄⠄⠄⠄⠄⠄⠄⠄⣿
⣿⣿⣿⣿⣿⣷⣷⣿⣿⣿⣿⣿⣿⣿⣷⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣷⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⣷⣷⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿

 
Цитата
написал:
А как можно перехватить событие, что окно предварительного просмотра закрыто?
а зачем? Это модальное окно и при его отображении код останавливается. И продолжается код сразу, как только нажали кнопку закрытия. Если хотите перехватить - надо разбивать на две процедуры: одна ДО вызова окна предв.просмотра, вторая - после. И вторую нужно будет вызывать из первой через OnTime. Примерно так это будет выглядеть:
Код
Sub ShowPreview()
    Application.OnTime Now + TimeSerial(0, 0, 2), "AfterShowPreview"
    ActiveSheet.PrintPreview
End Sub
Sub AfterShowPreview()
    MsgBox "Окно предварительного просмотра закрыто!", vbInformation
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
online,  Дмитрий(The_Prist) Щербаков,  спасибо!
потестирую оба варианта, решения вполне подходят.
Изменено: YGrigor18 - 10.12.2024 16:47:26
 
online, Дмитрий(The_Prist) Щербаков, все получилось как нужно, но когда открыт один файл Excel!
Cпасибо! В принципе работать можно.

p.s. из непонятного остался момент, когда открыты другие файлы Excel.
В коде явно указываю, какая книга и лист активные.
При первом просмотре перед печатью Preview,  открывается окно предварительного просмотра, которое можно закрыть только нажав крест "X"  на окне (правый верхний угол). Нет реакции ни на одну кнопку к самом окне предварительного просмотра Preview.  Окно как заблокировано!
Но если нажать ту же кнопку  просмотра на форме повторно - то закрыть окно просмотра Preview можно уже и кнопкой на форме и "X".
И после повторных просмотров в окне просмотра доступны все кнопки! (параметры страницы и другие)

В чем может быть проблемка?  Ведь кнопка просмотра запускает один и тот же код.

А когда открыт один файл Excel, такой проблемы вообще нет - можно закрыть окно просмотра с первого раза и далее как угодно.
Из наблюдения - если есть открытые файлы Excel и загружаю свой файл с формой управления, то форма становится верхней и активной, а вот
лист самого файла, которому принадлежит форма может оказаться не сразу за формой, а где-то между предыдущими файлами Exceл.
Может в этом и суть, но тогда как с этим бороться?

Код
Public Sub PrintPreview()
         Application.DisplayAlerts = False
         Application.ScreenUpdating = True
         Application.Visible = True       
        Windows("Книга1.xlsm").Activate
        Workbooks("Книга1.xlsm").Sheets("Лист1").Activate

       ' Скрываем UserForm1 перед запуском предварительного просмотра
        UserForm1.Hide              

      ' Предварительный просмотр листа      
       'Workbooks("Книга1").Worksheets("Лист1").PrintPreview
                              ' или      
       Workbooks("Книга1").Worksheets("Лист1").PrintOut Copies:=1, Preview:=True      

     ' Показываем UserForm снова после закрытия окна предпросмотра         
      UserForm1.Show
End Sub
Изменено: YGrigor18 - 12.12.2024 12:22:07
 
Вопрос в принципе решил, но не знаю, оптимально это или нет.
Если перед просмотром поменять размер окна, то все работает.

Application.WindowState = xlMaximized

' Предварительный просмотр листа            
'Workbooks("Книга1").Worksheets("Лист1").PrintPreview
Application.WindowState = xlNormal
Страницы: 1
Наверх