三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

MSHTMLを参照設定後、As HTMLDocument と.createDocumentFromUrlで文章を読み込み使うテスト

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とセット行位置を受け取って回すようにすれば、
いいのでは、、、と、蛇足ですが、思ったり。

IEを使わないで、MSHTMLで文章を処理する参考となれば、、、

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)