VBA(エクセルマクロ)で自動化ツールやBotを作る2 IEを動かす、IEからデータを取得・スクレイピングする

VBAでIEを操作してみる方法を記述していきます。

これにより、例えばどこかにログインをすることを自動化したり、

クリックしてアクセスを送ったり、

スクレイピングしてデータを集めたりすることが可能になります。

 

まず、参照設定を調整する必要があります。

マクロの作成画面を開き、「ツール」→「参照設定」から、ライブラリを追加します。

・Microsoft HTML Object Library

・Microsoft Internet Controls

この二つをチェックします。

 

ライブラリは、必要なプログラムが入っているものなのですが、ほとんど参照設定を使う機会はないのでこれだけチェックすると覚えておけば大丈夫です。

「ユーザー定義型は定義されていません」と出たら、何か必要なライブラリがある、と思ってその際に何をチェックするのかを調べればOKです。

 

これにより、IEのオブジェクトを触ることができるようになります。

 

それではまず、IEでYahooを表示してみましょう。
1

Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

ここまでをマクロの一番上に。(subよりも前に)

後述するSleepを使うための準備です。

(古いエクセルのバージョンによってはptrsafe部分でエラーになるかもしれません。)

 

 

ここからを任意の場所に

Sub MacroTest2()
Dim objie As InternetExplorer
Call ieView(objie, "http://yahoo.co.jp")
End Sub


Sub ieView(objie As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True, _
Optional ieTop As Long = 0, _
Optional ieLeft As Long = 0, _
Optional ieWidth As Long = 600, _
Optional ieHeight As Long = 800)
Set objie = CreateObject("InternetExplorer.Application")
objie.Visible = viewFlg
objie.Top = ieTop
objie.Left = ieLeft
objie.Width = ieWidth
objie.Height = ieHeight
objie.Navigate urlName
Call ieCheck(objie)
End Sub
Sub ieCheck(objie As InternetExplorer)
Dim timeOut As Date
Dim f As Long
timeOut = Now + TimeSerial(0, 0, 20)
f = 0
Do While objie.Busy = True Or objie.ReadyState <> 4
DoEvents
Sleep 100
If Now > timeOut Then
objie.Refresh
timeOut = Now + TimeSerial(0, 0, 5)
f = f + 1
If f > 10 Then
Exit Sub
End If
End If
Loop
timeOut = Now + TimeSerial(0, 0, 20)
Do Until objie.Document.ReadyState = "complete"
DoEvents
Sleep 100
If Now > timeOut Then
objie.Refresh
timeOut = Now + TimeSerial(0, 0, 5)
f = f + 1
If f > 10 Then
Exit Sub
End If
End If
Loop
End Sub

 

MacroTest2を実行すると、yahooが開きます。

 

Dim objie As InternetExplorer でまずIEのオブジェクトだよ、と宣言をし、

ieViewでIEの表示設定をしてyahooを開いています。
その際、URLを開いた後にすぐ処理をするとまだ読み込めていないために内容等を取得した際にエラーが出るため、
読み込みが完了するまで処理を待たせているのがiecheckです。(今回はいりません)

IEを使う際はとにかくDim objie(任意の単語) As InternetExplorerって書くんだと覚えておけばよいかと思います。

これ自体かなり昔に書いたやつをそのまま動くので使っている形なので、なんで二回readystateとbusyをチェックしているのか、と言われても忘れましたが、コピーします。

 

今回、IEを開く際の詳細をほかのSubに移していますが、

長くなりそうな処理や繰り返し使うような処理は別の場所でまとめておく的な感じです。

これをプロシージャと呼び、プロシージャには戻り値を返せるFunctionと、単純に処理を実行するSubの二つがあります。

(プロシージャという呼び方は正直知りませんでした)

 

 

これにより、ウェブページを表示することが出来ました。

それではどんなことができるか。

IE上のボタンを押す
例えば、検索してみましょう。

ヤフーの検索ボタン部分の情報などをもとに、

フォーム部分はpという名前がついたインプットで、

検索ボタン部分はsrchbtnと言うclass名がついたインプットボタンです。

Sub MacroTest2()
Dim objie As InternetExplorer
Call ieView(objie, "http://yahoo.co.jp")
Call formText(objie, "p", "test")
Call classClick(objie, "input", "srchbtn")

End Sub

テキストエリアとインプットのどちらもname属性が一致したら指定した値で埋めるSub。

Sub formText(objie As InternetExplorer, _
nameValue As String, _
tagValue As String)
Dim str As String
flag = 0
str = ""
For Each objTag In objie.Document.getElementsByTagName("input")
If objTag.Name = nameValue Then
objTag.Value = tagValue
flag = 1
End If
Next
For Each objTag In objie.Document.getElementsByTagName("textarea")
If objTag.Name = nameValue Then
objTag.Value = tagValue
flag = 1
End If
Next
End Sub

指定したクラスをクリックするSub

Sub classClick(objie As InternetExplorer, _
tagName As String, _
tagStr As String)
For Each objTag In objie.Document.getElementsByTagName(tagName)
If InStr(objTag.outerHTML, tagStr) > 0 Then
objTag.Click
Call ieCheck(objie)
Exit For
End If
Next
End Sub

これらを書き込んで保存し、MacroTest2を実行してみましょう。
「test」の検索結果が表示されます。

前回に指定したような方法で、セルに複数の値を埋め、その中から一つを選んで検索する、と言うこともこれでできるようになったかと思います。

IEで表示されたデータを取得する。
さらに続いて、
検索結果が表示されたら、そのデータを取得したくなるのが世の常かと。

表示されたデータから、全てのタイトルとURLを取得してみましょう。

まず、値を取得するには、その値がどこにある値なのかを知る必要があります。

方法はいろいろありますが、一番手軽なのは、GoogleChromeで検索結果の一番目のタイトルを右クリックして「検証」のボタンを押すことです。

(「dexi.io」などを使うともっと簡単でしょう。)

 

excel4

 

上記を見ると、div.hdの子要素h3のさらに子要素aタグ内にURLとタイトルがあります。

ほかの場所にもdiv.hdを使っている場合(例えばサイドバーの検索結果や、今回の場合、div.hdの孫要素にAタグではなくTDタグがあることがありました。)や、ほかのページではやや違う構造であった等もあるので、本当にここであっているのか、検証は必要ですが、

今回は簡略化します。


Sub MacroTest2()
Dim objie As InternetExplorer
Dim lists As Variant
Dim v As Object
Call ieView(objie, "http://yahoo.co.jp")
Call formText(objie, "p", "test")
Call classClick(objie, "input", "srchbtn")
i = 1
For Each v In objie.Document.getElementsByclassname("hd")
If (v.Children.Length > 0) Then
If v.Children(0).Children.Length > 0 Then
If (v.Children(0).Children(0).tagName = "A") Then
Sheets("Sheet3").Cells(i, 1).Value = v.Children(0).Children(0).href
Sheets("Sheet3").Cells(i, 2).Value = v.Children(0).Children(0).innertext
i = i + 1
End If
End If
End If
Next
objie.Quit
Set objie = Nothing
End Sub

クラス名でまず「hd」を検索し、その子要素の子要素がAタグであった場合の値を取得しています。

これにより、Sheet3に以下のようなデータが入力されました。

http://www.musen-lan.com/speed/ BNR スピードテスト 回線速度/通信速度 測定
http://ejje.weblio.jp/content/test testの意味 – 英和辞典 Weblio辞書
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88 テスト – Wikipedia
https://kotobank.jp/ejword/test#E3.83.97.E3.83.AD.E3.82.B0.E3.83.AC.E3.83.83.E3.82.B7.E3.83.96.E8.8B.B1.E5.92.8C.E4.B8.AD.E8.BE.9E.E5.85.B8.28.E7.AC.AC.EF.BC.94.E7.89.88.29 testとは
http://ntest.nikkei.jp/ 日経TEST
http://www.usen.com/speedtest02/ スピードテスト | 回線速度・通信速度測定 – USEN
http://eow.alc.co.jp/search?q=test testの意味・用例|英辞郎 on the WEB:アルク
http://dic.nicovideo.jp/a/%5Btest%5D [TEST]とは (テストとは) [単語記事] – ニコニコ大百科
http://dic.nicovideo.jp/a/%E3%83%86%E3%82%B9%E3%83%88 テストとは (テストとは) [単語記事] – ニコニコ大百科
http://www.test-no.com/test-no/ test-No. OFFICIAL WEBSITE
http://j-test.jp/ J.TEST実用日本語検定 | TEST OF PRACTICAL JAPANESE

 

 

ここからさらに、次のページをクリックして、

次のページのデータを取得して、

説明文を取得したりして整形すれば、

それなりに良いまとめサイトが作れそうではありませんか?

例えばTwitterのトレンドと検索結果を組み合わせたり。

 

なお、エクセルに取り込むだけならばウェブデータを読み込むようなボタンがあったような気もするのでそちらでも十分です。

それをさらにボタンを押した先のページなどを見たい際に力を発揮します。

 
Share on Facebook

見積もり・問い合わせフォーム
ガチ株式会社へのお仕事ご依頼・お見積もりの問い合わせはこちらから送信ください。
ホームページ作成
PHP制作依頼
wordpressカスタマイズ依頼
システム開発見積もり依頼
飲食店販促サービス問い合わせ
求人
会ってみたい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です