VBAでHTMLの解析をしたいと思っています。
ですが解析対象のページに行くまでログイン処理だったりと辿り着くのが面倒です。
ですからHTMLをコピペして対処しようと思っております。
URL先のHTMLを読み込むのは
Dim doc As HTMLDocument
Set doc = oHTML.createDocumentFromUrl(url, vbNullString)
で出来ましたが、
doc = "<html>...</html>"
のようにString型を代入するにはどうしたらよいのでしょうか。
よろしくお願いします。
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 だったりするのだけれど。
MSHTML は、参照設定してある、ってことですよね。
こんな感じで、できるんじゃないかな、と。
Dim doc As HTMLDocument Set doc = New HTMLDocument doc.write "<html>...</html>"
Dim doc As HTMLDocument
Set doc = oHTML.createDocumentFromUrl(url, vbNullString)
String htmlString = doc.getElementsByTagName("html");
これで、HTMLタグで囲まれている部分が文字列として取得できます。
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
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 だったりするのだけれど。
URL先のHTMLを読み込むだけですね。
2012/01/11 23:53:38そうではなくString型を代入したいのです。
やりたいことはフォームにHTMLを入力し、それを処理させることなので、これを実現するための方法を教えてください。
まず
2012/01/12 09:08:31Set doc = oHTML.createDocumentFromUrl(url, vbNullString)
とやったときに 読み込みが完了するまで待つ必要があります。
読み込めれば
Doc.body.innerHTML
に HTMLが 入っているはずです。
それは Stringですよ。
それらが 回答内のURLのホームページにかかれてますけど、違うことが知りたいのでしょうか?