VBAでIE操作のJavaScriptで自動スクロール「ieScroll」

VBAのIE(InternetExplorer)制御に便利なサブルーチンを紹介しています。

「ieScrollサブルーチン」の詳しい解説については、以下より確認してください。

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("IEオブジェクト","スクロール処理回数")
構文ieScroll(objIE,r)
引数名データ型内容値の事例初期値省略
objIEInternetExplorerInternetExplorerオブジェクトを指定します。objIE,objIE2×
rIntegerスクロールする処理の回数を指定します。×

引数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ステートメントを利用してプロシージャを終了させます。