UserForm.Show активирует другую книгу в Excel VBA

Я назначаю сочетание клавиш для открытия пользовательской формы 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

Попробуйте Set wb = ThisWorkbook

Siddharth Rout 31.07.2024 14:26

Пробовал, но не помогло

Sergeman 31.07.2024 15:16

Пробовали ли вы явно указать имя книги? Что может произойти, так это то, что «Эта рабочая книга» по-прежнему является другой книгой в более широком контексте, которую мы здесь не видим. лайк Workbooks(Filename & ".xlsx").Activate

Mark S. 31.07.2024 17:14

По умолчанию пользовательская форма всегда отображается поверх активного окна Excel. Есть ли код, который активирует другую книгу, которая запускается при открытии формы?

jkpieterse 31.07.2024 17:22
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы это сделаете Me.Hide, форма станет невидимой, но останется «привязанной» к книге, которая была активной, когда вы открыли форму. Когда вы попытаетесь снова отобразить форму, она действительно «заново активирует» книгу, которая была активна при первом появлении формы.

Демо 1:

  • Мы инициализируем форму, пока Book1.xlsm активен.
  • Скрываем форму.
  • Открываем Book2.xlsm, затем снова показываем форму.
  • Book1.xlsm отображается за формой :(

Чтобы быстро это исправить, вы можете просто использовать Unload вместо того, чтобы скрывать пользовательскую форму.

Sub CloseButton_Click()
    Unload Me
End Sub

Демо 2:

  • Возобновляя работу после демонстрации 1, мы выгружаем пользовательскую форму.
  • Активируйте Book2.xlsm, затем отобразите пользовательскую форму.
  • Book2.xlsm остается видимым, поскольку форма была повторно инициализирована :)
  • Теперь, если мы скроем форму; откройте Book1.xlsm; и попробуйте показать пользовательскую форму оттуда, теперь за формой появится Book2.xlsm.

Недостатком этого подхода является то, что вам придется повторно инициализировать пользовательскую форму каждый раз, когда вы хотите ее отобразить. Если это дорогостоящая операция, существует альтернативный подход, но вам придется выполнять вызовы Windows API, чтобы изменить порядок окон, что может быть излишним для ваших нужд. Однако при необходимости я всегда могу добавить что-нибудь по этому поводу к своему ответу.

Другие вопросы по теме