VBA 画面タイトルを指定しIEを待機する

VBAで基幹システム(Web)を操作するためのRPAツールを作っている。

画面に値を入力してから、内部処理が完了するまでの間に動作を待機する必要がある。一律でSleepを入れると無駄な時間が発生して動作が不安定になるのでIEの動作が完了するまで待機する処理を実装する。

うまく作れればExcelで簡単なRPAツールを作ることができる。マウス操作、クリック、指定した画面をアクティブにする、コピー、貼り付け、ぐらいは問題なく関数は作れているのであとは組み合わせるだけ。

フリーソフトをインストールする必要がないのでExcelだけ入っていれば使える簡易なRPAになる。のんびりと作っていこうと思う。


<使い方>

 ・標準モジュールに貼り付け

 ・GetIEWindowTitlesでタイトルを確認

 ・WaitIEの引数に確認したタイトルを指定(部分一致)


 Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


'IEの動作を待機する

Public Function WaitIE(ByVal strCaption) AS Boolean

    Dim shells As Object

    Dim shell As Object

    DIm tgtIE As Object

    For i = 0 To 100

        Set shells = CreateObject("Shell.Application")

        For Each shell In shells.Windows

            If TypeName(shell.document) = "HTMLDocument" Then

                If InStr(shell.document.Title,strCaption) > 0 Then

                    Set tgtIE = shell

                    Exit For

                End If

            End IF

        Next

        If Not tgtIE Is Nothing Exit For

        Sleep 100

    Next


    If tgtIE Is Nothing Then

        WaitIE = False

    Else

        'IEが動作中の場合は待つ

        Do While tgtIE.Busy = True Or tgtIE.readyState <> 4 

            DoEvents

        Loop

        Sleep 100

        WaitIE = True

    End If


End Function


'WaitIEで指定できる画面を全て取得する

Public Function GetIEWindowTitles() As String

    Dim shells As Object

    Dim shell As Object

    Dim strValue As String

    GetIEWindowTitles = ""

    Set shells = CreateObject("Shell.Application")

    For Each shell In shells.Windows

        If TypeName(shell.document) = "HTMLDocument" Then

            If strValue <> "" Then strValue = strValue & ","

            strValue = strValue & shell.document.Title

        End IF

    Next

    Set shell = Nothing

    GetIEWindowTitles = strValue

End Function


PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...