すいません。質問させてください。 Sub GetRequestSimple1() で、 '所定のIDの要素を取得します Dim oH1 As MSHTML.HTMLHeadElement Set oH1 = oHTml.getElementById("h1_01") Debug.Print oH1.outerHTML Debug.Print oH1.innerHTML Debug.Print oH1.innerText
Sub GetRequestSimple1_ADO()
Dim url As String
url = "http://www.exvba.com/ws/dombasic.html"
Dim xh As New WinHttp.WinHttpRequest
xh.Open "GET", url, False
xh.send
Dim sCode As String
sCode = xh.Status
If sCode <> 200 Then
MsgBox "リクエストに失敗しました" & vbNewLine & sCode
End If
'htmlをDOMとして取得する。そのための変数を宣言。
Dim oHTml As New MSHTML.HTMLDocument
'oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得
'文字化け対策で関数呼び出し
oHTml.body.innerHTML = get_response_body_encoded(xh, "utf-8")
'所定のIDの要素を取得します
Dim oH1 As MSHTML.HTMLHeadElement
Set oH1 = oHTml.getElementById("h1_01")
Debug.Print oH1.outerHTML
Debug.Print oH1.innerHTML
Debug.Print oH1.innerText
'所定の要素の次の要素を取得します
' Debug.Print oH1.NextSibling.outerHTML
' Debug.Print oH1.NextSibling.innerHTML
' Debug.Print oH1.NextSibling.innerText
Debug.Print oH1.nextElementSibling.outerHTML
Debug.Print oH1.nextElementSibling.innerHTML
Debug.Print oH1.nextElementSibling.innerText
'HTMLBody全体を取得します
Dim oH As MSHTML.HTMLBody
Set oH = oHTml.getElementsByTagName("body")(0)
Debug.Print oH.outerHTML
Debug.Print oH.innerHTML
Debug.Print oH.innerText
'HtmlBodyの子要素のうち4番目のものを取得します
' Debug.Print oH.ChildNodes(3).outerHTML
' Debug.Print oH.ChildNodes(3).innerHTML
' Debug.Print oH.ChildNodes(3).innerText
Debug.Print oH.Children(3).outerHTML
Debug.Print oH.Children(3).innerHTML
Debug.Print oH.Children(3).innerText
'H2タグのついた要素すべてを順番に調べます
Dim oH2 As MSHTML.HTMLHeadElement
For Each oH2 In oHTml.getElementsByTagName("h2")
Debug.Print oH2.outerHTML
Debug.Print oH2.innerHTML
Debug.Print oH2.innerText
Next
End Sub
'以下に紹介するライブラリの参照設定をしてください
'Microsoft ActiveX Data Objects 2.X Library -> ADOで文字化けを処理するため
Private Function get_response_body_encoded(xh As WinHttp.WinHttpRequest, charset As String)
Dim byte_body() As Byte
byte_body = xh.responseBody
Dim ado_stream As New ADODB.Stream
Dim result As String
ado_stream.Open
ado_stream.Position = 0
ado_stream.Type = 1
ado_stream.Write byte_body
ado_stream.Position = 0
ado_stream.Type = 2
ado_stream.charset = charset
result = ado_stream.ReadText
ado_stream.Close
get_response_body_encoded = result
End Function
受講生さんの投稿
(投稿ID: 5509)
Sub GetRequestSimple1() で、
'所定のIDの要素を取得します
Dim oH1 As MSHTML.HTMLHeadElement
Set oH1 = oHTml.getElementById("h1_01")
Debug.Print oH1.outerHTML
Debug.Print oH1.innerHTML
Debug.Print oH1.innerText
の部分を実行すると、
イミディエイトウィンドウに、
<h1 id="h1_01">DOMa?μa?3a??a?≪</h1>
DOMa?μa?3a??a?≪
DOMa?μa?3a??a?≪
と出るのですが、これはどこら辺の問題でしょうか?
ちなみにその次の'所定の要素の次の要素を取得します では、
実行時エラー'438' とでます。
よろしくお願いいたします。
田中 宏明さんのコメント
(コメントID: 8272)
文字化けしているようなので、対策してみました。
次の要素取得や子の要素取得も修正して、正常動作しました。
楽しいですね。
受講生さんのコメント
(コメントID: 8274)
ありがとうございます。ご修正頂いたコードで動きました。
私の環境で、なぜ先生の動画と同じように動かなかったのかが疑問なのですが、
エクセルのバージョンの問題でしょうか?(当方は2019利用です)
もしご存じでしたらご教示いただければ幸いです。
田中 宏明さんのコメント
(コメントID: 8276)
同じように動作出来たとのことで何よりです。
こちらの現在の環境は Windows11 Excel2021 です。
正確な情報は持ち合わせていませんが、私も過去に
Windows10 Excel2016 で、普通に動いていたので、
エクセルというよりも、OSのライブラリーが関係し
ていると思われます。
受講生さんのコメント
(コメントID: 8277)
当方、windows10でエクセル2019です。
OSも影響し得るのですね。なるほど。。
始めたばかりで私はまだ感覚が掴めておりませんが、経験を積むうちに凡その微調整が見えてくるかもしれませんね。ありがとうございました。
小川 慶一さんのコメント
(コメントID: 8278)
ありがとうございます。
僕も、田中さんの提案の方法以外に解決策をちょっと思いつかないですね。ほかにもいろいろと試してみたのですが、簡単な解決策は見つかりませんでした。
文字コードの扱いが内部で変わってしまったものと思います。