その他

VBAでHandle等を用いて他のアプリケーションを操作する方法[No20]

スポンサーリンク

VBAでIE(Internet Explorer)の操作ができるようになり、次は他のアプリケーションを操作する方法について自分用のメモとして残しておくので、定期的な確認作業をオートメーションする際のヒントにしてもらえたら幸いです。

他のアプリケーションの操作方法

手順1

ログイン画面のあるアプリケーションを起動する。

手順2

ログインを行う。

手順3

ログイン後の画面をスクリーンショットで、Excelのシートに貼り付ける。

手順4

手順3のシートをPDF出力する。

手順5

手順4のシートを別のエクセル出力する。

※今回は紹介しませんが、この手順5の後にメール送信を行えたら尚良いと思います。

FFFTPを対象とした際のツール作成手順

近内はログイン画面のあるアプリケーション(ソフトウェア)として、FFFTPを作業の対象とするようになったので、そちらの手順もここに記しておきたいと思います。

作成手順

手順1

下記リンクの記事に沿ってツールを作成し、そのツールを用いて手順を進める。

no image
VBAのユーザーフォームでハンドル情報を取得する方法[No19]
動機 自宅にてアプリケーションの自動操作を行うプログラムを作成する機会がありました。 ほとんどのWindowsのアプリケーションは、管理番号がふられた部品で構成されています。 この管 ...

手順2

窓の杜からFFFTPをダウンロードして「 "C:\ffftp\FFFTP.exe" 」となるように保存しておく。

「FFFTP」定番FTPクライアントソフト - 窓の杜
「FFFTP」定番FTPクライアントソフト - 窓の杜

FFFTPのダウンロードはこちら  左右分割型で日本語UIのFTPクライアント。ウィンドウ内左右にローカルディスク側とホスト側のファイル一覧を表示し、ドラッグ&ドロップや右クリックメニューなどの操作で ...

続きを見る

※窓の杜では、アプリケーション(ソフトウェア)を窓の杜ソフトライブラリに収録する際、配布元からダウンロードし、ウイルスバスタークラウド、ノートンセキュリティ、ESET Internet Security、Windows Defenderという4つのウイルス対策ソフトで、常に最新のウイルス定義ファイルを使用してウイルスチェックが実施されています。そのため、FFFTPは比較的安全に使用することができるアプリケーションであると言えるでしょう。

窓の杜 - 窓の杜でのウイルスチェックについて
窓の杜 - 窓の杜でのウイルスチェックについて

続きを見る

スポンサーリンク

手順3

Excel(拡張子xlsm)を新規作成した後、モジュール(Module1)を作成したら、次のコードで上書きする。


Option Explicit

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

Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
    (ByVal hWndParent As Long, ByVal hwndChildAfter As Long, _
     ByVal lpszClass As String, ByVal lpszWindow As String) As Long

Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
                (ByVal hWnd As Long, _
                 ByVal Msg As Long, _
                 ByVal wParam As Long, _
                 ByVal lParam As String) As Long

Private Declare Sub keybd_event Lib "USER32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Sub Main()

    '①区切り線#############################################################################
    '画面0:FFTP起動
    On Error GoTo ErrEnd
        Dim ret As Long
        ret = Shell("C:\ffftp\FFFTP.exe", vbNormalFocus)
    On Error GoTo 0
    
    DoEvents
    Application.Wait Now() + TimeValue("00:00:03")
    DoEvents


    '②区切り線#############################################################################
    Dim className As String
    Dim windowTitleName As String
    '画面1:FFTP起動画面
    className = "#32770"
    windowTitleName = "FFFTP"
    Dim handleOwner As Long
    handleOwner = FindWindow(className, windowTitleName)
    Dim handlechild As Long
    handlechild = FindWindowEx(handleOwner, 0, "Edit", vbNullString)
    Call SendMessage(handlechild, &HC, 0, "Password")
    Dim handleButton As Long
    handleButton = FindWindowEx(handleOwner, 0, "Button", "OK")
    Call SendMessage(handleButton, &H6, 1, 0&)  'ボタン→アクティブ化
    Call SendMessage(handleButton, &HF5, 0, 0&) 'ボタン→クリック

    DoEvents
    Application.Wait Now() + TimeValue("00:00:03")
    DoEvents
    
    
    '③区切り線#############################################################################
    '画面2:ホスト一覧画面
    className = "#32770"
    windowTitleName = "ホスト一覧"
    handleOwner = FindWindow(className, windowTitleName)
    AppActivate windowTitleName
    
    handleButton = FindWindowEx(handleOwner, 0, "Button", "閉じる(&O)")
    Call SendMessage(handleButton, &H6, 1, 0&)  'ボタン→アクティブ化
    Call SendMessage(handleButton, &HF5, 0, 0&) 'ボタン→クリック   
    DoEvents
    Application.Wait Now() + TimeValue("00:00:03")
    DoEvents
    
    
    '④区切り線#############################################################################
    '画面3:FFTP(*)画面
    className = "FFFTPWin"
    windowTitleName = "FFFTP (*)"
    handleOwner = FindWindow(className, windowTitleName)
    AppActivate windowTitleName
    
    
    '⑤区切り線#############################################################################
    'アクティブ画面スクリーンショット
    keybd_event &HA4, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
    keybd_event &HA4, 0&, &H1 Or &H2, 0&
    
    '全画面スクリーンショット
    'keybd_event vbKeySnapshot, 0&, &H1, 0&
    'keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
    
    DoEvents
    Application.Wait Now() + TimeValue("00:00:01")
    DoEvents
    
    
    '⑥区切り線#############################################################################
    'Sheet1に貼り付け
    Dim sheetName As String
    sheetName = "Sheet1"
    Worksheets(sheetName).Activate
    Range("A1").Select
    ActiveSheet.Paste    'または、SendKeys "+(^V)", True

    DoEvents
    Application.Wait Now() + TimeValue("00:00:01")
    DoEvents

    Range("A25").Select
    ActiveSheet.Paste    'または、SendKeys "+(^V)", True
    
    
    '⑦区切り線#############################################################################
    '出力
    Dim fileName As String
    fileName = "資料(" & Format(Now(), "YYYY年MM月DD日") & "(" & Format(Now(), "aaa") & ")" & "_" & Format(Now(), "hh時nn分ss秒出力") & ")"
    
    'PDF出力
    With ActiveSheet.PageSetup
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ThisWorkbook.Path & "\" & fileName & ".pdf"
    
    
    '⑧区切り線#############################################################################
    'Excel出力
    Application.DisplayAlerts = False
    Sheets(sheetName).Copy
    ActiveWorkbook.SaveAs _
    fileName:=ThisWorkbook.Path & "\" & fileName, _
    FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    ActiveWindow.Close
    ActiveSheet.DrawingObjects.Delete
    ThisWorkbook.Close
    Application.DisplayAlerts = True
    
    
    '⑨区切り線#############################################################################
    Exit Sub
ErrEnd:
    MsgBox "実行できませんでした。" & vbCrLf & "エラー内容:" & Err.Description
    
End Sub

この手順でツールを作成したところ、私のPCでMainを実行すると、期待していた動作を得ることができました。

関連記事

no image
ウィンドウハンドル関連の記事一覧[No74]
記事一覧 ハンドル番号、キャプション名、クラス名について書かれた記事のまとめです。 最後までお付き合いいただきありがとうございます! この情報が誰かの役にたてれば幸 ...

雑記

1日に何か1つでも良いことがあると、心地よく眠れますよね。
天気が良かったとか、早く仕事が終わったとか、夕飯が美味しかったとか、どんな小さなことでもいいんです。この記事を読んでくれた皆さんにとって、明日も何か良いことがありますように。

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他