• 締切済み

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がある為、何が原因なのかが不明です・・・。 どなたかこのような状況になったことはないでしょうか?? お知恵を貸してください。

みんなの回答

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.5

#3・4 DOUGLAS_ です。 >いただいたコードで試してみたのですが、 >エラーになってしまい値を取得できませんでした。  ん~。。。  前回答のコードが動かないということになれば、まず、下記の点について、ご回答ねがいます。 1)「今まで」と「ここ最近」の間に、何か変わったことは思い当たりませんか?  新しいソフトをインストールしたとか、IEのバージョンが変わったとか。。。 2)「ここ最近」お使いのパソコンのOSとIEのバージョンは何でしょうか?  また、エクセルのバージョンもお知らせください。 3)「エラーになってしまい」というのは、どんなエラーでしょうか?  前の回答のどこかでVBAが止まって、そのステートメントが黄色になってますか? 4)「値を取得できません」とお書きですが、これは、どのステートメントのタイミングでしょうか?  MsgBox に何も表示されないということですか? 5)ついでに、ご質問のコードを試していらっしゃるサイトのURLを、お差し支えなければお示しいただけますか?

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

#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

aiurai54
質問者

お礼

コードまで書いていただきありがとうございます。 いただいたコードで試してみたのですが、 エラーになってしまい値を取得できませんでした。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>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 で十分かと。。。

回答No.2

因みに、 >For Each obj3 In ie.document.getElementsByTagName("td") の「td」は「引数の大文字小文字は区別しない」って仕様なので、「<TD>」「<Td>」「tD」「td」の全部のタグに反応してくれます。

aiurai54
質問者

お礼

回答ありがとうございます!!

回答No.1

>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通りある) 大文字小文字の全部の組み合わせを羅列する訳には行かないから「全部大文字に変換して調べる」とか「全部小文字に変換して調べる」ってのが必要になる。