2012/01/12 追記
人力検索の回答に似たような処理があったので、先に
http://q.hatena.ne.jp/1326289490#a1127039
↑こちらを参考にするといいかも。
元の三流君記事
まず、他店(他のサイト)の紹介からhttp://q.hatena.ne.jp/1250623193#a942081 の 回答1:HALSPECIAL さんの紹介サイト
Web ページをダウンロードする方法? MSXML 編? ※1
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaXMLHTTP.html
を見て、
紙の辞書で目的の単語のそばで、違う単語を見て勉強になったなぁ、、じゃないけど、
隣の?
Web ページをダウンロードする方法〜 MSHTML 編〜 ※2
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html
MSHTML 編が面白かったので、使ってみました。
紹介者のHALSPECIAL さん と サンプルページ※1※2 作成者のYU-TANG さんに感謝しつつ、
私は、ネット上のHTML文章処理、いつもIEを表示して使っていますが、
MSHTMLを参照設定して、
As HTMLDocument
こいつで使う方法があるみたいです。
まず、MSHTMLを参照設定して、から、
Set objMOTO = New HTMLDocument
で1つ親を作り、
.createDocumentFromUrl(strURL, vbNullString)
で、新規文章を読み込むと、あとは、普通に文章にアクセスできそうです。
※いつもは、CreateでIE作って、.Navigate でページを表示だったけど、、、
※※参照設定しない方法を http://d.hatena.ne.jp/ken3memo/20090903/1251991651 で探ったが失敗・・・
説明は、置いて置き、参照設定して、ソースを貼り付けて実際に動かしてみてください。
Option Explicit Sub aaa() 'okwave 回答の取り込み処理 テストで1つだけ。 Const strURL = "http://okwave.jp/qa5201496.html" 'テスト用のURL 'まず、元を参照設定してあるので、Newで作る 'Web ページをダウンロードする方法〜 MSHTML 編〜 'http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html 'を参照 と その中で紹介されている http://www.pcreview.co.uk/forums/thread-1424062.php#post12485559 Dim objMOTO As HTMLDocument '親元のオブジェクトが必要なので Set objMOTO = New HTMLDocument '変数宣言↑と一緒にやれよ、、と言われそうだけど。。。 objMOTO.designMode = "on" '←これで、警告が出ない、かわりに、JavaScriptなどが走らないので動的ページは不可? 'やっと、捕まえたい文章を変数に入れる。 Dim objDOC As HTMLDocument 'こっちを、使用する。(文章を読み込変数) '.createDocumentFromUrl なんて感じで、簡単に読めるみたい。 Set objDOC = objMOTO.createDocumentFromUrl(strURL, vbNullString) 'あとは、読み込み待ち、文章が .readyState = "complete" になるまでループ While objDOC.readyState <> "complete" '※文字の比較です、いつもの4じゃないよ注意してね。 DoEvents '嫌いな人、居るけど、いつものヤツ(笑) Wend '読み込めたら、HTML文章としてGetできたら、あとはいつものタグ処理で、、、 'TRのタグを抜く Dim objTR As HTMLTableRow '行のオブジェクト Dim strTEXT As String '変数名が変だけど Dim xCNT As Integer 'セル列のカウンター Dim yCNT As Integer 'セル行のカウンター yCNT = 10 'テストで10行目にセットする xCNT = 5 '回答をE列5からセットする '文章(objDOC)全体(.all)からタグのTR(.tags("TR"))を1つ1つ処理 For Each objTR In objDOC.all.tags("TR") strTEXT = objTR.innerText '行のテキストを取り出す。 Debug.Print strTEXT '左から4文字で判断、たまたま、4文字だったので Select Case Left(strTEXT, 4) Case "質問者:" '質問者の行にタイトルが入ってます Cells(yCNT, "C") = strTEXT '行の文字列をセット Case "困り度:" 'ここに、質問内容 Cells(yCNT, "D") = strTEXT '質問内容をDへ Case "回答者:" 'ここが回答、複数回答があるので、カウンターをずらす。 Cells(yCNT, xCNT) = strTEXT '質問内容をE〜 xCNT = xCNT + 1 End Select '↑素朴な疑問、この回答へのお礼は必要ないのかなぁ?? Next Set objTR = Nothing Set objDOC = Nothing Set objMOTO = Nothing MsgBox "終了" End Sub
処理のポイントは
Set objDOC = objMOTO.createDocumentFromUrl(strURL, vbNullString)
で、objDOCにURL(okwave)の文章が読まれるので、
手抜きで、まず、テーブル・表から行単位の抜き出し
For Each objTR In objDOC.all.tags("TR")
で、1行のデータがobjTRに入るので、
ここから、テキストデータを.innerText で抜きます。
strTEXT = objTR.innerText '行のテキストを取り出す。
で、左から4文字を比べ、単純にセットしました。
たぶん、URLの一覧は、
http://q.hatena.ne.jp/1251504373
で、B列に取れていると思うので、
Sub xxxx(strURL, yCNT) '
↑みたいにURLとセット行位置を受け取って回すようにすれば、
いいのでは、、、と、蛇足ですが、思ったり。