VBAのIE(InternetExplorer)制御でURLを開く処理は何度も利用する部分です。この指定したURLを開く処理のサブルーチン化について解説しています。
<< プログラムのサブルーチン化について :前の記事
前回は、サブルーチンの説明からメリットまで解説しました。今回は「指定したURLをIEで起動する」のサンプルコードの中からサブルーチンにできる部分を抜き出しサブルーチン化させていく方法を解説していきます。
前回紹介したマクロの中でサブルーチン化させる部分を選定していきます。こちらの処理の流れを大きく2つに分けると以下のようになります。
今回は、この2つの処理を分けてそれぞれサブルーチン化させていきます。以下はどの部分で処理を分けるかを示していますので、確認してください。
今回利用するVBA関数・メソッド・プロパティは以下になります。
CreateObject関数はオートメーション機能を利用して一時的なオブジェクトを作成する関数です。この関数を利用すると、外部アプリケーションをオブジェクトとして操作することが可能となります。
Set オブジェクト変数名 = CreateObject("アプリケーション名・オブジェクトの種類")
DoEvents関数は、処理の途中にオペレーティングシステムに制御を移すための関数です。時間のかかる処理やループ処理の場合、処理が完了するまでOS(オペレーティングシステム)は制御を行うことができません。(ループ処理中は、OSやExcelそのものにも再描画をさせる暇さえ与えません。)
そこで、DoEvents関数を利用することで一時的にOS(オペレーティングシステム)に制御を移して、処理を行うことができます。長期のループ処理や無限ループ処理に陥った場合に利用されることが多いですが、使いすぎると処理は安定するものの処理時間が長くなってしまうこともあるので注意しましょう。
DoEvents
Now関数は、利用しているコンピュータシステムの日付と時刻の設定に基づいて、現在の日付と時刻を表すバリアント型の値を返す関数です。今回は、無限ループ対策で利用されます。
Now
TimeSerial関数は、引数で指定した時、分、秒に対応する時刻を含むバリアント型の値を返す関数です。こちらも無限ループ対策で利用されます。
TimeSerial(0, 0, 20)
InternetExplorerオブジェクトのNavigateメソッドは指定したURLをIE(InternetExplorer)で表示させます。5つの引数が用意されていますが、こちらでは必須項目であるURLだけを利用していきます。
objIE.Navigate ("IEに表示させるWebページのURL")
InternetExplorerオブジェクトのVisibleプロパティはInternetExplorerオブジェクトを表示するか非表示にするかを設定できます。非表示にしたとしても視覚的に見えなくなるだけですので、そのままInternetExplorerオブジェクトを操作することができます。
objIE.Visible = True/False
InternetExplorerオブジェクトのBusyプロパティはWebページが読み込み中かどうかを示します。Trueは読み込み中でFalseは読み込み完了を表しますが、実際の処理ではTrue→False→True→Falseを繰り返すことがあります。
例えばframeタグやiframeタグを利用しているサイトの場合、最初のフレームの読み込みが完了すると一旦Falseを返しますが、次のフレームの読み込みを開始するとTrueに戻ります。
他にもJavaScriptなどのスクリプト処理でも同様のことが起こる場合がありますので、BusyプロパティだけではWebページの読み込み完了待機処理を補えないことを理解してください。
objIE.Busy = True/False
InternetExplorerオブジェクトのReadyStateプロパティはInternetExplorerオブジェクトのドキュメントの読み込み状態を示します。読み込み状態は0~4までの5段階で、Busyプロパティでは不完全だったフレームの読み込みも完全に読み込んでから完了状態を示します。ちなみにWebページの完全読み込み待機処理では、Busyプロパティと併せて利用するのが一般的な方法となります。
objIE.readyState = 0~4
DocumentオブジェクトのReadyStateプロパティはDocumentオブジェクトのドキュメントの読み込み状態を示します。読み込み状態は4段階で、文字列で返す点にご注意ください。こちらもWebページの完全読み込み待機処理で利用します。
objIE.document.readyState = "uninitialized"/"loading"/
"interactive"/"complete"
InternetExplorerオブジェクトのRefreshメソッドはWebブラウザに表示されているWebページの再読み込み(リフレッシュ)を行うメソッドです。Webブラウザ自体が読み込み失敗している場合などで有効な処理となります。
objIE.Refresh
API(Application Programming Interface)は、アプリケーションからOSやプログラム言語を操作するためのライブラリです。このAPIを利用することでファイル制御やウインドウ制御などを行うことが出来ます。また、Windows APIはMicrosoft WindowsのAPIのことで、Windowsのバージョン毎に拡張されており16ビットは「Win16 API」32ビットは「Win32 API」と呼ばれます。
Windows APIのSleep関数は、指定した時間(ミリ秒間)だけ処理を中断するAPI関数です。
Sleep "実行を中断する時間(ミリ秒)"
こちらは、指定URLを表示するサブルーチンになります。引数を設定することで汎用性の高いプログラムとなっています。
Sub ieView(objIE As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True)
'IE(InternetExplorer)のオブジェクトを作成する
Set objIE = CreateObject("InternetExplorer.Application")
'IE(InternetExplorer)を表示・非表示
objIE.Visible = viewFlg
'指定したURLのページを表示する
objIE.Navigate urlName
'IE(InternetExplorer)が完全表示されるまで待機
Call ieCheck(objIE)
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
それでは、VBAコードを1つずつ説明していきます。
Sub ieView(objIE As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True)
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはSubステートメントに引数を3つ設定しているieViewサブルーチンになります。こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。
構文 | ieView(objIE,urlName,[viewFlg]) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
objIE | InternetExplorer | InternetExplorerオブジェクトを指定します。 | objIE,objIE2 | × | |
urlName | String | InternetExplorerに表示させたいURLの文字列を指定します。 | "http://www.vba-ie.net/" | × | |
viewFlg | Boolean | 「True」を設定するとIE(InternetExplorer)が表示され、「False」を設定すると非表示になります。規定値には「True」が設定されています。 | True,False | True | ● |
引数objIEは必須項目で、指定したURLを表示させるInternetExplorerオブジェクトを指定します。InternetExplorerオブジェクトを引数に設定することで、複数のオブジェクトを処理することができます。次の引数urlNameも必須項目で、InternetExplorerに表示させるURLを設定します。
そして最後の引数viewFlgは、IEの表示・非表示の設定値をブール型(Boolean)で指定します。こちらには引数を省略できるキーワードOptionalが設定されており、規定値が「True」の省略可能な引数となります。よって省略した場合は常にInternetExplorerが表示されます。
'IE(InternetExplorer)のオブジェクトを作成する
Set objIE = CreateObject("InternetExplorer.Application")
※ドラッグ(スワイプ)すると全体を確認できます。
次にオブジェクトを参照するSetステートメントとオブジェクトを作成するCreateObject関数を利用してInternetExplorerのオブジェクトを作成します。
'IE(InternetExplorer)を表示・非表示
objIE.Visible = viewFlg
※ドラッグ(スワイプ)すると全体を確認できます。
こちらでは、InternetExplorerオブジェクトのVisibleプロパティに「引数viewFlg」が設定されています。VisibleプロパティはInternetExplorerの表示・非表示の設定になりますので、「True」を設定するとInternetExplorerが表示されます。
引数viewFlgの規定値は「True」が設定されていますので、省略した場合はInternetExplorerが表示されます。非表示にしたい場合は「False」を設定してください。
'指定したURLのページを表示する
objIE.Navigate urlName
※ドラッグ(スワイプ)すると全体を確認できます。
指定したURLをInternetExplorerで表示するInternetExplorerオブジェクトのNavigateメソッドの設定です。Navigateメソッドの第一引数にはieViewサブルーチンの第二引数である表示させるWebページのURLを設定しています。
'IE(InternetExplorer)が完全表示されるまで待機
Call ieCheck(objIE)
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
こちらは、他のプロシージャを呼び出すCallステートメントでWebページが完全に読み込まれるまで待機処理をするieCheckサブルーチンを呼び出しています。ieCheckサブルーチンについては後ほど解説しますが、引数に待機処理させるInternetExplorerオブジェクトを設定することで指定したオブジェクトのWebページが完全に読み込まれるまで待機します。
Webページの読み込みが完了したら、Endステートメントを利用してプロシージャを終了させます。
こちらは、Webページが完全に読み込まれるまで待機するサブルーチンになります。
#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
※ドラッグ(スワイプ)すると全体を確認できます。
それでは、VBAコードを1つずつ説明していきます。
#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 ieCheck(objIE As InternetExplorer)
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはSubステートメントに引数を1つ設定しているieCheckサブルーチンになります。こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。
構文 | ieCheck(objIE) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
objIE | InternetExplorer | InternetExplorerオブジェクトを指定します。 | objIE,objIE2 | × |
引数objIEは必須項目で、Webページの読み込み完了まで待機処理するInternetExplorerオブジェクトを指定します。InternetExplorerオブジェクトを引数に設定することで、複数のオブジェクトを処理することができます。
Dim timeOut As Date
'完全にページが表示されるまで待機する
timeOut = Now + TimeSerial(0, 0, 20)
※ドラッグ(スワイプ)すると全体を確認できます。
まず、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オブジェクトの状態を対象にチェックしています。尚、オブジェクト変数objIEはieCheckサブルーチンの引数で設定された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"以外の場合はループ処理を繰り返す」処理になりますので、こちらのループ処理を抜けたとき初めてすべての読み込みが完了したことを表します。
#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
'----------------------------------------------------------------
'①指定URLを表示するサブルーチン「ieView」
Sub ieView(objIE As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True)
'IE(InternetExplorer)のオブジェクトを作成する
Set objIE = CreateObject("InternetExplorer.Application")
'IE(InternetExplorer)を表示・非表示
objIE.Visible = viewFlg
'指定したURLのページを表示する
objIE.Navigate urlName
'IEが完全表示されるまで待機
Call ieCheck(objIE)
End Sub
'----------------------------------------------------------------
'②Webページ完全読込待機処理サブルーチン「ieCheck」
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
'----------------------------------------------------------------
'▼サブルーチンを利用して複数サイトをIEで起動させるマクロ
Sub sample()
Dim objIE As InternetExplorer
Dim objIE2 As InternetExplorer
'本サイトをIEで起動
Call ieView(objIE, "http://www.vba-ie.net/")
'yahooサイトをIEで起動
Call ieView(objIE2, "http://www.yahoo.co.jp/")
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
本サイトとyahooサイトが表示されます。
'▼サブルーチンを利用して複数サイトをIEで起動させるマクロ
Sub sample()
Dim objIE As InternetExplorer
Dim objIE2 As InternetExplorer
'本サイトをIEで起動
Call ieView(objIE, "http://www.vba-ie.net/")
'yahooサイトをIEで起動
Call ieView(objIE2, "http://www.yahoo.co.jp/")
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
まず、Dimステートメントを利用してオブジェクト変数objIE,objIE2にInternetExplorer型を宣言しています。これによりInternetExplorerオブジェクトを作成した際にプロパティやメソッドを利用できるようになりました。
'本サイトをIEで起動
Call ieView(objIE, "http://www.vba-ie.net/")
※ドラッグ(スワイプ)すると全体を確認できます。
次にCallステートメントを利用してieViewサブルーチンを呼び出しています。第一引数にはオブジェクト変数の「objIE」を第二引数には表示させるURLの「http://www.vba-ie.net/」を設定しています。これにより本サイトがInternetExplorerで表示されます。
'yahooサイトをIEで起動
Call ieView(objIE2, "http://www.yahoo.co.jp/")
※ドラッグ(スワイプ)すると全体を確認できます。
こちらも先ほどと同様の処理でieViewサブルーチンの第二引数だけyahooサイトのURLを設定しています。これによりyahooサイトがInternetExplorerで表示されます。
見て分かると思いますが、非常にシンプルになりました。このように引数を設定することで汎用性のあるプログラムになり、何度でも再利用することができますので、非常に便利です。
今回は、実際にプログラムをサブルーチン化させて解説してきました。サブルーチンを利用すると非常にシンプルになり、かつ何度でも再利用することができます。今後もサブルーチン化できるプログラムはその都度説明していきます。次回は、IE(InternetExplorer)を開いた状態で別のURLを表示する方法について解説します。
次の記事: エクセルVBAでInternetExplorerを開いた状態で別のURLを表示する >>
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)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。