UserFormを最前面に常に表示したい
マクロ代行開発案件にて、ブックが重すぎるのかUserFormが最前面に表示されない現象を確認しました。
WindowsAPIで無理やり最前面に表示ができるようなので、そちらで実装しました。
UserFormを最前面に表示するサンプルコード
Userform内に記載をして下さい。
#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 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 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 HWND_TOPMOST As Long = -1 Const SWP_NOSIZE As Long = 1 Const SWP_NOMOVE As Long = 2 Private Sub UserForm_Initialize() #If VBA7 Then Dim hWnd As LongPtr #Else Dim hWnd As Long #End If '■最前面に表示するUserformのWindowハンドルを取得 hWnd = FindWindow(vbNullString, Me.Caption) '■ウィンドウをを常に最前面に配置 Call SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE) End Sub
注意点
- コードは該当のUserformに記載すること。標準モジュールなどでは読み込めません。
コメント