VBAに関して質問です。


エクセルのマクロを使用して、自分が調べたいキーワードを含む文をホームページから抜き出し、記録したいと考えています。

実際には、A列にホームページのURL、B列にキーワード、C列にキーワードを含む文を保存する場所を用意します。

マクロを起動すると、

1:A列のURLを読み込みインターネットエクスプローラーで移動する。
2:B列のキーワードを含む文を抜き出す。
’キーワードを含む文の前の文の終りの。からキーワードを含む文の終りの。までを抜き出したいです。
3:その抜き出した値をC列に入れる。

コードを書いて頂けた場合は少ないですが、500pt送らせていただきます。
もし無理な場合は自分なりに書いたコードを一部修正していただけると嬉しいです。

ご回答お待ちしております。

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

回答2件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント250pt

私ならばIEを起動せずに直接取得します
作って動作させたコードを載せてますが、
検索パターンは対象としているサイトの内部構造にあわせる必要があります

Option Explicit

Sub MySearch()
    '
    'メインとして呼び出すマクロ
    '
    
    ' 定数
    Const targetList = "A": 'URLの入っている列
    Const searchKeyward = "B": '検索キーワードの入っている列
    Const resultText = "C": '結果を格納する列
    
    ' 変数準備
    Dim startRow As Long, lastRow As Long
    startRow = 2: ' コメント欄のコードにあわせてA2からURLが記載されているものとする
    
    'このマクロはアクティブなシートを対象として動作するものとする
    With ActiveSheet
        lastRow = .Cells(.Rows.Count, targetList).End(xlUp).Row: 'URLの列を見てデータの最終行を求める
        If lastRow < startRow Then Exit Sub: 'URLの記載が無ければプログラム終了
        
        '作業ループ
        Dim nowRow As Long: '作業中の行(ループで使用するため初期値ありません)
        For nowRow = startRow To lastRow
            .Cells(nowRow, resultText).Value = MyHttpRequest(.Cells(nowRow, targetList).Value, .Cells(nowRow, searchKeyward).Value)
        Next nowRow
    End With
    
    '終了メッセージ
    MsgBox "終了しました"
End Sub

Function MyHttpRequest(targetURL As String, searchKeyward As String) As String
    ' サイトからキーワードを含む文字列を抜き出す関数
    
    ' 変数準備
    Dim x As Object, r As Object, m As Variant
    
    'バインディング
    Set x = CreateObject("MSXML2.XMLHTTP")
    Set r = CreateObject("VBScript.RegExp")
    
    '情報取得
    x.Open "GET", targetURL, False
    x.send (Null)
    
    '抽出
    r.Pattern = "。.*?" & searchKeyward & ".*?。": '抽出パターン
    r.IgnoreCase = True: '大文字小文字を区別しない
    r.Global = False: '最初に見つかった文字列だけを対象とする
    Set m = r.Execute(x.responseText):  '実行
    If m.Count > 0 Then
        MyHttpRequest = Mid(m(0).Value, 2)
    Else
        MyHttpRequest = "見つかりませんでした"
    End If
    
    ' 開放
    Set m = Nothing
    Set r = Nothing
    Set x = Nothing
End Function

情報収集部分を関数として分離してありますので、
どの部分で何を行っているのかを理解しやすいと思いますし、
サイトにあわせて関数を複数種類用意するということも容易になろうかと思います

IEを起動して操作するという動作コストが高すぎるため、
コメント欄のコードは情報収集用途には向きませんし、
適当に繋ぎ合わせてあるため、修正すべき点も多く、修正は行ってません

id:windofjuly

定数のほうが若干ですが動作が軽くなったような感じになりましたので、
targetList, searchKeyward, resultText の3つを変数から定数に変更しました

2011/12/24 11:14:08
id:kodairabase No.2

回答回数661ベストアンサー獲得回数80

ポイント250pt

http://www2s.biglobe.ne.jp/~iryo/vba/IE/index01.html
ここにまとまって載ってます

  • id:aiomock
    コードを一部書いてみました。

    Sub Macro1()


    Const BASE_URL As String ="A"

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    Range("A1").Select
    Do Until ActiveCell.Value = ""


    Dim url As String
    url = Replace(BASE_URL, "A")

    ActiveCell.Offset(1, 0).Activate
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend

    Dim MyHtml As Variant
    Debug.Print "開始"
    MyHtml = objIE.Document.body.innerHTML

    Dim re As Object
    Dim mc As Object
    Dim i As Variant

    Set re = New RegExp

    i = ActiveCell.Row

    re.Pattern = "。(.*?)"B"(.*?)。"
    re.IgnoreCase = True:
    re.Global = True:

    Set mc = re.Execute(MyHtml)
    If mc.Count >= 1 Then Cells(i - 1, "C").Value = mc(0).SubMatches(0)

    Loop



    End Sub
  • id:taknt
    ホームページの取得には タグを解析しないといけないから それをしないと デタラメな取得しかできないだろうね。
  • id:taknt
    たとえば
    http://q.hatena.ne.jp/1324686021
    このページを
    はてな
    で検索すると・・・。

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

トラックバック

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

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

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