教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA API操作】アプリケーションの重複起動を回避(FindWindow)する方法を教えて!

FindWindow関数は、WindowsAPIの1つで、アプリケーションが起動しているかを確認するために使用されます。FindWindowを使用する事でアプリケーションの重複起動を回避する事も可能です。

API宣言

ExcelVBAでは、FindWindow関数を使用する前にAPI宣言を行う必要があります。API宣言を行うことで、ExcelVBAがWindowsAPI関数を認識することができるようになります。API宣言は次のように行います。

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

解説

パラメータ 内容
Lib 使用する動的リンクライブラリ(DLL)の名前を指定します。ここでは "user32.dll"となります。
Alias API関数名を指定します。ここでは"FindWindowA"という関数名が指定されています。

引数については以下の通りです。

引数 内容
lpClassName ウィンドウクラス名をセットします。以下に代表的なウィンドウクラス名を幾つか紹介します。
lpWindowName ウィンドウ名を指定します。基本には「vbNullString」をセットします。

ウィンドウクラス名は以下の通りです。

ウィンドウ クラス名
Access OMain
Excel XLMAIN
Word OpusApp
PowerPoint PP10FrameClass
Internet Explorer IEFrame
Visual Basic Editor wndclass_desked_gsk
エクスプローラ ExploreWClass
メモ帳 Notepad
ワードパッド WordPadClass
電卓 SciCalc
ペイント MSPaintApp

使い方

FindWindow関数を呼び出し、アプリケーションが起動しているかを確認します。

Dim hwnd As Long
hwnd = FindWindow("Notepad", vbNullString)

APIの戻り値として、アプリケーション起動結果を示す数値が返されます。条件に一致するウィンドウが見つかった場合はそのウィンドウのハンドル(HWND型)を返します。もし条件に一致するウィンドウが見つからない場合は、NULLに相当する値である0が返されます。

プログラミング例

以下に、プログラミング例を紹介します。

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub CheckNotepadRunning()
    Dim hwnd As Long
    hwnd = FindWindow("Notepad", vbNullString)
    If hwnd <> 0 Then
        MsgBox "Notepadが起動しています。ウィンドウハンドル: " & hwnd
    Else
        MsgBox "Notepadは起動していません。"
    End If
End Sub

上記は、Notepad(メモ帳)が起動しているかを確認するサンプルコードです。

まとめ

FindWindow関数を利用することで、指定したウィンドウクラス名またはウィンドウ名を持つアプリケーションの存在を確認することができます。是非活用してください。