VBAによるIE制御は、VBAを使いこなしている方でも存在すら知らない方が多いと思われますが、RPA的なことを行う上では大変有効な手法です。 現在では市販のRPAを使う方法、seleniumを使う方法もありますが、それらと比較し以下のような特徴があります。 「メリット」 ・ウインドウズ10とエクセルがはいっている一般的PCなら何も追加でインストールしないで使える。 ・IE自体が大規模開発が終了したソフトのため、突然大規模アップデートが行われる心配がない。=メンテナンス負荷がほとんどゼロ。 ・すでにVBAを使える方は習得が容易。 「デメリット」 ・市販RPAと比較し習得が難しい。 誰にでもお勧めできる手法ではありませんが、ほぼメンテナンスフリーで自由に配布可能なこの手法は業務効率改善プログラムを社内で配布するような場合は他に代替手段がないほど強力な手法となります。 IE自体がいつまで使用できるか、という問題もあり、将来を考えるとある程度別の手法も覚えたほうが良いと思いますが、この技術を習得できた方なら他の手法も容易に習得できると思います。 以下、ヤフーのサイトでVBAと検索する、簡単なサンプルを置かせていただきます。
'sleep関数を使うため。 #If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If
'↑ここから上をsubの上に張り付け
Sub yahoo立ち上げテスト() 'Microsoft HTML Object Libraryの参照設定必要 'Microsoft Internet Controlsの参照設定必要
Dim IEオブジェクト As Object
Set IEオブジェクト = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトをセット IEオブジェクト.Visible = True 'IEを表示する Sleep 500 '1000で1秒待機 IEオブジェクト.Navigate "https://www.yahoo.co.jp/" Sleep 1000
DoEvents
Do While IEオブジェクト.Busy = True Or IEオブジェクト.ReadyState <> 4 DoEvents Sleep 100 Loop
DoEvents IEオブジェクト.Document.all("srchtxt").Value = "vba" Sleep 100 DoEvents Sleep 1000
'MsgBox "ボタンクリック開始" For Each objTAG In IEオブジェクト.Document.getElementsByTagName("input") If InStr(objTAG.outerHTML, "検索") > 0 Then 'ボタンクリック objTAG.Click 'ループ脱出 Exit For
End If Next
End Sub
使い方ですが、上のコードをコピー、標準モジュールに貼り付けます。通常のVBAと違うのは、SUBより上にある部分ですね。
これがWINAPIを使うための宣言文です。WINAPIはウインドウズパソコンを制御するための機能で、今回はsleep関数という、指定した時間待機させる機能を使っています。VBAにRPA的なことを行わせる場合、このWINAPIをつかうのが有効です。
他にもマウス操作、キーボード操作も可能で、WINAPIとVBAを組み合わせれば、およそのPC操作の自動化は可能です。VBAでWINAPIを使用する場合、頭の部分で「これから使いますよ」という宣言を行う必要があります。この宣言の部分は毎回共通の定型文で特にアレンジする部分はありません。おまじないと考えて貼り付けましょう。
次にツールの参照設定から、から、以下の2つにチェックをいれます。
Microsoft HTML Object Library
Microsoft Internet Controls
これで準備完了です。
Do While IEオブジェクト.Busy = True Or IEオブジェクト.ReadyState <> 4
DoEvents
Sleep 1000
loop
今回のコードで一番見られないのはこの辺りだと思います。これはIE制御の独特の部分で。ブラウザの読み込みが完了、書き込み可能となるまで待機する機能があります。
「DoEvents」というのは、VBAがパソコンの制御を奪っている状態をいったん開放、OS側に制御を戻す機能がります。
「Sleep 1000」は先ほど導入したスリープ関数で、この場合1秒待機という意味です。1000が1秒ですね。
この2つに関しては何が正解、難病待機すれば大丈夫、という決まりはなく、実際のサイトで試しながら回数、秒数を調整します。自分のPCだけでなく多数のPCで動かす場合、待機時間を長めにとることで他のPCでも動く可能性が上がります。
それでも全PCで安定して作動する絶対の設定、というのは難しいですし。必要以上に待機時間を長めにすると業務の効率も落ちます。PCのスペックに応じて数種類のプログラムを用意する、エクセルマクロ内に設定シート的なものを作り、ユーザーが待機時間を調整できるようにするのも方法です。
WINAPIを使う上で注意点があります。通常VBAでは変数は定義しないでも自動的に判断されますが、WINAPIを使用した場合、Dimで定義しませんとエラーで動きません。
これが案外に不便です。私の場合は毎回同じ変数を使うようにしており、WINAPIを使う場合、毎回同じ変数を使わないものも含め定義していまう方法を用いています。
Comments