VBAのIE(InternetExplorer)制御でIEウィンドウを自動スクロールする方法について解説しています。
<< エクセルVBAからIEでJavascriptを実行する :前の記事
前回は、IE(InternetExplorer)でJavaScriptを実行する方法について解説しました。JavaCsriptの実行がメインでしたので単純にメッセージボックスを表示させただけですが、フォーム送信ボタンなどにJavascriptが利用されることが多いです。
単純に送信ボタンをクリックするだけでは処理ができない場合もありますので、その際はこちらを利用するようにしましょう。今回は、JavaScriptを利用してIEウィンドウを自動でスクロールする方法について解説します。
自動スクロールがどのような場面で利用されるかというと、たとえばtwitterのつぶやき情報を収集する場合は、下部へスクロールすることでツイート文が表示されます。他にもECサイトの商品一覧で同じような仕組みのサイトもあります。そのような場合に自動スクロール処理をするととても便利です。
以下が今回の処理の流れになります。
今回利用するサブルーチン・関数・プロパティは以下になります。
ieViewサブルーチンは指定したURLをInternetExplorerで起動させ、Webページが完全に読み込まれるまで待機処理をするマクロです。
ieCheckサブルーチンは指定したInternetExplorerオブジェクトのWebページが完全に読み込まれるまで待機処理をするマクロです。
ieJSサブルーチンは指定したInternetExplorerオブジェクトでJavasCriptを実行するマクロです。
API(Application Programming Interface)は、アプリケーションからOSやプログラム言語を操作するためのライブラリです。このAPIを利用することでファイル制御やウインドウ制御などを行うことが出来ます。また、Windows APIはMicrosoft WindowsのAPIのことで、Windowsのバージョン毎に拡張されており16ビットは「Win16 API」32ビットは「Win32 API」と呼ばれます。
Windows APIのSleep関数は、指定した時間(ミリ秒間)だけ処理を中断するAPI関数です。
Sleep "実行を中断する時間(ミリ秒)"
scrollTo関数はJavaScriptの関数で、スクロール位置を指定座標へ移動する関数です。
構文 | scrollTo(x,y) | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
x | × | ページのX座標 | |||
y | × | ページのY座標 |
要素オブジェクトのscrollHeightプロパティはIEオブジェクトのスクロールビューの高さを取得します。データ型は「Integer」で単位は「ピクセル」になります。
objIE.document.要素(エレメント)オブジェクト.ScrollHeight
こちらのVBAコードは、JavaScriptを利用してIEウィンドウを自動スクロールするマクロです。
#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 sample()
Dim objIE As InternetExplorer
'ツイッターページをIE(InternetExplorer)で起動
Call ieView(objIE, "https://twitter.com/ariyoshihiroiki")
'IEウィンドウをJavaScriptで自動スクロール
For i = 1 To 5
Call ieJS(objIE, "scrollTo(0," & objIE.document.body.ScrollHeight & ")")
Sleep 2000
Next i
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
IE表示後に、5回自動でスクロールされる。
#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
※ドラッグ(スワイプ)すると全体を確認できます。
まず、処理を停止するWindows APIのSleep関数を使用できるようにAPIの宣言をします。宣言する場合は、宣言セクション内に記述します。通常のAPI宣言であれば1行記述するだけで済むのですが、こちらでは条件分岐ができるIf~Then~Elseステートメントを利用して、宣言内容を設定しています。
これは、office2010で64bit(ビット)版を利用している場合、API宣言の記述方法が異なるためです。使用するPC環境に合わせた記述方法でも問題ありませんが、汎用性を持たせるために条件分岐させています。こちらの問題については「32ビット版のOffice2010プログラムでVBAマクロを編集すると・・・」に詳しく解説されていますので、一度確認してください。
ちなみに宣言ステートメントは、最初のプロシージャ宣言の前に配置する必要がありますので、一番上に記述してください。
Sub sample()
Dim objIE As InternetExplorer
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはSubステートメントに引数の設定がないsampleプロシージャになります。 まずは、変数宣言でメモリ領域を割り当てるDimステートメントを利用してオブジェクト変数objIEに「InternetExplorer型」を変数宣言しています。
'ツイッターページをIE(InternetExplorer)で起動
Call ieView(objIE, "https://twitter.com/ariyoshihiroiki")
※ドラッグ(スワイプ)すると全体を確認できます。
次に他のプロシージャを呼び出すCallステートメントを利用してieViewサブルーチンを呼び出しています。それぞれの第一引数にはオブジェクト変数の「objIE」を第二引数には表示させるURLの「https://twitter.com/ariyoshihiroiki」を設定しています。これによりInternetExplorerでツイッターページが表示されます。
'IEウィンドウをJavaScriptで自動スクロール
For i = 1 To 5
Call ieJS(objIE, "scrollTo(0," & objIE.document.body.ScrollHeight & ")")
Sleep 2000
Next i
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
こちらでは、指定した回数だけ同じ処理を繰り返すFor~Nextステートメントを利用して5回処理を繰り返しています。繰り返し処理の内容は、Callステートメントを利用してJavaScriptを実行するieJSサブルーチンを呼び出しています。第一引数には「objIE」を第二引数にはJavaScriptコードの「scrollTo(0," & objIE.document.body.ScrollHeight & ")」を設定しています。
JavaScriptコードでは、スクロール位置を指定座標へ移動するscrollTo関数(JavaScript)を利用しています。今回は、下部ページへスクロールしますので、X座標は「0」を設定しています。
Y座標は、ページ領域(body要素)の縦幅を設定しています。こちらを設定することでページ領域(body要素)の一番下までスクロール位置を移動します。
この縦幅を取得するには、bodyオブジェクトのScrollHeightプロパティを利用します。こちらを設定することでページ領域(body要素)の縦幅を取得することができます。
ieJSサブルーチンを処理した後にWindows APIのSleep関数を利用して2秒間停止しています。こちらはJavaScript処理が完了するまでエクセルVBAでは待機制御できないため、強制的に2秒間停止した後に次の処理へ移ります。
今回は、ループ処理ですので、スクロール位置が下部ページへスクロールしたら再度、ページ領域(body要素)の縦幅を取得してその位置までスクロールしていきます。このように処理することで、処理した回数だけスクロールすることができます。
最後は、Endステートメントを利用してプロシージャを終了させます。こちらもよく利用する機能ですので、サブルーチン化していきましょう。
こちらは、JavaScriptを利用してIE自動スクロールするサブルーチンになります。
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
※ドラッグ(スワイプ)すると全体を確認できます。
それでは、VBAコードを1つずつ説明していきます。
Sub ieScroll(objIE As InternetExplorer, _
r As Integer)
※ドラッグ(スワイプ)すると全体を確認できます。
こちらは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要素)の縦幅を取得してその位置までスクロールしていきます。これにより処理した回数だけスクロールすることになります。
それでは、こちらを利用したサンプルコードを見ていきましょう。
Sub sample()
Dim objIE As InternetExplorer
'ツイッターページをIE(InternetExplorer)で起動
Call ieView(objIE, "https://twitter.com/ariyoshihiroiki")
'JavaScript自動スクロール
Call ieScroll(objIE, 5)
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
まず、変数objIEに「InternetExplorer型」を宣言しています。次にCallステートメントを利用してieViewサブルーチンを呼び出し、twitterページをIE(InternetExplorer)で表示させます。そして、ieScrollサブルーチンの引数にInternetExplorerオブジェクトとスクロール処理回数を格納しJavaScriptを実行します。
これにより、ツイッターページが下部へ5回スクロールされます。
今回は、JavaScriptを実行してIEウィンドウを自動スクロールする方法について解説しました。ここまでが「エクセルVBAでIE制御の基本操作」となります。ここまで理解できれば、IE(InternetExplorer)の表示操作については問題なくできるかと思います。次回からは「エクセルVBAでHTMLエレメントの基本操作」を解説していきます。
次の記事: エクセルVBAでHTMLエレメントの基本操作 >>
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
VBAのIE制御についてのQ&A掲示板↑VBAのIE操作で分からない事があればこちらの掲示板よりご質問ください。
ExcelのVBA初心者入門↑こちらはVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります。
こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。
こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。
こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。