VBAからJavascriptを実行してIEウィンドウを自動スクロール

<< エクセルVBAからIEでJavascriptを実行する :前の記事

前回は、IE(InternetExplorer)でJavaScriptを実行する方法について解説しました。JavaCsriptの実行がメインでしたので単純にメッセージボックスを表示させただけですが、フォーム送信ボタンなどにJavascriptが利用されることが多いです。

単純に送信ボタンをクリックするだけでは処理ができない場合もありますので、その際はこちらを利用するようにしましょう。今回は、JavaScriptを利用してIEウィンドウを自動でスクロールする方法について解説します。

自動スクロールがどのような場面で利用されるかというと、たとえばtwitterのつぶやき情報を収集する場合は、下部へスクロールすることでツイート文が表示されます。他にもECサイトの商品一覧で同じような仕組みのサイトもあります。そのような場合に自動スクロール処理をするととても便利です。

目次

JavaScriptを利用してIEウィンドウを自動スクロールする処理の流れ

以下が今回の処理の流れになります。

  • ①変数宣言
  • ②ieViewサブルーチンを利用して指定したURLをIEで起動
  • ③IE表示後にJavascriptで自動スクロール

利用するサブルーチンについて

今回利用するサブルーチン・関数・プロパティは以下になります。

  • ieViewサブルーチン
  • ieCheckサブルーチン
  • ieJSサブルーチン
  • Windows APIとは
  • Sleep関数とは
  • scrollTo関数(JavaScript)とは
  • scrollHeightプロパティとは

ieViewサブルーチンとは

ieViewサブルーチン指定したURLをInternetExplorerで起動させ、Webページが完全に読み込まれるまで待機処理をするマクロです。

ieView("IEオブジェクト","表示させたいURLの文字列","IE表示・非表示の値[省略可]","Y位置の値[省略可]","X位置の値[省略可]","幅の値[省略可]","高さの値[省略可]")

ieCheckサブルーチンとは

ieCheckサブルーチン指定したInternetExplorerオブジェクトのWebページが完全に読み込まれるまで待機処理をするマクロです。

ieCheck("IEオブジェクト")

ieJSサブルーチンとは

ieJSサブルーチン指定したInternetExplorerオブジェクトでJavasCriptを実行するマクロです。

ieJS("IEオブジェクト","JavaScriptコード")

Windows APIとは

API(Application Programming Interface)は、アプリケーションからOSやプログラム言語を操作するためのライブラリです。このAPIを利用することでファイル制御やウインドウ制御などを行うことが出来ます。また、Windows APIMicrosoft WindowsのAPIのことで、Windowsのバージョン毎に拡張されており16ビットは「Win16 API」32ビットは「Win32 API」と呼ばれます。

Sleep関数とは

Windows APIのSleep関数は、指定した時間(ミリ秒間)だけ処理を中断するAPI関数です。

Sleep "実行を中断する時間(ミリ秒)"

scrollTo関数(JavaScript)とは

scrollTo関数はJavaScriptの関数で、スクロール位置を指定座標へ移動する関数です。

scrollTo(X座標, Y座標)
構文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回自動でスクロールされる。

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

まず、処理を停止する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("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要素)の縦幅を取得してその位置までスクロールしていきます。これにより処理した回数だけスクロールすることになります。

それでは、こちらを利用したサンプルコードを見ていきましょう。

「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エレメントの基本操作 >>

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

近田 伸矢, 植木 悠二, 上田 寛

IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。

  • このエントリーをはてなブックマークに追加
VBAのIE制御についてのQ&A掲示板

↑エクセルVBAのIE(InternetExplorer)操作で分からない事があればこちらの掲示板よりご質問ください^^

ExcelのVBA初心者入門

↑こちらはExcelのVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

VBAでIE(InternetExplorer)制御の準備

【ダウンロード】IE操作に便利なツール

こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。

IEオブジェクトのメソッド・プロパティ

こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。

IE操作に利用されているVBA関数

こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。

IE操作に利用されているステートメント

こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。

IE(InternetExplorer)制御のVBAコード

こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。