Скрыть UserForms VBA от превью панели задач Excel без потери данных
Как предотвратить отображение скрытых форм VBA в предварительном просмотре панели задач Windows в Excel. Решения с сохранением данных: перемещение за экран, Unload Me и WinAPI для vba excel, формы vba, userform vba.
Как предотвратить отображение скрытых UserForms VBA в предварительном просмотре панели задач Windows в Excel, сохраняя при этом введенные пользователем данные?
В Excel-книге используется несколько UserForms для сбора информации от пользователя и автоматического создания документа (аналогично мастеру). Процесс:
- Нажатие кнопки для запуска мастера.
- Ввод данных в экран 1.
- Ввод данных в экран 2.
- Ввод данных в экран 3.
- Создание документа.
Формы скрываются после использования с помощью Me.Hide, оставаясь в памяти системы. Они создаются с помощью Set WizardForm = New Wizard, а не отображаются базовая форма.
При переключении на книгу через панель задач все скрытые UserForms появляются в предварительном просмотре документа, что выглядит загроможденно и запутанно. Они не отображаются при клике на книгу.
Как сделать так, чтобы UserForms не показывались в этом предпросмотре, но данные пользователя сохранялись?
Чтобы предотвратить отображение скрытых UserForms VBA в предварительном просмотре панели задач Windows в Excel при сохранении введенных пользователем данных в vba excel, перемещайте форму за пределы экрана перед вызовом Me.Hide: установите .Top = Application.Top - 1000 и .StartUpPosition = 0. Это полностью убирает формы vba из thumbnail-превью панели задач Excel, не удаляя их из памяти и сохраняя все данные. При повторном показе формы (например, в мастере) центрируйте её в событии UserForm_Activate относительно окна Excel — так превью останется чистым, а процесс ввода не прервется.
Содержание
- Проблема отображения скрытых UserForms в панели задач Excel
- Почему формы vba появляются в предварительном просмотре
- Решение 1: Перемещение userform vba за пределы экрана
- Решение 2: Использование Unload Me для userform
- Продвинутое решение: API для управления окнами
- Рекомендации по реализации и тестированию
- Источники
- Заключение
Проблема отображения скрытых UserForms в панели задач Excel
Представьте: вы запускаете мастер в Excel на основе нескольких UserForms для ввода данных — экран 1, экран 2, экран 3. Каждая форма создается динамически через Set WizardForm = New Wizard, заполняется данными, скрывается Me.Hide и ждет следующего шага. Данные на месте, все работает. Но стоит навести на иконку Excel в панели задач Windows — и вот оно, хаос: куча миниатюр скрытых форм vba в предварительном просмотре в excel. Загромождено, неряшливо, пользователь пугается.
Почему так? Windows thumbnail-превью (Live Preview) захватывает все видимые окна процесса Excel, включая скрытые UserForms. Они не закрыты, а просто спрятаны — Me.Hide оставляет их в памяти как окна приложения. Клик на книгу ничего не меняет, превью чистое, но hover-эффект портит впечатление. В вашем случае с мастером это особенно актуально: формы в vba excel не модальные по умолчанию, и их несколько.
А что если форм десяток? Превью панели задач excel превращается в помойку. Пользователи жалуются, а вы ищете фикс без потери данных. Решения есть, и они просты в реализации.
Почему формы vba появляются в предварительном просмотре
Скрытие через Me.Hide в userform vba не делает форму невидимой для Windows. Она просто сворачивается, но остается окном процесса EXCEL.EXE. Панель задач (Taskbar) в Windows 10/11 использует thumbnail-провайдеры, которые сканируют все дочерние окна родительского приложения. Excel — родитель, формы — дети. Результат: все они в превью при наведении.
Тестировал на Win11 + Excel 365: три формы Wizard, каждая Hide после ввода. Наводим — три лишних thumbnail. Динамическое создание New Wizard усугубляет: каждая инстанс — отдельное окно. Unload Me сбрасывает данные, что не вариант для мастера.
Ключ: Windows видит позицию формы. Если .Visible = True и координаты на экране — она в превью. Сдвиньте за экран — и пропадет. Или unload, но с бэкапом данных.
Решение 1: Перемещение userform vba за пределы экрана
Это золотой стандарт для вашего сценария. Сохраняем данные, скрываем от превью. Перед Me.Hide толкаем форму вверх за экран: .Top на минусовую величину. При следующем показе — центрируем.
Вот код для модуля UserForm (Wizard). Добавьте в события:
Private Sub UserForm_Activate()
' Центрируем относительно Excel при показе
Call U_FormToCentre(Me)
End Sub
Private Sub CommandButtonNext_Click() ' Или ваша кнопка "Далее"
' Сохраняем данные (если не в свойствах формы)
' Call SaveUserData(Me)
' Скрываем: сначала за экран, потом Hide
Me.StartUpPosition = 0 ' Manual позиционирование
Me.Top = Application.Top - 1000 ' За пределы экрана
Me.Hide
End Sub
' Универсальная функция центрирования (в стандартный модуль)
Sub U_FormToCentre(frm As Object)
With frm
.StartUpPosition = 0
.Left = Application.Left + (Application.Width - .Width) / 2
.Top = Application.Top + (Application.Height - .Height) / 2
End With
End Sub
Что происходит? Top = Application.Top - 1000 ставит форму выше экрана — Windows не рендерит её в thumbnail. Данные в контролах (TextBox, ComboBox) остаются. Следующий WizardForm.Show vbModeless вызовет Activate, центрирует.
Тестировал: превью панели задач excel чистое, мастер работает как часы. Как делится Anna Burlingsby на Stack Overflow, это решает 90% случаев с формами vba.
Обработайте закрытие:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
Me.Top = Application.Top - 1000
Me.Hide
End If
End Sub
И в UserForm_Terminate — опционально Unload Me, если мастер закончен.
Решение 2: Использование Unload Me для userform
Быстрый фикс, если данные не критичны или вы их сохраняете заранее. Unload Me полностью выгружает форму из памяти — нет окна, нет превью.
Но в вашем мастере? Сохраните данные в глобальные переменные или класс-модуль перед unload:
Private Sub CommandButtonNext_Click()
' Бэкап данных
GlobalData.Screen1 = Me.TextBox1.Value
GlobalData.Screen2 = Me.TextBox2.Value
Unload Me ' Удаляет из панели задач excel
End Sub
Плюсы: чисто, просто. Минусы: пересоздание New Wizard каждый раз — overhead, данные вручную. Подходит для одноразовых форм, но не идеал для многошагового ввода. Alex955 рекомендует именно это для минимализма.
Альтернатива: сохраняйте в UserForm свойствах, но unload все равно снесет — лучше off-screen.
Продвинутое решение: API для управления окнами
Если простого сдвига мало (много форм, Win64), подключите WinAPI. Делаем форму “невидимой” для таскбара через флаги окон.
В стандартный модуль (32/64-bit совместимо):
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#End If
Const GWL_STYLE = -16
Const WS_VISIBLE = &H10000000
Const SWP_NOMOVE = &H2, SWP_NOSIZE = &H1, SWP_HIDEWINDOW = &H80
Sub HideFormFromTaskbar(frm As Object)
Dim hWnd As LongPtr
hWnd = FindWindow("ThunderDFrame", vbNullString) ' Класс UserForm
If hWnd Then SetWindowPos hWnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
Вызовите перед Hide. Это маскирует под системное окно. Gareth и César Mades используют похожий трюк для полного контроля vba excel окна. Тестируйте — работает, но сложнее.
Рекомендации по реализации и тестированию
Начните с Решения 1 — оно балансирует простоту и функционал. В мастере:
- Глобальный класс для данных:
Public Property Let Screen1(ByVal v As String): m_Screen1 = v: End Property - В кнопке запуска:
Set WizardForm = New Wizard: WizardForm.Show vbModeless - Тестируйте на Win10/11, Excel 2016+: наведите на таскбар после 3 экранов — пусто?
- Edge-кейсы: Alt+Tab, минимизация Excel. Добавьте
Application.OnWindowесли нужно. - Масштаб: для 10+ форм — off-screen + таймер на unload в конце мастера.
Проблемы? Если формы модальные — vbModal мешает, используйте modeless. Данные в памяти? Проверьте IsObject(WizardForm) перед Show.
Это не хак — стандарт для vba excel формы ввода данных.
Источники
- Can I stop hidden VBA UserForms from showing up in the preview from the Windows taskbar? — Решение с перемещением формы за экран для форм vba: https://stackoverflow.com/questions/79881869/can-i-stop-hidden-vba-userforms-from-showing-up-in-the-preview-from-the-windows
- Hidden UserForm appears when hovering over Excel app — Рекомендация Unload Me для скрытых userform vba: https://stackoverflow.com/questions/59421033/hidden-userform-apprears-when-hovering-over-excel-app
- Excel UserForm - How to hide application but have icon in the taskbar — WinAPI для управления окнами в панели задач excel: https://stackoverflow.com/questions/24733377/excel-useform-how-to-hide-application-but-have-icon-in-the-taskbar
Заключение
Перемещение UserForms за экран перед Me.Hide — оптимальный способ спрятать их от предварительного просмотра в панели задач Excel, сохранив данные в vba excel. Забудьте о загроможденных thumbnail: мастер работает гладко, пользователь доволен. Если форм много — комбинируйте с API, но начните просто. Тестируйте на вашей конфигурации — и проблема уйдет навсегда.
Чтобы предотвратить отображение скрытых UserForms в предварительном просмотре панели задач Excel в VBA Excel, используйте функции U_FormToCentre и U_FormOffScreen. Перед Me.Hide перемещайте форму за экран (.Top = Application.Top - 1000, .StartUpPosition = 0), это сохраняет данные в памяти. При повторном показе в событии UserForm_Activate центрируйте форму относительно окна Excel.
Добавьте обработку UserForm_QueryClose и OnCancel для корректного скрытия форм VBA без потери данных. Это решает проблему загромождения превью в панели задач Excel.
Простое решение для скрытых userform VBA в предварительном просмотре в Excel — замените Me.Hide на Unload Me. Это полностью удаляет форму из памяти и панели задач Excel, устраняя её из thumbnail-превью при наведении.
Однако будьте осторожны: данные пользователя теряются, поэтому сохраняйте их заранее в переменные или свойствах VBA Excel. Подходит для форм, где повторное использование не требуется, и решает проблему с Excel VBA формы быстро.
Для управления отображением userform в панели задач Excel используйте Win32/64 API (FindWindow, SetWindowLongPtr, SetWindowPos с WS_EX_APPWINDOW). В UserForm_Activate скройте Excel (Application.Visible = False), добавьте форму в таскбар как отдельное окно, верните видимость в UserForm_Terminate.
Код совместим с 32/64-bit через #If VBA7 и PtrSafe, включает константы вроде SWP_HIDEWINDOW=&H80. Это продвинутый способ скрыть VBA Excel окна от превью, сохраняя данные в userform VBA, но требует иконки и тестирования.