VBAを使ったInternet Explorer (IE) の自動化
In this Article
このページでは、VBAを使用してInternet Explorer(IE)を自動化するためのコーディング例を紹介します。
** 2019年6月7日更新:現在、VBAでWeb自動化を実現する最善の方法は、Seleniumを使用することです。この記事はSeleniumをカバーするものではありません。以下の例は、あなたのニーズには十分かもしれません。しかし、もしあなたがより高度なニーズを持っていたり、Webオートメーションの専門家になりたいと思っているなら、代わりにSeleniumを使うことを強くお勧めします。Dan StrongのWebオートメーションに関するコース(このリンクから割引で入手可能)はSeleniumを学ぶための素晴らしいリソースです。
VBAでウェブページに移動する
1つ目のコードは、IEを開き、Webサイトに移動するコードです。2つ目のコードは、IEを開き、Webサイトに移動し、入力ボックスと対話するものです。
Sub Automate_IE_Load_Page()
'このコードは、IEでウェブページをロードします
Dim i As Long
Dim URL As String
Dim IE As Object
Dim objElement As Object
Dim objCollection As Object
'InternetExplorerオブジェクトを作成する
Set IE = CreateObject("InternetExplorer.Application")
'IEを表示させるにはIE.Visible = Trueとし、バックグラウンドで実行させるにはFalseとする
IE.Visible = True
'URLを定義する
URL = "https://www.automateexcel.com/excel/"
'URLへ移動する
IE.Navigate URL
'ステータスバーでWebサイトが読み込み中であることを知らせる
Application.StatusBar = URL & " を読み込み中です。しばらくお待ちください。"
'URLの読み込みが終わるまで待つ
'IE ReadyState = 4 は読み込みが完了したことを意味する(最初のループは、2番目のループを不注意にスキップすることを避けるため)
Do While IE.ReadyState = 4: DoEvents: Loop 'Do While
Do Until IE.ReadyState = 4: DoEvents: Loop 'Do Until
'ウェブページがロードされる
Application.StatusBar = URL & " の読み込みが完了しました"
'IEをアンロードする
Set IE = Nothing
Set objElement = Nothing
Set objCollection = Nothing
End Sub
VBAでIEを使用する際によくある問題は、Internet Explorerが完全にロードされる前にVBAがコードを実行しようとすることです。このコードを使用すると、IEの準備が整うまで(IE.ReadyState – 4)ループを繰り返すようにVBAに指示します。
'URLの読み込みが終わるまで待つ
'IE ReadyState = 4 は読み込みが完了したことを意味する(最初のループは、2番目のループを不注意にスキップすることを避けるため)
Do While IE.ReadyState = 4: DoEvents: Loop 'Do While
Do Until IE.ReadyState = 4: DoEvents: Loop 'Do Until
また、このコードの行に注目してください。
IE.Visible = TRUE
このコードは、IEがバックグラウンドで動作するか、フォアグラウンドで動作するかを切り替えています。
VBAのコーディングが簡単に
VBAのコードをオンラインで検索するのはもうやめましょう。コードVBAアドインを使えば、Visual Basic Editorに必要なコードをすばやく挿入できます。 さらに詳しく!
VBAでURLを開き、フォームにデータを入力する
'これは、モジュールの一番上に置く必要があり、IEをアクティブウィンドウとして設定するのに使用します。
Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long
Sub Automate_IE_Enter_Data()
'IEでウェブページを読み込む
Dim i As Long
Dim URL As String
Dim IE As Object
Dim objElement As Object
Dim objCollection As Object
Dim HWNDSrc As Long
'InternetExplorerオブジェクトを作成する
Set IE = CreateObject("InternetExplorer.Application")
'IEを表示させるにはIE.Visible = Trueとし、バックグラウンドで実行させるにはFalseとする
IE.Visible=True
'URLを定義する
URL = "https://www.automateexcel.com/vba"
'URLへ移動する
IE.Navigate URL
'ステータスバーでWebサイトが読み込み中であることを知らせる
Application.StatusBar = URL & " を読み込み中です。しばらくお待ちください。"
'URLの読み込みが終わるまで待つ
'IE ReadyState = 4 は読み込みが完了したことを意味する(最初のループは、2番目のループを不注意にスキップすることを避けるため)
Do While IE.ReadyState = 4: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop
'ウェブページがロードされる
Application.StatusBar = URL & " の読み込みが完了しました"
'IEのウィンドウIDを取得し、アクティブウィンドウとして設定する
HWNDSrc = IE.HWND
SetForegroundWindow HWNDSrc
'入力ボックスの検索と入力
n = 0
For Each itm In IE.document.all
If itm = "[object HTMLInputElement]" Then
n = n + 1
If n = 3 Then
itm.Value = "orksheet"
itm.Focus '入力ボックスをアクティブにする(カーソルを表示させる)
Application.SendKeys "{w}", True 'W'キーの押下をシミュレートする
'Trueを指定すると、VBAはキーが押されるまで待機する
'キーが押されるとページ上のjavascriptが実行され、
'テーブルがフィルタリングされる
GoTo endmacro
End If
nd If
Next
'IEをアンロードする
endmacro:
Set IE = Nothing
Set objElement = Nothing
Set objCollection = Nothing
End Sub
VBAを使ってIEの要素を取得する(GetElement)
Internet Explorerでオブジェクトと対話することは、しばしば面倒なことです。どのようなオブジェクトを操作するのかを特定する必要があります。上記のコードでは、「[object HTMLInputElement]」(入力フォーム)の3番目のインスタンスを探しています。そして、入力フォームに “orksheet “と入力し(itm.value = “orksheet”)、カーソルを入力フォームに移動させ(itm.focus)、”w “と入力しています。このとき “w “を入力するのは、テーブルをフィルタリングするためのjavascriptを起動するためです。 オブジェクトの選択には、もっと直接的な方法もありますが、この方法は、他の方法がうまくいかない場合に有効でしょう。 他の方法を使用するには、次のオプションを使用します。
IE.document.getElementsById("ID").value = "value" 'IDで探す
IE.document.getElementsByTagName("ID").value = "value" 'タグで探す
IE.document.getElementsByClassName("ID").value = "value" 'クラス名で探す
IE.document.getElementsByName("ID").value = "value" '名前で探す
これらのメソッドを使用する際、同じ名前の要素が複数ある場合に問題が発生することがあります。上記のサンプルコードのようにループを使用することで、使用する要素のインスタンスを指定することができます。
VBAを使ってIEを制御する
上記のコードでは、Focus (itm.focus) イベントを使用して、フォーム内のカーソルをアクティブにしています。
オブジェクト/エレメントのイベント、メソッド、プロパティの例は、こちらでご覧いただけます: https://msdn.microsoft.com/en-us/library/ms535893(v=vs.85).aspx
これらのすべてが、すべてのオブジェクト/要素で動作するわけではないため、IEでオブジェクトを操作する際には、かなりの試行錯誤が必要になるかもしれません。
Internet ExplorerでSendkeysを使う
上記のコードでは、Sendkeysコマンドを使用してキーストロークをシミュレートしました。
Application.SendKeys "{w}", True
Sendkeysは、一般的に最後の手段であるべきです。通常はオブジェクトと直接対話することができますが、時にはSendkeysコマンドを使う方が簡単な場合もあります。Sendkeysは基本的にキーボードで入力するのと同じです。ウィンドウやオブジェクトが正しく選択されていることを確認してから行ってください。Sendkeysは、Web上のユーザーインタラクションに基づいて実行されるイベントをトリガーすることもできます。上の例では、Sendkeysを使って、Webページで使用しているテーブルのJavascriptフィルタを有効にしています。
Sendkeysには2つの入力があります。
1. 入力するキー (通常、{}…{enter}、{q}…で囲まれます)
2. Sendkeys が完了するまで待ってから TRUE/FALSE を実行します。Internet Explorerを使用する場合は、通常この値をTRUEに設定します。
Internet Explorerをバックグラウンドで実行する
Internet Explorerをバックグラウンドで実行するには、2つのことを行う必要があります。 1. IEコードを含むマクロをApplication.Runで呼び出し、作業を続けながらマクロがバックグラウンドで実行されるようにします。
Application.Run ("Automate_IE_Load_Page")
注意:このコードは、あなたの作業を中断させたり、あなたの作業がこのコードに干渉する可能性があります。例えば、SendKeysを使用する場合、Sendkeysは間違ったアプリケーションにキーストロークを送信する可能性があります。これには十分注意してください。 2. IEを非表示にする
IE.Visible = False
SeleniumとVBA
この記事が役に立ったのであれば、Webオートメーションに関するDan Strongのコースをチェックするとよいでしょう。VBAを使ったSeleniumの使い方をカバーしています。
ダンさんの受講生からの声