教えて!ExcelVBA!

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

ExcelVBAでWindowsAPIを使いアプリケーションの起動を確認する方法

API宣言

WindowsAPI(関数)を使うためには、事前に宣言が必要となります。

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

解説

この宣言では、FindWindow関数(アプリケーション起動を確認)が使用できる様になります。この関数ではアプリケーションのクラス名やウィンドウ名を指定する必要があります。以下に幾つか代表的なアプリケーションの情報を紹介しておきます。

アプリケーション名 クラス名 ウィンドウ名(例)
メモ帳 Notepad 無題 - メモ帳
電卓 CalcFrame 電卓
Microsoft Word OpusApp 文書1 - Word
Microsoft Excel XLMAIN Book1 - Excel
Microsoft PowerPoint PPTFrameClass プレゼンテーション1 - PowerPoint
Microsoft Access OMain 無題 - Access
IE IEFrame 無題 - インターネット エクスプローラー
Google Chrome Chrome_WidgetWin_1 無題 - Google Chrome
エクスプローラー CabinetWClass デスクトップ
Adobe Acrobat Reader AcrobatSDIWindow 無題 - Adobe Acrobat Reader
Oracle SQL Developer SunAwtFrame Oracle SQL Developer
SAP GUI for Windows SAP_FRONTEND_SESSION SAP Easy Access

プログラミング例

具体的なプログラミング例を紹介します。

Sub ウィンドウを探す()
    ' 変数の宣言
    Dim クラス名 As String
    Dim ウィンドウ名 As String
    Dim ウィンドウハンドル As Long
    ' クラス名とウィンドウ名を設定
    クラス名 = "Notepad"  ' 今回はクラス名をメモ帳にする
    ウィンドウ名 = vbNullString  ' ウィンドウ名は空にする
    ' FindWindow関数を呼び出して、ウィンドウハンドルを取得
    ウィンドウハンドル = FindWindow(クラス名, ウィンドウ名)
    ' 結果を表示
    If ウィンドウハンドル <> 0 Then
        MsgBox "メモ帳のウィンドウが見つかりました。ハンドル:" & ウィンドウハンドル
    Else
        MsgBox "メモ帳のウィンドウが見つかりませんでした。"
    End If
End Sub

上記のプログラムは、メモ帳が既にを開いているか確認し、結果を表示する内容です。既に開いている場合には、任意の番号をウィンドウハンドルに返します。

まとめ

WindowsAPI関数:FindWindowを使用し、アプリケーションの重複起動を確認する方法について紹介しました。