あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

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を付けないと呼ばせてもらえない。