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

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

Excell VBAでIE操作してみたTIPS

■経緯

Excel VBAIEを思いのままに操作できるプログラミング術 〜窓の杜 特別レッスン〜
http://www.forest.impress.co.jp/docs/special/20130516_599332.html
を見て、便利そうなのでちょっとやってみました。

■まずは入門

VBも知らない若輩者ではなかなか難しいです。

http://excelvba.pc-users.net/index.html

言語体系と、セルへのアクセスをなんとなく学習。

  • VBAによるIE自動制御入門

http://vbaie.blog111.fc2.com/

こちらのやりたいことマッチしてるので、基本的にこのサイトをパクる。

■データ型

データ型が意味わからず困る。


  • Excel VBA 入門講座 変数のデータ型

http://excelvba.pc-users.net/fol5/5_2.html

よく使うのは汎用のVariant型、数値のInteger型と、DOM?で使うObject型。
汎用というのもどこまでいけるのかもよくわからない。
関数の引数はちゃんと型判別されるので使い分けが必要。


  • NullとEmptyとNothingと空の文字列の違い

http://www.moug.net/tech/acvba/0050010.html

IEのWebブラウザコントロールオブジェクトはObeject型らしい。
で、ObjectのNULL的なものが"Nothing"値。
"Nothing"かチェックして分岐するには、
If Obj Is Nothing Then
  ...
End If
という特殊な書き方が必要らしい。
If Obj = Nothing Then
ではダメ。なんでだ。


  • 日経PC21 / エクセルVBA講座 代入に「Set」が必要なオブジェクト型

http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg4.shtml

Object型に代入しようとすると動作がおかしい。
どうもObject型だけはSet命令を先頭につけないといけない。意味不明。

■フォームへの入力

基本的には
objIE.document.getElementById("AucSearchTxt").Value = "hoe"
などでイケるのだけれど、IDが設定されていない他サイトのフォームには使用できない。
Classや名前で代用しなきゃいけない。

  • フォームの取得の仕方あれこれ + フォームあれこれ

objIE.Document.getElementById("id").Value = Cells(2, 1).Value = "hoge" 'textboxt
objIE.Document.getElementsByName("name")*1.Click 'radio button
objIE.Document.getElementsByClassName("class name")(0).SelectedIndex = Cells(2, 1) 'pull-down選択
objIE.Document.getElementsByClassName("class name")(0).Value = Cells(2, 1) 'pull-down代入
objIE.Document.getElementsByTagName("tag name")(0).Value

element型で返ってくるものと、element型のArrayで返ってくるものがあるようだ。対象が一意に決まっているなら(0)を付けて1つ目の要素にアクセスする。

■XOR

0と1を反転させる方法に困ったので、1足して2の剰余を取ってみた。XORはあるんだろうか。

■ドキュメント

未だに利用しているIEとの連携機能の名称が判っていないけど、ドキュメントはこれっぽい。
getElementsByTagName method (Internet Explorer)

■そして

目的は達成できた!!
・・・が、複雑な操作が可能なページでは、なかなか細部までいじるのが難しいのが正直な感想。

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

*1:Cells(2, 1