Форма VBA (автоматически) привязана / привязана к ActiveWorksheet при вызове формы. Show vbmodeless - PullRequest
3 голосов
/ 17 января 2020

Это было трудно описать в Google, но сценарий выглядит следующим образом ..

У меня есть кнопка на ленте, которая связана с подпрограммой, которая запустит мою форму:

Sub Start()
    MyForm.Init
    MyForm.Show vbModeless
End Sub

Код, вызванный моей формой, делает некоторые вещи и создает новую рабочую книгу. При создании новой книги форма исчезает. При возврате формы она извлекает рабочую книгу, которая была активной при показе формы. Я хочу, чтобы новая рабочая книга была активной, а форма - активной, чтобы выполнять больше действий с формой с новой рабочей таблицей.

Есть ли другой способ вызвать / загрузить форму, чтобы она не была "связана" с книгой?

1 Ответ

2 голосов
/ 17 января 2020

Да, это может быть достигнуто, но с использованием API SetWindowPos и FindWindowA. Вы можете прочитать об этих API Здесь

Это то, что вы пытаетесь?

Код :

Option Explicit

Private Const SWP_NOMOVE = 2
Private Const SWP_NOSIZE = 1    
Private Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2

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

Private Declare Function FindWindowA _
Lib "user32" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Sub Sample()
    Dim hwnd As Long

    UserForm1.Show vbModeless

    '~~> Find the handle of the userform
    hwnd = FindWindowA("ThunderDFrame", UserForm1.Caption)

    '~~> Set the form as the top most window
    SetTopMostWindow hwnd, True
End Sub

Private Function SetTopMostWindow(hwnd As Long, Topmost As Boolean) As Long
    If Topmost = True Then
        SetTopMostWindow = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
    Else
        SetTopMostWindow = SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
        SetTopMostWindow = False
    End If
End Function

Тестирование

  1. Вставьте код в модуль рабочей книги с пользовательской формой.
  2. Откройте две рабочие книги.
  3. Замените Userform1 на Ваше имя пользователя.
  4. Запустите pro c Sample.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...