VBAでのHTMLDocument


VBAでHTMLの解析をしたいと思っています。
ですが解析対象のページに行くまでログイン処理だったりと辿り着くのが面倒です。

ですからHTMLをコピペして対処しようと思っております。

URL先のHTMLを読み込むのは
Dim doc As HTMLDocument
Set doc = oHTML.createDocumentFromUrl(url, vbNullString)
で出来ましたが、

doc = "<html>...</html>"
のようにString型を代入するにはどうしたらよいのでしょうか。

よろしくお願いします。


回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/01/12 18:32:30
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.5

回答回数4974ベストアンサー獲得回数2154

ポイント50pt

doc.write使えなかった。.NetだとOpenNewが必要だとあるけれど、vbaにはOpenNewない。でもそれが原因かはわからない。

たしかに、「コンパイルエラー関数またはインターフェイスが予約されているか、またはVisual Basicでサポートされていないオートメーションタイプが関数で使用されています」というエラーが出てしまうようです。

こんな感じで動作するようになりました。

Sub Macro1()

    Dim doc As Object
    Set doc = CreateObject("htmlfile")
    doc.write ("<html><head><title>test</title></head><body><p>test</p></body></html>")

    ' 確認っ!
    MsgBox doc.FirstChild.outerHTML

End Sub

MSHTML への参照設定も必要なさそうです。


こんなんでもイケました。

    Dim doc As Object
    Set doc = New HTMLDocument
    doc.write "<html><head><title>test</title></head><body><p>test</p></body></html>"

こっちは、MSHTML への参照設定が必要です。


【追記】
型を Object にすると動くので、As HTMLDocument がマズいんだろうなあ、と試行錯誤。

Sub Macro1()

    Dim doc As IHTMLDocument        '※ これっ!
    Set doc = New HTMLDocument
    doc.write "<html><head><title>test</title></head><body><p>test</p></body></html>"

    ' 確認っ!
    MsgBox doc.FirstChild.outerHTML

End Sub

http://msdn.microsoft.com/en-us/library/aa752574%28v=VS.85%29.aspx
write メソッドを規定しているのは、IHTMLDocument2 インターフェースにもかかわらず、
型を IHTMLDocument2 にしても駄目で、IHTMLDocument にすると動くという不思議。

オブジェクトブラウザで確認しても、write を持っているのは、HTMLDocument だったり、IHTMLDocument2 だったりするのだけれど。

その他の回答4件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

http://mt-soft.sakura.ne.jp/web_dl/vb-parts/get_http2/

こちらを参考にしてみてください。

id:after_333sec

URL先のHTMLを読み込むだけですね。
そうではなくString型を代入したいのです。

やりたいことはフォームにHTMLを入力し、それを処理させることなので、これを実現するための方法を教えてください。

2012/01/11 23:53:38
id:taknt

まず
Set doc = oHTML.createDocumentFromUrl(url, vbNullString)
とやったときに 読み込みが完了するまで待つ必要があります。

読み込めれば
Doc.body.innerHTML
に HTMLが 入っているはずです。
それは Stringですよ。

それらが 回答内のURLのホームページにかかれてますけど、違うことが知りたいのでしょうか?

2012/01/12 09:08:31
id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

MSHTML は、参照設定してある、ってことですよね。
こんな感じで、できるんじゃないかな、と。

Dim doc As HTMLDocument
Set doc = New HTMLDocument
doc.write "<html>...</html>"
id:taroe No.3

回答回数1099ベストアンサー獲得回数132

ポイント10pt

Dim doc As HTMLDocument
Set doc = oHTML.createDocumentFromUrl(url, vbNullString)

String htmlString = doc.getElementsByTagName("html");

これで、HTMLタグで囲まれている部分が文字列として取得できます。

id:TransFreeBSD No.4

回答回数668ベストアンサー獲得回数268

ポイント30pt

doc.write使えなかった。.NetだとOpenNewが必要だとあるけれど、vbaにはOpenNewない。でもそれが原因かはわからない。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmldocument.write.aspx
innerHtmlに書けばいいかなと思ったけど、html要素、head要素共に書くとエラーになる。
なのでBodyに書いてみた。htmlタグとかheadタグあっても無視されるけれどbody内はちゃんと反映される。
もし、head要素も反映させたいという場合はファイルに書いてそれを読ませるという手がある。

Option Explicit

Sub Macro1()
    Dim doc As HTMLDocument
    Set doc = New HTMLDocument
    'doc.write "<html><head><title>test</title></head><body><p>test</p></body></html>"
    'MsgBox doc.FirstChild.FirstChild.outerHTML
    'doc.FirstChild.FirstChild.innerHTML = "<title>test</title>"
    'doc.FirstChild.FirstChild.innerHTML = ""
    doc.Body.innerHTML = "<html><head><title>test</title></head><body><p>test</p></body></html>"
    MsgBox doc.FirstChild.outerHTML
End Sub

Sub Macro2()
    Open "D:\example\q1326289490\tmp.html" For Output As #1
        Print #1, "<html><head><title>test</title></head><body><p>test</p></body></html>"
    Close #1
    Dim doc As HTMLDocument
    Dim doc2 As HTMLDocument
    Set doc = New HTMLDocument
    Set doc2 = doc.createDocumentFromUrl("file:///d:/example/q1326289490/tmp.html", vbNullString)
    DoEvents
    MsgBox doc2.FirstChild.outerHTML
End Sub
id:a-kuma3 No.5

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント50pt

doc.write使えなかった。.NetだとOpenNewが必要だとあるけれど、vbaにはOpenNewない。でもそれが原因かはわからない。

たしかに、「コンパイルエラー関数またはインターフェイスが予約されているか、またはVisual Basicでサポートされていないオートメーションタイプが関数で使用されています」というエラーが出てしまうようです。

こんな感じで動作するようになりました。

Sub Macro1()

    Dim doc As Object
    Set doc = CreateObject("htmlfile")
    doc.write ("<html><head><title>test</title></head><body><p>test</p></body></html>")

    ' 確認っ!
    MsgBox doc.FirstChild.outerHTML

End Sub

MSHTML への参照設定も必要なさそうです。


こんなんでもイケました。

    Dim doc As Object
    Set doc = New HTMLDocument
    doc.write "<html><head><title>test</title></head><body><p>test</p></body></html>"

こっちは、MSHTML への参照設定が必要です。


【追記】
型を Object にすると動くので、As HTMLDocument がマズいんだろうなあ、と試行錯誤。

Sub Macro1()

    Dim doc As IHTMLDocument        '※ これっ!
    Set doc = New HTMLDocument
    doc.write "<html><head><title>test</title></head><body><p>test</p></body></html>"

    ' 確認っ!
    MsgBox doc.FirstChild.outerHTML

End Sub

http://msdn.microsoft.com/en-us/library/aa752574%28v=VS.85%29.aspx
write メソッドを規定しているのは、IHTMLDocument2 インターフェースにもかかわらず、
型を IHTMLDocument2 にしても駄目で、IHTMLDocument にすると動くという不思議。

オブジェクトブラウザで確認しても、write を持っているのは、HTMLDocument だったり、IHTMLDocument2 だったりするのだけれど。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません