Программирование

Скрыть UserForms VBA от превью панели задач Excel без потери данных

Как предотвратить отображение скрытых форм VBA в предварительном просмотре панели задач Windows в Excel. Решения с сохранением данных: перемещение за экран, Unload Me и WinAPI для vba excel, формы vba, userform vba.

4 ответа 1 просмотр

Как предотвратить отображение скрытых UserForms VBA в предварительном просмотре панели задач Windows в Excel, сохраняя при этом введенные пользователем данные?

В Excel-книге используется несколько UserForms для сбора информации от пользователя и автоматического создания документа (аналогично мастеру). Процесс:

  1. Нажатие кнопки для запуска мастера.
  2. Ввод данных в экран 1.
  3. Ввод данных в экран 2.
  4. Ввод данных в экран 3.
  5. Создание документа.

Формы скрываются после использования с помощью 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 — так превью останется чистым, а процесс ввода не прервется.

Загроможденный предварительный просмотр панели задач Excel с скрытыми UserForms VBA

Содержание


Проблема отображения скрытых 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 превращается в помойку. Пользователи жалуются, а вы ищете фикс без потери данных. Решения есть, и они просты в реализации.

Чистый предварительный просмотр панели задач Excel после фикса скрытых UserForms VBA

Почему формы 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). Добавьте в события:

vba
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.

Обработайте закрытие:

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:

vba
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 совместимо):

vba
#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 — оно балансирует простоту и функционал. В мастере:

  1. Глобальный класс для данных: Public Property Let Screen1(ByVal v As String): m_Screen1 = v: End Property
  2. В кнопке запуска: Set WizardForm = New Wizard: WizardForm.Show vbModeless
  3. Тестируйте на Win10/11, Excel 2016+: наведите на таскбар после 3 экранов — пусто?
  4. Edge-кейсы: Alt+Tab, минимизация Excel. Добавьте Application.OnWindow если нужно.
  5. Масштаб: для 10+ форм — off-screen + таймер на unload в конце мастера.

Проблемы? Если формы модальные — vbModal мешает, используйте modeless. Данные в памяти? Проверьте IsObject(WizardForm) перед Show.

Это не хак — стандарт для vba excel формы ввода данных.


Источники

  1. 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
  2. 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
  3. 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, но начните просто. Тестируйте на вашей конфигурации — и проблема уйдет навсегда.

A

Чтобы предотвратить отображение скрытых UserForms в предварительном просмотре панели задач Excel в VBA Excel, используйте функции U_FormToCentre и U_FormOffScreen. Перед Me.Hide перемещайте форму за экран (.Top = Application.Top - 1000, .StartUpPosition = 0), это сохраняет данные в памяти. При повторном показе в событии UserForm_Activate центрируйте форму относительно окна Excel.

Скриншот Excel-книги без отображения скрытых UserForms в нормальном виде

Добавьте обработку UserForm_QueryClose и OnCancel для корректного скрытия форм VBA без потери данных. Это решает проблему загромождения превью в панели задач Excel.

A

Простое решение для скрытых userform VBA в предварительном просмотре в Excel — замените Me.Hide на Unload Me. Это полностью удаляет форму из памяти и панели задач Excel, устраняя её из thumbnail-превью при наведении.

Скриншот загромождённого превью панели задач с множеством скрытых UserForms

Однако будьте осторожны: данные пользователя теряются, поэтому сохраняйте их заранее в переменные или свойствах VBA Excel. Подходит для форм, где повторное использование не требуется, и решает проблему с Excel VBA формы быстро.

G

Для управления отображением 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, но требует иконки и тестирования.

Авторы
A
Разработчик
A
Разработчик
G
Разработчик
C
Разработчик
Проверено модерацией
НейроОтветы
Модерация