- 締切済み
VBAでIEのページの状態を取得する時に出るエラー
今まで特に問題なく、データを取得できていたのに、 ここ最近データを取得できなくなってしまった為、お知恵を貸してください。 For Each obj3 In ie.document.getElementsByTagName("td") If InStr(obj3.innerHTML, "INPUT") Or InStr(obj3.innerHTML, "input") Then hiddenValue = ie.document.getElementById("hogehoge").Value Exit For End If Next VBAで上記のようなコードを記入し、 inputにある hogehogeのIDの値を取得するようなプログラムを書いています。 hiddenValue に値が入る場合と値が入らない場合があるのですが、 値がNULLになる時のHTMLソースを見ても、hogehogeのIDがある為、何が原因なのかが不明です・・・。 どなたかこのような状況になったことはないでしょうか?? お知恵を貸してください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- DOUGLAS_
- ベストアンサー率74% (397/534)
#3・4 DOUGLAS_ です。 >いただいたコードで試してみたのですが、 >エラーになってしまい値を取得できませんでした。 ん~。。。 前回答のコードが動かないということになれば、まず、下記の点について、ご回答ねがいます。 1)「今まで」と「ここ最近」の間に、何か変わったことは思い当たりませんか? 新しいソフトをインストールしたとか、IEのバージョンが変わったとか。。。 2)「ここ最近」お使いのパソコンのOSとIEのバージョンは何でしょうか? また、エクセルのバージョンもお知らせください。 3)「エラーになってしまい」というのは、どんなエラーでしょうか? 前の回答のどこかでVBAが止まって、そのステートメントが黄色になってますか? 4)「値を取得できません」とお書きですが、これは、どのステートメントのタイミングでしょうか? MsgBox に何も表示されないということですか? 5)ついでに、ご質問のコードを試していらっしゃるサイトのURLを、お差し支えなければお示しいただけますか?
- DOUGLAS_
- ベストアンサー率74% (397/534)
#3 DOUGLAS_ です。間違いがありました。 hiddenValue = ie.document.getElementsByTagName("input")("word").Value ではなくて、 hiddenValue = ie.document.getElementsByTagName("input")("hogehoge").Value でした。 試しに、下記を実行してみてください。 Sub Macro1() Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") With ie .Visible = True .navigate "http://okwave.jp/qa/q7917113.html" While .Busy Or .ReadyState <> 4: DoEvents: Wend .document.getElementsByTagName("INPUT")("word").Value = "ほげほげら" .document.forms("header_submit")(1).Click While .Busy Or .ReadyState <> 4: DoEvents: Wend MsgBox .document.getElementsByTagName("INPUT")("word").Value .Quit End With Set ie = Nothing End Sub
- DOUGLAS_
- ベストアンサー率74% (397/534)
>inputにある hogehogeのIDの値を取得 とのことですが、 <td><input id="hogehoge" value="値"></td> みたいになってるってことですか?(※) >今まで特に問題なく、データを取得できていたのに、 ※の答えが「Yes」で、なお、「hiddenValue」が「NULL」になるようでしたら、#1さんがお書きのようなことが原因かも知れませんが、それでしたら、何も For Each obj3 In ie.document.getElementsByTagName("td") If InStr(obj3.innerHTML, "INPUT") Or InStr(obj3.innerHTML, "input") Then hiddenValue = ie.document.getElementById("hogehoge").Value Exit For End If Next などという回りくどい探索をなさらなくとも For Each obj3 In ie.document.getElementsByTagName("input") hiddenValue = ie.document.getElementById("hogehoge").Value Exit For Next でイケますし、さらに申せば、 hiddenValue = ie.document.getElementsByTagName("input")("word").Value で十分かと。。。
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
因みに、 >For Each obj3 In ie.document.getElementsByTagName("td") の「td」は「引数の大文字小文字は区別しない」って仕様なので、「<TD>」「<Td>」「tD」「td」の全部のタグに反応してくれます。
お礼
回答ありがとうございます!!
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
>If InStr(obj3.innerHTML, "INPUT") Or InStr(obj3.innerHTML, "input") Then これは駄目。 こういう場合は「文字列を全部大文字に変換して"INPUT"を含むか?」とか「文字列を全部小文字に変換して"input"を含むか?」と言う判定をしないといけない。 「Input」とかだったらhiddenValueがNULLになるからね。 「HTMLタグでは大文字小文字は同一視する」って仕様は「INPUTとinputは同一」って意味じゃないからね。これの本当の意味は「大文字小文字がグチャグチャにゴチャ混ぜになってても全部同じ」って意味だから。 なので「inPut」とか「InPut」とか「iNpUt」とかにも対処しないといけない(5文字だから2の5乗で、全部で32通りある) 大文字小文字の全部の組み合わせを羅列する訳には行かないから「全部大文字に変換して調べる」とか「全部小文字に変換して調べる」ってのが必要になる。
お礼
コードまで書いていただきありがとうございます。 いただいたコードで試してみたのですが、 エラーになってしまい値を取得できませんでした。