DOMを変数で渡してinnerTextを得る方法
昨日以降(0) 2日前以降(0) 3日前以降(0) 4日前以降(0) 5日前以降(0)
Message#4 2015年7月15日(水)00時36分 From: VBAマスター | 返事 削除 変更 |
> スマートではないですが、とりあえずは現在動いている > Select Case構文で進めることとにします。 For i = 2 To sh2.Cells(Rows.Count, 1).End(xlUp).Row Step 1 '第一列目(A列)にURLリストがあるとします Select Case i Case 1 sh1.Cells(i, 2) = objIE.Document.body.all.tags("ul")(3).innerText Case 2 sh1.Cells(i, 2) = objIE.Document.body.all.tags("table")(3).all(61).innerText Case 3 sh1.Cells(i, 2) = objIE.Document.body.all.tags("div")(10).innerText End Select Next For Next構文ですが、上記の変数iは行番号ですよね? この変数iをSelect Case構文の条件としているということは、 1行目の場合は、objIE.Document.body.all.tags("ul")(3).innerText 2行目の場合は、objIE.Document.body.all.tags("table")(3).all(61).innerText 3行目の場合は、objIE.Document.body.all.tags("div")(10).innerText のデータを抽出しているということであってますか? 極論で言えば100行あったら100ケース記述する必要があると思いますが、ちょっとこれはどうかなと思います・・・ あと、 tags("ul")(3) tags("table")(3).all(61) tags("div")(10) も指定した要素に対して何番目の要素を抽出するかということですが、html文が変わると取得範囲も変わるのでオススメではないですね。 特に2番目の(61)はよく数えていったなと思います。 > getElementById(sh2.Cells(i, 3))はオールマイティではないことが判りました。 > classも同じclass名を持つ要素がサイトによって違っていたり、ということで > 結局諦めてしまったわけなのです。 ということですが、サイトによって違う部分を変数扱いすることで大抵は解決します。 理想としては、tagValueサブルーチンを利用するのがスマートに記述できる方法だと思います。 sh2シート A列 |B列 |C列 |D列 | URL |メソッドタイプ |タグ |一意のキーワード | For i = 2 To sh2.Cells(Rows.Count, 1).End(xlUp).Row With sh2 sh1.Cells(i, 2) = tagValue(objIE, .Cells(i, "B"), .Cells(i, "C"), .Cells(i, "D"), "innerText") End With Next おそらくここの「一意のキーワード」を見つけれないがために断念したと思いますが、どこかしら違うところがあるはずなので、それを見つけたほうが早いかと思います。 どうしても分からない場合は、以下のように個別の条件を追記すれば対応できるかと思います。 For i = 2 To sh2.Cells(Rows.Count, 1).End(xlUp).Row With sh2 sh1.Cells(i, 2) = tagValue(objIE, .Cells(i, "B"), .Cells(i, "C"), .Cells(i, "D"), "innerText") If sh1.cells(i,2) = "" then ※個別条件のマクロを記述 End if End With Next |
昨日以降 2日前以降 3日前以降 4日前以降 5日前以降