指定URLをInternetExplorerで起動するサブルーチン

<< プログラムのサブルーチン化について :前の記事

前回は、サブルーチンの説明からメリットまで解説しました。今回は「指定したURLをIEで起動する」のサンプルコードの中からサブルーチンにできる部分を抜き出しサブルーチン化させていく方法を解説していきます。

目次

サブルーチン化させる部分の選定

前回紹介したマクロの中でサブルーチン化させる部分を選定していきます。こちらの処理の流れを大きく2つに分けると以下のようになります。

  • ①指定したURLをIEで表示
  • ②Webページの完全読み込み待機処理

今回は、この2つの処理を分けてそれぞれサブルーチン化させていきます。以下はどの部分で処理を分けるかを示していますので、確認してください。

サブルーチン化の選定

利用するVBA関数・メソッド・プロパティについて

今回利用するVBA関数メソッドプロパティは以下になります。

  • CreateObject関数
  • DoEvents関数
  • Now関数
  • TimeSerial関数
  • Navigateメソッド
  • Visibleプロパティ
  • Busyプロパティ
  • InternetExplorerオブジェクトのReadyStateプロパティ
  • DocumentオブジェクトのReadyStateプロパティ
  • Refreshメソッド
  • Windows APIとは
  • Sleep関数

CreateObject関数とは

CreateObject関数はオートメーション機能を利用して一時的なオブジェクトを作成する関数です。この関数を利用すると、外部アプリケーションをオブジェクトとして操作することが可能となります。

Set オブジェクト変数名 = CreateObject("アプリケーション名・オブジェクトの種類")

DoEvents関数とは

DoEvents関数は、処理の途中にオペレーティングシステムに制御を移すための関数です。時間のかかる処理やループ処理の場合、処理が完了するまでOS(オペレーティングシステム)は制御を行うことができません。(ループ処理中は、OSやExcelそのものにも再描画をさせる暇さえ与えません。)

そこで、DoEvents関数を利用することで一時的にOS(オペレーティングシステム)に制御を移して、処理を行うことができます。長期のループ処理や無限ループ処理に陥った場合に利用されることが多いですが、使いすぎると処理は安定するものの処理時間が長くなってしまうこともあるので注意しましょう。

DoEvents

Now関数とは

Now関数は、利用しているコンピュータシステムの日付と時刻の設定に基づいて、現在の日付と時刻を表すバリアント型の値を返す関数です。今回は、無限ループ対策で利用されます。

Now

TimeSerial関数とは

TimeSerial関数は、引数で指定した時、分、秒に対応する時刻を含むバリアント型の値を返す関数です。こちらも無限ループ対策で利用されます。

TimeSerial(0, 0, 20)

Navigateメソッドとは

InternetExplorerオブジェクトのNavigateメソッドは指定したURLをIE(InternetExplorer)で表示させます。5つの引数が用意されていますが、こちらでは必須項目であるURLだけを利用していきます。

objIE.Navigate ("IEに表示させるWebページのURL")

Visibleプロパティとは

InternetExplorerオブジェクトのVisibleプロパティはInternetExplorerオブジェクトを表示するか非表示にするかを設定できます。非表示にしたとしても視覚的に見えなくなるだけですので、そのままInternetExplorerオブジェクトを操作することができます。

objIE.Visible = True/False

Busyプロパティとは

InternetExplorerオブジェクトのBusyプロパティWebページが読み込み中かどうかを示します。Trueは読み込み中Falseは読み込み完了を表しますが、実際の処理ではTrue→False→True→Falseを繰り返すことがあります。

例えばframeタグやiframeタグを利用しているサイトの場合、最初のフレームの読み込みが完了すると一旦Falseを返しますが、次のフレームの読み込みを開始するとTrueに戻ります。

他にもJavaScriptなどのスクリプト処理でも同様のことが起こる場合がありますので、BusyプロパティだけではWebページの読み込み完了待機処理を補えないことを理解してください。

objIE.Busy = True/False

InternetExplorerオブジェクトのReadyStateプロパティとは

InternetExplorerオブジェクトのReadyStateプロパティはInternetExplorerオブジェクトのドキュメントの読み込み状態を示します。読み込み状態は0~4までの5段階で、Busyプロパティでは不完全だったフレームの読み込みも完全に読み込んでから完了状態を示します。ちなみにWebページの完全読み込み待機処理では、Busyプロパティと併せて利用するのが一般的な方法となります。

objIE.readyState = 0~4

DocumentオブジェクトのReadyStateプロパティとは

DocumentオブジェクトのReadyStateプロパティはDocumentオブジェクトのドキュメントの読み込み状態を示します。読み込み状態は4段階で、文字列で返す点にご注意ください。こちらもWebページの完全読み込み待機処理で利用します。

objIE.document.readyState = "uninitialized"/"loading"/
"interactive"/"complete"

Refreshメソッドとは

InternetExplorerオブジェクトのRefreshメソッドはWebブラウザに表示されているWebページの再読み込み(リフレッシュ)を行うメソッドです。Webブラウザ自体が読み込み失敗している場合などで有効な処理となります。

objIE.Refresh

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 "実行を中断する時間(ミリ秒)"

指定URLを表示するサブルーチン「ieView」の解説

こちらは、指定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("IEオブジェクト","表示させたいURLの文字列","IE表示・非表示の値[省略可]")
構文ieView(objIE,urlName,[viewFlg])
引数名データ型内容値の事例初期値省略
objIEInternetExplorerInternetExplorerオブジェクトを指定します。objIE,objIE2×
urlNameStringInternetExplorerに表示させたいURLの文字列を指定します。"http://www.vba-ie.net/"×
viewFlgBoolean「True」を設定するとIE(InternetExplorer)が表示され、「False」を設定すると非表示になります。規定値には「True」が設定されています。True,FalseTrue

引数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ページ完全読込待機処理サブルーチン「ieCheck」の解説

こちらは、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("IEオブジェクト")
構文ieCheck(objIE)
引数名データ型内容値の事例初期値省略
objIEInternetExplorerInternetExplorerオブジェクトを指定します。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オブジェクトの状態を対象にチェックしています。尚、オブジェクト変数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"以外の場合はループ処理を繰り返す」処理になりますので、こちらのループ処理を抜けたとき初めてすべての読み込みが完了したことを表します。

「ieView」を利用して本サイトとyahooサイトを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

'----------------------------------------------------------------
'①指定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サイトが表示されます。

VBAのIE制御2サイト画面

解説

'▼サブルーチンを利用して複数サイトを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,objIE2InternetExplorer型を宣言しています。これにより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を表示する >>

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)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。