VBAのIE(InternetExplorer)制御に便利なサブルーチンを紹介しています。
IE(InternetExplorer)でJavaScriptを利用してIEウィンドウを自動でスクロールする方法について解説します。自動スクロールがどのような場面で利用されるかというと、たとえばtwitterのつぶやき情報を収集する場合は、下部へスクロールすることでツイート文が表示されます。他にもECサイトの商品一覧で同じような仕組みのサイトもあります。そのような場合に自動スクロール処理をするととても便利です。
サブルーチンとは、プログラム処理の中で繰り返し利用されるルーチン作業をモジュール化(部品化)してまとめたものになります。また、呼び出す側をメインルーチンと呼ぶのに対して「サブルーチン」と呼ばれます。
繰り返し利用されるルーチン作業をモジュール化(部品化)することで、同じ処理のプログラムを何度も書く手間が省け、プログラムも全体的に見やすくなります。これによりプログラムソースの可読性や保守性を高く保つことができます。
Sub ieScroll(objIE As InternetExplorer, _
r As Integer)
Dim i As Integer
For i = 1 To r
objIE.navigate "JavaScript:scrollTo(0," & objIE.document.body.ScrollHeight & ")"
Sleep 2000
Next i
End Sub
こちらはSubステートメントに引数を2つ設定しているieScrollサブルーチンになります。こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。
構文 | ieScroll(objIE,r) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
objIE | InternetExplorer | InternetExplorerオブジェクトを指定します。 | objIE,objIE2 | × | |
r | Integer | スクロールする処理の回数を指定します。 | × |
引数objIEは必須項目で、指定したURLを表示させるInternetExplorerオブジェクトを指定します。InternetExplorerオブジェクトを引数に設定することで、複数のオブジェクトを処理することができます。次の引数rも必須項目で、スクロールする処理の回数を設定します。
Dim i As Integer
こちらでは、変数宣言でメモリ領域を割り当てるDimステートメントを利用して変数iに整数型(Integer)型を変数宣言しています。こちらはFor~Nextステートメントのカウンタ変数として利用されます。
For i = 1 To r
objIE.navigate "JavaScript:scrollTo(0," & objIE.document.body.ScrollHeight & ")"
Sleep 2000
Next i
こちらでは、For~Nextステートメントを利用して引数rの設定値の数だけ処理を繰り返します。処理の内容は、InternetExplorerオブジェクトのnavigateメソッドにJavaScriptコードを設定し、自動スクロールするJavaScriptを実行しています。
JavaScriptコードでは、scrollTo関数(JavaScript)を利用し、X座標に「0」を、Y座標にページ領域(body要素)の縦幅を設定しています。こちらを設定することでページ領域(body要素)の一番下までスクロール位置を移動します。
この縦幅を取得するには、bodyオブジェクトのScrollHeightプロパティを利用します。こちらを設定することでページ領域(body要素)の縦幅を取得することができます。
ieJSサブルーチンを処理するとWindows APIのSleep関数を利用して2秒間停止しています。こちらはJavaScript処理が完了するまでエクセルVBAでは待機できないため、強制的に2秒間停止した後に次の処理へ移ります。
今回は、ループ処理ですので、スクロール位置が下部ページへスクロールしたら再度、ページ領域(body要素)の縦幅を取得してその位置までスクロールしていきます。このように処理することで、処理した回数だけスクロールすることになります。
最後は、Endステートメントを利用してプロシージャを終了させます。