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

データ抽出やインターフェースの自動化にしても必ず最初は指定したURLを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 ieCheck(objIE As InternetExplorer)

 Dim timeOut As Date

 '完全にページが表示されるまで待機する
 timeOut = Now + TimeSerial(0, 0, 20)

 Do While objIE.Busy = True Or objIE.ReadyState <> 4
  DoEvents
  Sleep 1
  If Now > timeOut Then
   objIE.Refresh
   timeOut = Now + TimeSerial(0, 0, 20)
   End If
 Loop

 timeOut = Now + TimeSerial(0, 0, 20)

 Do While objIE.document.ReadyState <> "complete"
  DoEvents
  Sleep 1
  If Now > timeOut Then
   objIE.Refresh
   timeOut = Now + TimeSerial(0, 0, 20)
  End If
  Loop

End Sub

※ドラッグ(スワイプ)すると全体を確認できます。


こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。

ieCheck("IEオブジェクト")
構文ieCheck(objIE)
引数名データ型内容値の事例初期値省略
objIEInternetExplorerInternetExplorerオブジェクトを指定します。objIE,objIE2×

引数objIEは必須項目で、Webページの読み込み完了まで待機処理するInternetExplorerオブジェクトを指定します。InternetExplorerオブジェクトを引数に設定することで、複数のオブジェクトを処理することができます。

#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マクロを編集すると・・・」に詳しく解説されていますので、一度確認してください。

 Dim timeOut As Date

 '完全にページが表示されるまで待機する
 timeOut = Now + TimeSerial(0, 0, 20)

※ドラッグ(スワイプ)すると全体を確認できます。

次にieCheckサブルーチン内の処理ですが、Dimステートメントを利用して変数timeOut日付型(Date)で宣言します。そして、現在の時刻を返すNow関数と指定した日付・時刻に対応した数値をDate型へ変換するTimeSerial関数を利用して、変数timeOut処理時間+20秒を加算した時間を代入します。例をあげると処理時間10:15:20の場合、変数timeOutの値は+20秒の10:15:40になります。

 Do While objIE.Busy = True Or objIE.ReadyState <> 4
  DoEvents
  Sleep 1
  If Now > timeOut Then
   objIE.Refresh
   timeOut = Now + TimeSerial(0, 0, 20)
   End If
 Loop

※ドラッグ(スワイプ)すると全体を確認できます。

こちらは待機処理には読み込みの状態を示すInternetExplorerオブジェクトのBusyプロパティReadyStateプロパティを利用して、InternetExplorerオブジェクトの状態を対象にチェックしています。尚、オブジェクト変数objIEieCheckサブルーチンの引数で設定されたIEオブジェクトが参照されます。

また、待機処理の内容は「InternetExplorerオブジェクトのBusyプロパティ値がTrueまたはReadyStateプロパティ値が4以外の場合はループ処理を繰り返す」処理になりますが、処理の詳細や無限ループ対策などの詳しい内容については、「指定したURLをIE(InternetExplorer)で起動させる」を確認してください。

 timeOut = Now + TimeSerial(0, 0, 20)

 Do While objIE.document.ReadyState <> "complete"
  DoEvents
  Sleep 1
  If Now > timeOut Then
   objIE.Refresh
   timeOut = Now + TimeSerial(0, 0, 20)
  End If
  Loop

End Sub

※ドラッグ(スワイプ)すると全体を確認できます。

先ほどはInternetExplorerオブジェクトの状態を対象にチェックしましたが、こちらはではDocumentオブジェクトの状態を対象にチェックをしています。まず、こちらでも同じように変数timeOut処理時間+20秒を加算した時間を代入します。

待機処理の内容は「DocumentオブジェクトのReadyStateプロパティ値が"complete"以外の場合はループ処理を繰り返す」処理になりますので、こちらのループ処理を抜けたとき初めてすべての読み込みが完了したことを表します。

VBAのIE制御についてのQ&A掲示板

↑VBAのIE操作で分からない事があればこちらの掲示板よりご質問ください。

ExcelのVBA初心者入門

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

目次

IE操作に便利なツール

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

IEのメソッド・プロパティ

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

IE操作のVBA関数

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

IE操作のステートメント

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

IE制御のVBAコード

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