VBATips

UserFormを最前面に表示する【WindowsAPI】【ExcelVBA】

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に記載すること。標準モジュールなどでは読み込めません。

関連記事

コメント

タイトルとURLをコピーしました