教えて!ExcelVBA!

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

ExcelVBAでWindowsAPIを使いウィンドウに直接メッセージを送信する方法

API宣言

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

Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

解説

この宣言では、SendMessage関数(ウィンドウに直接メッセージを送信)が使用できる様になります。この関数ではメッセージを指定する必要があります。以下に幾つか代表的なメッセージの種類を紹介しておきます。

メッセージ名 値(16進数) 説明
WM_CLOSE &H10 ウィンドウを閉じます。
WM_SETTEXT &HC ウィンドウのテキスト(タイトル)を設定します。
WM_GETTEXT &HD ウィンドウのテキスト(タイトル)を取得します。
WM_ENABLE &HA ウィンドウを有効または無効にします。
WM_QUIT &H12 アプリケーションを終了します。

プログラミング例

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

Sub ウィンドウを閉じる()
    Dim ウィンドウ識別子 As Long
    Dim メッセージの種類 As Long
    Dim 結果 As Long
    ' メモ帳(notepad)のウィンドウ識別子を取得する
    ウィンドウ識別子 = FindWindow("Notepad", vbNullString)
    ' WM_CLOSE(ウィンドウを閉じるメッセージ)
    メッセージの種類 = &H10 
    ' ウィンドウを閉じるメッセージを送る
    結果 = SendMessage(ウィンドウ識別子, メッセージの種類, 0, 0)
    If 結果 = 0 Then
        MsgBox "ウィンドウを閉じました。"
    Else
        MsgBox "ウィンドウを閉じることができませんでした。"
    End If
End Sub

上記のプログラムは、メモ帳を閉じるメッセージを送信する内容です。ウィンドウハンドル(ウィンドウ識別子)の取得方法については、こちらのサイトも参考にして下さい。

まとめ

WindowsAPI関数:SendMessageを使用し、ウィンドウに直接メッセージを送信する方法について紹介しました。