2026年6月16日火曜日

vbaでプロセスが実行中かどうか調べる

 vbaでプロセスが実行中かどうかを判別する。

WindowsAPIのFindWindowと異なり、タスクトレイ常駐タイプ(Window名が出ないプログラム)にも使える。



Sub Test()
    If IsProcessRunning("WowShot2.exe") Then
        MsgBox "WowShot2.exe は起動中です"
    Else
        MsgBox "WowShot2.exe は起動していません"
    End If
End Sub

Function IsProcessRunning(processName As String) As Boolean
    Dim objWMI As Object
    Dim colProcess As Object

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colProcess = objWMI.ExecQuery( _
        "SELECT * FROM Win32_Process WHERE Name='" & processName & "'")
    IsProcessRunning = (colProcess.Count > 0)
End Function

Sub RunWowShot2()
    If Not IsProcessRunning("WowShot2.exe") Then
        Shell "C:\path\WowShot2.exe"
    End If
End Sub

2026年2月7日土曜日

Excelのvbaで他のアプリのウィンドウ内のテキストボックスにテキストを入力する

Excelのvbaで他のアプリのウィンドウ内のテキストボックスにテキストを入力し、ボタンを押します。 

Windows API (Win32 API)を使う。
DFindWindow系はクラス名かウィンドウハンドルのどちらかを指定する。指定しない方はvbNullString。

32bit環境でしか動作確認を行っておらず、DecleareにPtrSafeをつけてみたけどそれでOKかどうかよくわからない。LongPtrに変更が必要な個所があるかもしれない。


Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As String) As LongPtr

Sub test()
    Dim mainHwnd As Long, editHwnd As Long, btnHwnd As Long
    Const WM_SETTEXT As Long = &HC
    Const BM_CLICK As Long = &HF5
   
    mainHwnd = FindWindow(vbNullString, "Meiryo UIも大っきらい!!")
    editHwnd = FindWindowEx(mainHwnd, 0&, "Edit", vbNullString)
    btnHwnd = FindWindowEx(mainHwnd, 0&, vbNullString, "設定せず終了")
   
    Call SendMessage(editHwnd, WM_SETTEXT, 0, "メイリオ  11pt")
    Call SendMessage(btnHwnd, BM_CLICK, 0, 0)
End Sub


参考にしたサイト様
【VBA×WindowsAPI】Buttonコントロールを操作する LiCLOG様

VBAでWin32APIを使ってシートの文章を全てメモ帳に自動入力する方法 Excel作業をVBAで効率化 様

ウィンドウのハンドル・クラス名一覧を作成する Excel Tips for Learners様