許せない心理テスト

エクセルのVBAを用いてIEから文字を取得したいのですが、
ものによっては変数に入らずに困っております。

以下のコードでドキュメントのアンカーエレメントからinnerTextで文字を取得したいのですが、
ローカルウィンドウで見ると objIE.Document が『変数なし』になるのです。
これはどうしたらよいのでしょうか。
この状態では objIE.Document の中の情報がまったくわからないのです。

また、回答の中には、以下のコードのコメント部分の様に
Set objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
とすれば良いとありますが、そうすると objIE そのものが『変数なし』になります。

EXCEL2000でVBAからIE11の環境がそうさせるのでしょうか。
検索するとたくさん回答が出てきますが、決定的なものはありません。
教えてください。よろしくお願いします。

Sub main()
Dim objIE As Object
Dim urlIE As String
urlIE = "http://www.nifty.com/"
Set objIE = CreateObject("InternetExplorer.Application")
'** objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
objIE.Visible = True
objIE.navigate urlIE
Stop
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Sub

A 回答 (2件)

アンカーエレメント(Aタグ)内の文字列を取得したいということですね。


Aタグ内は必ず文字列とは限らず、IMGタグになっている場合もあります。
下記の例では、innerHTMLを取得して書き出すようにしています。
参考にしてください。

Sub main()
Dim objIE As Object
Dim urlIE As String
Dim objA As Object
Dim objTmp As Object
Dim myRng As Range
Dim inner As String
'URL
urlIE = "http://www.nifty.com"
'貼り付け開始位置
Set myRng = Worksheets("Sheet1").Range("B10")

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.navigate urlIE

Do While objIE.Busy = True Or objIE.ReadyState <> 4
DoEvents
Loop

'Aタグの集合体を取得
Set objA = objIE.Document.getElementsByTagName("A")
For Each objTmp In objA
inner = objTmp.innerHTML
myRng = inner
Set myRng = myRng.Offset(1, 0)
Next

End Sub
    • good
    • 0
この回答へのお礼

いったんゲットエレメントで取得すると言う事ですね。
参考になりました。ありがとうございました。

お礼日時:2017/12/26 20:57

>EXCEL2000でVBAからIE11の環境がそうさせるのでしょうか。



要点だけにとどめますが、IE11 だからうまくいかないでしょう。下位バージョンでは成立していたのは知っていますが、うつうは使わないですね。
Internet Explorer というのは、三層構造になっていたと思いますので、
>Set objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
たぶん、これですと、その一部で、オブジェクトとしては成立していないのだと思うのです。


Dim ta
Dim i As Long
Dim j As Long
'**省略**


Do While objIE.Busy Or objIE.ReadyState <> 4: DoEvents: Loop
j = 2 '2行目からの書き出し
With objIE
Set tagA = .Document.getElementsByTagName("a")
If tagA.Length = 0 Then GoTo EndLine
For i = 0 To tagA.Length - 1
 '空白行の除去
If Trim(tagA(i).innerText) <> "" Then
 '不要な改行コードの除去 Clean
 Cells(j, 1).Value = Application.Clean(tagA(i).innerText)
 j = j + 1
 End If
Next i
End With
EndLine:
Set objIE = Nothing
End Sub
    • good
    • 0
この回答へのお礼

別の変数に移せばIE11でもうまく行きそうです。
objIE をオブジェクト型にするより、
HtmlDocument型とかを使うと良いようです。
アドバイスありがとうございました。

お礼日時:2017/12/26 21:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報