Accessフォームを常に最前面に表示する

2019年11月11日Form

Always display the Access form on top

フォームの「ポップアップ」プロパティを「はい」にするとAccess内のウィンドウの最前面に表示されますがが、他のアプリケーションがアクティブになるとその背後に隠れてしまいます。他のアプリケーションも含めてフォームを常に最前面に表示したいという場合もありますよね。

その場合、Windows APIのSetWindowPosを使うと他アプリケーションがアクティブになっても最前面に常に表示させることが可能になります。

Windows API の SetWindowPos の宣言

標準モジュールの宣言部に下記のコードをコピーして貼り付けます。

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
​
Public Const HWND_TOPMOST = -1
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2

フォームを常に最前面に表示する関数

上記の標準モジュールに下記の関数もコピーして貼り付けます。

'フォームを常に最前面に表示
Function TopMost(F As Form)
    Call SetWindowPos( _
         F.hwnd, HWND_TOPMOST, 0, 0, 0, 0, _
         SWP_NOMOVE Or SWP_NOSIZE)
End Function

使用法

最前面に表示したいフォームの「ポップアップ」プロパティを「はい」にします。 フォームの「開く時」と「閉じる時」のイベントプロシージャを下記のように記述します。

Private Sub Form_Open(Cancel As Integer)
    Call TopMost(Me)
    DoCmd.RunCommand acCmdAppMinimize 'Accessウィンドウの最小化
End Sub
​
Private Sub Form_Close()
    DoCmd.RunCommand acCmdAppRestore 'Accessウィンドウも元に戻す
End Sub

これでこのフォームを開くと常に最前面に表示されます。

Accessウィンドウの最小化は、全面表示のフォームをアクティブにするとAccessウィンドウも前面に表示されしまうのを防ぐためです。

対応バージョン

Access2010l以降の64bit版と32bit版に対応してます。

Office2007以前にも対応させる必要がある場合は、下記リンクを参考に書き換えてください。
WindowsAPI をOffice64bit版または32bit版のVBAで使うには

まとめ

コードをコピーするだけで簡単に実現できます。

使い道としては、アクセスのデータを参照しながら、他のアプリケーションを操作したいときなどに使うといいでしょう。

FormAccess,Form,VBA,WindowsAPI

Posted by hatena