Редактировать: объединенный код, приведенный ниже, изолирует экземпляр Excel с пользовательской формой, заставляя открывать другие файлы в другом экземпляре и заставляя открывать этот файл в своем собственном экземпляре. Позволяет использовать Application.Visible = False
Сначала убедитесь, что этот экземпляр Excel предназначен только для файла UserForm.
Когда вы открываете книгу, убедитесь, что она единственная в экземпляре.
Модуль ThisWorkbook:
'I'll explain why you need the App variable below
Private WithEvents App As Application
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Wb = ThisWorkbook
If Application.Workbooks.Count > 1 Then
'Not on its own instance
Wb.Close False
Else
'Alright, it's the only workbook, lets open the form
Set App = Application
Application.Visible = False
UserFormName.Show vbModeless
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Возможно, вы думаете: «Ну, это означает, что я должен убедиться, что я открою этот файл перед любыми другими файлами, иначе он не будет работать». Это правда, но вы можете обойти это, создав ярлык для Excel, указав параметр «/ X», который нужно открыть для нового экземпляра, и файл. Таким образом, он откроется в новом экземпляре, даже если открыты другие файлы. Другими словами, найдите файл EXCEL.exe, создайте для него ярлык и измените цель на "C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" /X "FilePath\FileName.xlsm"
Путь EXCEL может отличаться в зависимости от версии Excel.
Что произойдет, если я попытаюсь открыть другой файл Excel, и он попытается открыть его в этом случае? Именно здесь в игру вступает переменная App
. Следующие две подписки являются обработчиками событий, когда вы пытаетесь открыть файл или новую книгу.
'On new blank Workbook Open
Private Sub App_NewWorkbook(ByVal Wb As Workbook)
Set cwb = ThisWorkbook
If Wb.Name <> cwb.Name Then
Dim opFile As Variant
Application.DisplayAlerts = False
Wb.Close False
opFile = Shell("EXCEL /X ", vbNormalFocus)
Application.DisplayAlerts = True
End If
End Sub
'On File Workbook Open
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
Set cwb = ThisWorkbook
If Wb.Name <> cwb.Name Then
Dim fDir As String, opFile As Variant
fDir = Wb.Path & "\" & Wb.Name
Application.DisplayAlerts = False
Wb.Close False
opFile = Shell("EXCEL /X """ & fDir & """", vbNormalFocus)
Application.DisplayAlerts = True
End If
End Sub
Новый экземпляр excel становится «предпочтительным для Windows», поэтому любые новые открытые книги будут пытаться открываться в новом экземпляре, оставляя только пользовательскую форму. И готово, этот файл всегда должен быть в своем собственном экземпляре. Если вы попытаетесь открыть другой файл или новую книгу, они должны открыться в новом экземпляре с этими обработчиками.
Примечание. Некоторые обработчики событий активируются при открытии файла. Если вы вносите какие-либо изменения в код, вам может потребоваться сохранить и снова открыть файл, чтобы они работали должным образом.