【VBA】外部アプリのウィンドウを最前面に表示する方法 (SetForegroundWindow API)

目次

はじめに

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の FindWindowSetForegroundWindow を組み合わせて、特定のアプリケーションウィンドウを最前面に表示する方法を解説しました。

  1. FindWindow で、目的のウィンドウのハンドルを取得する。
  2. 取得したハンドルを SetForegroundWindow に渡して、ウィンドウをアクティブ化する。

このテクニックを使えば、マクロの実行中にユーザーに確認してもらいたい別アプリのウィンドウを確実に手前に表示させたり、複数のアプリケーションを切り替えながら操作するような、より高度な自動化処理を構築することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次