はじめに
VBAマクロから Shell
関数で他のアプリケーションを起動したり、既に開いているアプリケーションを操作したりする際、「目的のウィンドウが他のウィンドウの背面に隠れてしまっていて見えない」ということがあります。
このような場合に、指定したウィンドウを強制的に一番手前に表示させ、アクティブな状態にするのが、Windows APIの SetForegroundWindow
関数です。
この記事では、まず FindWindow
APIで目的のウィンドウを探し出し、次に SetForegroundWindow
APIを使ってそのウィンドウを最前面に表示する、という一連の流れを解説します。
ウィンドウを最前面に表示するVBAサンプルコード
このマクロは、Windowsの「電卓」が既に起動しているかを確認し、もし起動していれば、そのウィンドウを一番手前に表示します。
Declare
ステートメントは、モジュールの最上部(Sub
などのプロシージャよりも前)に記述する必要があります。
完成コード
'--- モジュールの最上部にAPI関数を宣言 ---
' 64bit/32bit両対応
#If VBA7 Then
' ウィンドウを探すためのAPI関数
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
' ウィンドウを最前面に表示するためのAPI関数
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If
' 電卓のウィンドウを探して、最前面に表示する
Sub BringCalculatorToFront()
Const APP_CLASS_NAME As String = "CalcFrame" ' 電卓のウィンドウクラス名
Dim windowHandle As LongPtr
'--- 1. FindWindowで、電卓のウィンドウが存在するか探す ---
windowHandle = FindWindow(APP_CLASS_NAME, vbNullString)
'--- 2. 結果を判定 ---
If windowHandle = 0 Then
' ハンドルが見つからなかった(0)場合は、起動していない
MsgBox "電卓は起動していません。", vbExclamation
Else
' ハンドルが見つかった場合は、そのウィンドウを最前面に表示
SetForegroundWindow windowHandle
MsgBox "電卓を最前面に表示しました。"
End If
End Sub
コードの解説
FindWindow
API関数
SetForegroundWindow
を使うには、まず目的のウィンドウのハンドル(ウィンドウを識別するためのユニークな数値)を知る必要があります。FindWindow
は、指定したクラス名(例: "CalcFrame"
)やウィンドウタイトルに一致するウィンドウを探し出し、そのハンドルを返します。見つからなければ 0
を返します。
SetForegroundWindow
API関数
これが、ウィンドウを最前面に表示する核心部分です。
SetForegroundWindow windowHandle
:FindWindow
で取得したwindowHandle
を引数として渡すことで、そのハンドルを持つウィンドウをアクティブにし、ユーザーがすぐに操作できる状態にします。
この関数は、ウィンドウを最小化から復元したり、他のウィンドウの背後から手前に移動させたりする効果があります。
まとめ
今回は、Windows APIの FindWindow
と SetForegroundWindow
を組み合わせて、特定のアプリケーションウィンドウを最前面に表示する方法を解説しました。
FindWindow
で、目的のウィンドウのハンドルを取得する。- 取得したハンドルを
SetForegroundWindow
に渡して、ウィンドウをアクティブ化する。
このテクニックを使えば、マクロの実行中にユーザーに確認してもらいたい別アプリのウィンドウを確実に手前に表示させたり、複数のアプリケーションを切り替えながら操作するような、より高度な自動化処理を構築することができます。