【チュートリアル】VBAでIE自動化ツールを作る(その16) 書籍検索ツール開発(IE操作モジュール・最終版コード)

こんにちは、自動化エンジニアをしています。kozuです。

エクセルVBAによりWebページの要素(テキストボックス、ボタンなど)を操作したり、表示されている情報を取得する自動化ツールの開発方法を紹介します。実際のWebサイトを自動操作し情報を取得するマクロの開発を通して、自動化ツールの開発について学ぶことができます。

本連載では、チュートリアルということでVBAの開発手順から始め、IEの操作についてどのようなページでも共通で使用できるコード(共通部品)を作成します。最初に共通部品を作成しておくことで、自分でIEの自動化ツールを作成する際に少量の実装で効率よく開発できるようになります。

この章では、これまでに実装した共通部品を使用したIEの自動化ツールの開発を行っていきます。出版社(秀和システム)のWebサイトから指定した条件で新しい本を検索するツールを開発します。前回までにツールとしての機能は完成しました。今回はエラー制御と処理の高速化について、どのようなツールを作成する場合にも当てはまる事項を対応します。

1.対象者

ブラウザで定期的に手作業で行っているデータ入力やデータ収集等の作業から開放されたい、楽したいと考えている方を対象に、エクセルVBAで自動化するツールの開発ができるようになることを目指しています。プログラミングの経験がない方でも、コードをコピーすれば開発できるようになっています。

2.開発環境

以下の環境を使用します。
バージョンは異なっていても問題ないと思います。
・OS:Windows10
・エクセル:Microsoft Excel2007
・ブラウザ:InternetExploer11

3.最終版コード

本連載で紹介したIEを操作する共通部品の「IEControl」モジュールのコードの全量になります。

Option Explicit
   
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

'待機時間(ms)
Private Const WAIT_TIME As Long = 1000

' ************************************************
'  関数名:OpenUrl
'  概要:IEを起動し、指定したURLのページを表示する
'  引数:objIE(IEオブジェクト)
'           url(URL)
'           isDisplay (IE表示フラグ)
'           ieTop (表示位置Y座標)
'           ieLeft (表示位置X座標)
'           ieWidth (ウィンドウ幅)
'           ieHeight (ウィンドウ高さ)
'  戻り値:なし
' ************************************************
Public Sub OpenUrl(ByVal objIE As InternetExplorer, _
          ByVal url As String, _
          Optional isDisplay As Boolean = True, _
          Optional ieTop As Integer = 0, _
          Optional ieLeft As Integer = 0, _
          Optional ieWidth As Integer = 1000, _
          Optional ieHeight As Integer = 1200)
   
   With objIE
       'IEの表示/非表示設定
       .Visible = isDisplay
       
       'ウィンドウの位置とサイズ設定
       .Top = ieTop
       .Left = ieLeft
       .Width = ieWidth
       .Height = ieHeight
       
       '指定したURLのページを表示する
       .navigate url
   End With
   
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   '待機する
   Wait (WAIT_TIME)
End Sub

' ************************************************
'  関数名:PageBack
'  概要:前のページに戻る
'  引数:objIE(IEオブジェクト)
'  戻り値:なし
' ************************************************
Public Sub PageBack(ByVal objIE As InternetExplorer)
   '前のページに戻る
   objIE.GoBack
   
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   '待機する
   Wait (WAIT_TIME)
End Sub

' ************************************************
'  関数名:WaitIE
'  概要:IEが完全に表示されるまで待機
'  引数:objIE(IEオブジェクト)
'  戻り値:なし
' ************************************************
Private Sub WaitIE(ByVal objIE As InternetExplorer)
   'IEが完全に表示されるまで待機
   Do While objIE.Busy = True Or objIE.readyState <> 4
       DoEvents
   Loop
End Sub

' ************************************************
'  関数名:Wait
'  概要:指定時間待機
'  引数:待機時間(ms)
'  戻り値:なし
' ************************************************
Private Sub Wait(ByVal milisec As Long)
   Application.Wait [Now()] + milisec / 86400000
End Sub

' ************************************************
'  関数名:CloseIE
'  概要:IEを閉じる
'  引数:objIE(IEオブジェクト)
'  戻り値:なし
' ************************************************
Public Sub CloseIE(ByVal objIE As InternetExplorer)
   objIE.Quit
   Set objIE = Nothing
End Sub

' ************************************************
'  関数名:GetHtmlObjById
'  概要:要素取得(getElementById)
'  引数:objIE(IEオブジェクト)
'           id (要素のid)
'  戻り値:HTML要素
' ************************************************
Public Function GetHtmlObjById(ByVal objIE As InternetExplorer, ByVal id As String) As Object
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   Set GetHtmlObjById = objIE.document.GetElementById(id)
End Function

' ************************************************
'  関数名:GetHtmlObjByClass
'  概要:要素取得(getElementsByClassName)
'  引数:objIE(IEオブジェクト)
'           class (要素のclass)
'  戻り値:HTML要素
' ************************************************
Public Function GetHtmlObjByClass(ByVal objIE As InternetExplorer, ByVal class As String) As Object
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   Set GetHtmlObjByClass = objIE.document.getElementsByClassName(class)
End Function

' ************************************************
'  関数名:GetHtmlObjByName
'  概要:要素取得(getElementsByName)
'  引数:objIE(IEオブジェクト)
'           name (要素のname)
'  戻り値:HTML要素
' ************************************************
Public Function GetHtmlObjByName(ByVal objIE As InternetExplorer, ByVal name As String) As Object
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   Set GetHtmlObjByName = objIE.document.getElementsByName(name)
End Function

' ************************************************
'  関数名:GetElementByQuerySelector
'  概要:要素取得(querySelector)
'  引数:objIE(IEオブジェクト)
'           selector (要素のセレクタ)
'  戻り値:HTML要素
' ************************************************
Public Function GetHtmlObjByQuerySelector(ByVal objIE As InternetExplorer, ByVal selector As String) As Object
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   Set GetHtmlObjByQuerySelector = objIE.document.querySelector(selector)
End Function

' ************************************************
'  関数名:GetElementByQuerySelectorAll
'  概要:要素取得(querySelectorAll)
'  引数:objIE(IEオブジェクト)
'           selector (要素のセレクタ)
'  戻り値:HTML要素
' ************************************************
Public Function GetHtmlObjByQuerySelectorAll(ByVal objIE As InternetExplorer, ByVal selector As String) As Object
   'IEが完全に表示されるまで待機
   Call WaitIE(objIE)
   
   Set GetHtmlObjByQuerySelectorAll = objIE.document.querySelectorAll(selector)
End Function


' ************************************************
'  関数名:InputText
'  概要:テキスト入力
'  引数:objHtml(HTML要素オブジェクト)
'           text (入力テキスト)
'  戻り値:なし
' ************************************************
Public Sub InputText(ByVal objHtml As Object, ByVal text As String)
   '値を設定
   objHtml.Value = text
End Sub

' ************************************************
'  関数名:ClickButton
'  概要:ボタンクリック
'  引数:objHtml(HTML要素オブジェクト)
'  戻り値:なし
' ************************************************
Public Sub ClickButton(ByVal objHtml As Object)
   'クリック
   objHtml.Click
   
   '待機する
   Wait (WAIT_TIME)
End Sub

' ************************************************
'  関数名:CheckRadioButton
'  概要:ラジオボタンチェック
'  引数:objHtml(HTML要素オブジェクト)
'  戻り値:なし
' ************************************************
Public Sub CheckRadioButton(ByVal objHtml As Object)
   'チェック
   objHtml.Checked = True
End Sub

' ************************************************
'  関数名:ChangeCheckBox
'  概要:チェックボックス更新
'  引数:objHtml(HTML要素オブジェクト)
'            isCheck (チェックフラグ)
'  戻り値:なし
' ************************************************
Public Sub ChangeCheckBox(ByVal objHtml As Object, ByVal isCheck As Boolean)
   'チェック更新
   objHtml.Checked = isCheck
End Sub

' ************************************************
'  関数名:SelectListValue
'  概要:リスト選択
'  引数:objHtml(HTML要素オブジェクト)
'            selectValue (選択値)
'  戻り値:なし
' ************************************************
Public Sub SelectListValue(ByVal objHtml As Object, ByVal selectValue As String)
   'リスト選択
   objHtml.Value = selectValue
End Sub

' ************************************************
'  関数名:ClickLink
'  概要:リンククリック
'  引数:objHtml(HTML要素オブジェクト)
'  戻り値:なし
' ************************************************
Public Sub ClickLink(ByVal objHtml As Object)
   'クリック
   objHtml.Click
   
   '待機する
   Wait (WAIT_TIME)
End Sub

' ************************************************
'  関数名:ClickLinkByText
'  概要:リンククリック
'  引数:objIE(IEオブジェクト)
'            linkText (リンクのテキスト)
'  戻り値:なし
' ************************************************
Public Sub ClickLinkByText(ByVal objIE As Object, ByVal linkText As String)
   Dim objLinks As Object
   'リンクの要素を全て取得
   Set objLinks = GetHtmlObjByQuerySelectorAll(objIE, "a")
   
   Dim i As Integer
   For i = 0 To objLinks.Length - 1
       If objLinks.Item(i).innerText = linkText Then
           'リンクのテキストが一致した場合はリンクをクリック
           objLinks.Item(i).Click
           Exit For
       End If
   Next
End Sub

' ************************************************
'  関数名:DownloadFile
'  概要:ファイル保存
'  引数:src(ファイルのURL)
'            savePath (保存先パス)
'  戻り値:なし
' ************************************************
Public Sub DownloadFile(ByVal src As String, ByVal savePath As String)
   'ファイルをダウンロード
   Call URLDownloadToFile(0, src, savePath, 0, 0)
End Sub

' ************************************************
'  関数名:GetInnerText
'  概要:テキスト取得(innerText)
'  引数:objHtml(HTML要素オブジェクト)
'  戻り値:テキスト
' ************************************************
Public Function GetInnerText(ByVal objHtml As Object) As String
   'テキスト取得
   GetValue = objHtml.innerText
End Function



この記事が気に入ったらサポートをしてみませんか?