Я назначаю сочетание клавиш для открытия пользовательской формы VBA в Excel. По какой-то причине, когда отображается пользовательская форма, Excel активирует книгу, которая была активна при первом отображении пользовательской формы. Код ванильный. Кто-нибудь знает, почему это происходит и как это исправить?
Sub AssignShortcuts()
Application.OnKey "^+%s", "UserFormShow"
End Sub
Sub UserFormShow()
UserForm.Show
End Sub
Sub CloseButton_Click()
Me.Hide
End Sub
Я попытался захватить и повторно активировать активную книгу в UserFormShow(), но это не помогло. Debug.print выводит нужную книгу, но она не активируется.
Sub UserFormShow()
Dim wb As Workbook
Set wb = ActiveWorkbook
frmMain.Show
wb.Activate
Debug.Print "Activated Workbook: " & wb.Name
End Sub
Пробовал, но не помогло
Пробовали ли вы явно указать имя книги? Что может произойти, так это то, что «Эта рабочая книга» по-прежнему является другой книгой в более широком контексте, которую мы здесь не видим. лайк Workbooks(Filename & ".xlsx").Activate
По умолчанию пользовательская форма всегда отображается поверх активного окна Excel. Есть ли код, который активирует другую книгу, которая запускается при открытии формы?
Когда вы это сделаете Me.Hide
, форма станет невидимой, но останется «привязанной» к книге, которая была активной, когда вы открыли форму. Когда вы попытаетесь снова отобразить форму, она действительно «заново активирует» книгу, которая была активна при первом появлении формы.
Демо 1:
Чтобы быстро это исправить, вы можете просто использовать Unload
вместо того, чтобы скрывать пользовательскую форму.
Sub CloseButton_Click()
Unload Me
End Sub
Демо 2:
Недостатком этого подхода является то, что вам придется повторно инициализировать пользовательскую форму каждый раз, когда вы хотите ее отобразить. Если это дорогостоящая операция, существует альтернативный подход, но вам придется выполнять вызовы Windows API, чтобы изменить порядок окон, что может быть излишним для ваших нужд. Однако при необходимости я всегда могу добавить что-нибудь по этому поводу к своему ответу.
Попробуйте
Set wb = ThisWorkbook