VBAでIE制御するときにハマったところ
やりたいことが出来てきたものの、かなり嵌りどころが多い。
TIPSをまとめておきます。
(環境:Office2010)
DOMのオブジェクトの取り方
自分で作ったサイトでないと、各オブジェクト(エレメント)をどうやって取得するかマチマチで非常に困る。
以下の3つがメイン。
objIE.document.getElementById("ID").Value
objIE.document.getElementsByName("名前")(0).value
objIE.document.getElementsByClassname("クラス名")(0).value
同じ名前のエレメントが1つのときは決め打ちでできる。
複数存在するの場合、1つしか取れないものは一番先に来ているものが取得される。複数取れるものは、配列で入るので項目の1つめ(添え字0)を参照する。
リンクの取り方
リンク先を取得する場合はアンカータグで一括取得する。以下はCollection型で返すようにしたもの
'すべてのハイパーリンクのURLを取得
Function GetURLs(ByRef objIE As Object, ByRef ret_urls As Collection)
For Each a In objIE.document.getElementsByTagName("A")
ret_urls.Add a
'Debug.Print a.href
Next
End Function'ハイパーリンクの中からURLパターンで検索してURLを返す
Function GrepURLByUrl(ByRef objIE As Object, pattern As String) As String
Dim ret As String
Dim urls As New Collection
Call GetURLs(objIE, urls)For Each url In urls
ret = InStr(url.href, pattern)
If ret <> 0 And IsNull(ret) = False Then
GrepURLByUrl = url.href
Exit Function
End If
Next
GrepURLByUrl = ""
'MsgBox "指定のリンクが見つかりませんでした"
End Function
アンカータグにはTitle, ID, hrefが入れる(設定されていれば)ので、適宜使い分ける。
JavaScriptで挿入される部分
動的生成なページに対し、VBAで制御するのはなかなか難しい。
基本的にはHTMLソースを見てIDや名前を調べるが、動的に入るところ(JSよくわからないけれど[]で括られていた)は推測して引いてきた。勘でトライ&エラー。
型の使い分け
正直言ってHTML DOMの型を考えるのは難しいし不毛。
できるだけVariant型を使用し、怒られたらObject、Arrayなどを使用するのが良い。
ちなみに配列は(n)で添え字をつけるのが新鮮だった。
リファレンス:http://memopad.bitter.jp/w3c/jsref/coll_doc_links.html
If文の書き方
単行、複数行どちらも補うためにか、VBAはIf文の書き方に癖がある。
ExcelVBAでは勝手に整形されてしまうため、「どうしてこうなった?」という状態になりがち。
一歩引いて見ないと原因がわからない。
'単行
If objCB.Type = "checkbox" Then Debug.Print "hoge"'複数行
If objCB.Type = "checkbox" Then
Debug.Print "hoge"
Else
Debug.Print "fuga"
End If'おかしい状態
If objCB.Type = "checkbox" Then Debug.Print "hoge"
Else: Debug.Print "fuga"
' ↑勝手にコロンが挿入される!
End If
なお、関数を呼ぶときも同じように整形されることがある。
明示的にCallを呼ぶべき。Callを付けないと呼ばせてもらえない。