VBAからJavascriptを実行してIEウィンドウを自動スクロール
<< エクセルVBAからIEでJavascriptを実行する :前の記事
前回は、IE(InternetExplorer)でJavaScriptを実行する方法について解説しました。JavaCsriptの実行がメインでしたので単純にメッセージボックスを表示させただけですが、フォーム送信ボタンなどにJavascriptが利用されることが多いです。
単純に送信ボタンをクリックするだけでは処理ができない場合もありますので、その際はこちらを利用するようにしましょう。今回は、JavaScriptを利用してIEウィンドウを自動でスクロールする方法について解説します。
自動スクロールがどのような場面で利用されるかというと、たとえばtwitterのつぶやき情報を収集する場合は、下部へスクロールすることでツイート文が表示されます。他にもECサイトの商品一覧で同じような仕組みのサイトもあります。そのような場合に自動スクロール処理をするととても便利です。
目次
- JavaScriptを利用してIEウィンドウを自動スクロールする処理の流れ
- 利用するサブルーチン・関数・プロパティについて
- JavaScriptを利用してIEウィンドウを自動スクロールするサンプルコード
- JavaScriptを利用してIE自動スクロールするサブルーチン「ieScroll」の解説
- 「ieScroll」を利用して自動スクロールするサンプルコード
- まとめ
JavaScriptを利用してIEウィンドウを自動スクロールする処理の流れ
以下が今回の処理の流れになります。
- ①変数宣言
- ②ieViewサブルーチンを利用して指定したURLをIEで起動
- ③IE表示後にJavascriptで自動スクロール
利用するサブルーチンについて
今回利用するサブルーチン・関数・プロパティは以下になります。
- ieViewサブルーチン
- ieCheckサブルーチン
- ieJSサブルーチン
- Windows APIとは
- Sleep関数とは
- scrollTo関数(JavaScript)とは
- scrollHeightプロパティとは
ieViewサブルーチンとは
ieViewサブルーチンは指定したURLをInternetExplorerで起動させ、Webページが完全に読み込まれるまで待機処理をするマクロです。
ieCheckサブルーチンとは
ieCheckサブルーチンは指定したInternetExplorerオブジェクトのWebページが完全に読み込まれるまで待機処理をするマクロです。
ieJSサブルーチンとは
ieJSサブルーチンは指定したInternetExplorerオブジェクトでJavasCriptを実行するマクロです。
Windows APIとは
API(Application Programming Interface)は、アプリケーションからOSやプログラム言語を操作するためのライブラリです。このAPIを利用することでファイル制御やウインドウ制御などを行うことが出来ます。また、Windows APIはMicrosoft WindowsのAPIのことで、Windowsのバージョン毎に拡張されており16ビットは「Win16 API」32ビットは「Win32 API」と呼ばれます。
Sleep関数とは
Windows APIのSleep関数は、指定した時間(ミリ秒間)だけ処理を中断するAPI関数です。
Sleep "実行を中断する時間(ミリ秒)"
scrollTo関数(JavaScript)とは
scrollTo関数はJavaScriptの関数で、スクロール位置を指定座標へ移動する関数です。
構文 | scrollTo(x,y) | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
x | × | ページのX座標 | |||
y | × | ページのY座標 |
scrollHeightプロパティとは
要素オブジェクトのscrollHeightプロパティはIEオブジェクトのスクロールビューの高さを取得します。データ型は「Integer」で単位は「ピクセル」になります。
objIE.document.要素(エレメント)オブジェクト.ScrollHeight
JavaScriptを利用してIEウィンドウを自動スクロールするサンプルコード
こちらの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自動スクロールするサブルーチン「ieScroll」の解説
こちらは、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要素)の縦幅を取得してその位置までスクロールしていきます。これにより処理した回数だけスクロールすることになります。
それでは、こちらを利用したサンプルコードを見ていきましょう。
「ieScroll」を利用して自動スクロールするサンプルコード
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部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。