エクセルのたとえばA列にヤフーかグーグルで検索したい飲食店(値)の名前が1,000行入っています。
それを上から順番に検索していきます。この作業はloopやfor ~ nextで対応可能だと思います。問題はここからです。
その検索した文字を、ヤフーかグーグルで検索します。検索結果で、「ヤフーロコ」、「ホットペッパー」のリンク先URL、例えばURLに”loco.yahoo.co.jp/”や”hotpepper.jp/”が入っているもののみを、B列、C列に抽出します。もし、ヤフーロコやホットペッパーの両方に、該当の飲食店がなけれが、うち1つか、もしくは該当なしとして空白のまま、次の列に行き、また検索を続けていくというものです。
自動化処理は可能でしょうか。
No.1ベストアンサー
- 回答日時:
こんばんは。
試しに、googleで調べてみました。
気になるレストラン名「ローターオクセン」(もうかつてのお店はなくなっていると思いつつ……)
を検索してみました。
「あった!」
おまけに、”loco.yahoo.co.jp/”や”hotpepper.jp/”が入っているのでした。
これなら、できますね。(^^;
VBA勉強中さんのVBAのお勉強のタシになるか分かりませんが、ちょっとコードを考えてみました。
実践的ではありませんし、雑な内容で、まだまだ修正の余地はありますが、基本的な考え方は分かっていただけるように思います。一応、検索は、1ページだけです。この辺りは、今のところ暗中模索です。
エラーを考慮していませんので、万が一には、ずれる可能性もありますので、検索値は、再び、セルに戻すようにしたほうがよいです。1,000件以上ですと、本当は、以下のようなコードはアクセス方法から変えないとダメだとは思いますが、当面のコードとしては、考え方は分かるはずです。
'//
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private objIE As InternetExplorer
''参照設定:Microsoft Internet Controls
Private Hpp As Boolean
Private Lya As Boolean
Sub MainAccess()
Dim srcTxt As String
Dim n As Variant
Const BASE = "https://www.google.co.jp/" 'グーグル検索
Cells(1, 1).Resize(, 5).Value = Array("店名", "loco.Yahoo", "URL1", "ホットペッパー", "URL2")
Set objIE = New InternetExplorer
With objIE
.Visible = True ''安全だと分かったら、False 可
.Navigate2 BASE
Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
End With
For Each n In Range("A2", Cells(Rows.Count, 1).End(xlUp))
ieSearch n.Value, objIE
Next
objIE.Quit
Set objIE = Nothing
End Sub
Sub ieSearch(ByVal srcTxt As String, objIE As InternetExplorer)
Dim srchBx As Object
Dim srchBtn As Object
Dim iSrc As Variant
Dim v As Variant
Dim buf As String
Dim iHtml1 As String
Dim iHtml2 As String
Dim i As Long
Lya = False: iHtml1 = ""
Hpp = False: iHtml2 = ""
With objIE
Set srchBx = .Document.getElementById("lst-ib")
srchBx.Value = srcTxt
srchBx.form.Submit
Sleep 1000 'ウェイトが重すぎるかも?しかし、抜けることもある
Do
DoEvents
Loop Until .ReadyState = READYSTATE_COMPLETE
Set iSrc = .Document.getElementsByClassName("g")
If iSrc.Length > 0 Then
For Each v In iSrc
If InStr(1, v.innerHTML, "loco.yahoo.co.jp", 1) > 0 Then
Lya = True
buf = Mid(v.innerHTML, InStr(1, v.innerHTML, "href=""", 1) + 6)
iHtml1 = Left(buf, InStr(1, buf, " target", 1) - 2) & vbCrLf
End If
If InStr(1, v.innerHTML, "hotpepper.jp", 1) > 0 Then
Hpp = True
buf = Mid(v.innerHTML, InStr(1, v.innerHTML, "href=""", 1) + 6)
iHtml2 = Left(buf, InStr(1, buf, " target", 1) - 2) & vbCrLf
End If
buf = ""
Next
i = Cells(Rows.Count, 2).End(xlUp).Row + 1
'Cells(i, 1).Value = srcTxt
Cells(i, 2).Value = Lya
Cells(i, 3).Value = iHtml1
Cells(i, 4).Value = Hpp
Cells(i, 5).Value = iHtml2
End If
End With
End Sub
No.2
- 回答日時:
こんにちは。
>デバッグで
>iHtml2 = Left(buf, InStr(1, buf, " target", 1) - 2) & vbCrLf
>の部分が反転します。
実は、掲示内にアップするまで、最後の最後まで粘ったけれども、ここの部分は解決付かなかったのです。「想定内」とか言うつもりはないのですが、やはり「手抜きした所」が、もろに突かれてしまいました。(^^;
Sub MainAccess() がそのままでよいですが、次のieSearchというプロシージャは、入れ替えてください。もちろん、変更箇所を入れ替えてもよいです。ただし、まだ、エラーが出る可能性がなくなったわけではありません。On Error Resume のトラップを入れてもよいのですが、
Set r = g.getElementsByClassName("r")
ここから、
Set r_c = r(0).ChildNodes
この行に移行できる根拠などはありません。本来は、エラーチェックを入れればよいのですが、していません。たぶん、大丈夫だろうというところで進んでいます。(0)などが入る所は、本来みんな同じで、If r.Length >0 Then というチェックを入れないといけないのですが……。
>「プロシージャまたは引数が不正です」
これはよく分かりません。VBAのコードの問題のようですが……。
http://officetanaka.net/excel/vba/error/executio …
たぶん、ここと同じ話でしょうね。MidとInstr関数の組合せはやめましたから、大丈夫なはずです。
>私には難解でどこを調整したらよいのかが分かりません…。
最近、こういうのにはまっています。伝家の宝刀「FireBug」と、JavaScriptの書籍をみながらです。「FireBug」 の展開したリストから、探りを入れているというわけです。厳密には、こういうコードはVBAとも違うわけです。私も、きちんと本で勉強したらいいのですが、ナアナアなんです。
それらか、もう一つ、バグッぽい所に、
''Cells(i, 1).Value = srcTxt '検索値
があるのは、この i は、ワークシート側と繋がっていないのです。
だから、本来は、ワークシートのセルの行数を、持ってきたほうがよいのですが、直せますか?
'//
Sub ieSearch(ByVal srcTxt As String, objIE As InternetExplorer)
Dim srchBx As Object
Dim srchBtn As Object
Dim iSrc As Variant
Dim buf As String
Dim iHtml1 As String
Dim iHtml2 As String
Dim i As Long
Dim g As Object ' HTMLLIElement
Dim r, r_c
Lya = False: iHtml1 = ""
Hpp = False: iHtml2 = ""
With objIE
Set srchBx = .Document.getElementById("lst-ib")
srchBx.Value = srcTxt
srchBx.form.Submit
Sleep 1000 'ウェイトが重すぎるかも、100でも可か?
Do
DoEvents
Loop Until .ReadyState = READYSTATE_COMPLETE
Set iSrc = .Document.getElementsByClassName("g")
If iSrc.Length > 0 Then
For Each g In iSrc
If InStr(1, g.innerHTML, "loco.yahoo.co.jp", 1) > 0 Then
Lya = True
Set r = g.getElementsByClassName("r")
Set r_c = r(0).ChildNodes
iHtml1 = r_c(0).href
End If
If InStr(1, g.innerHTML, "hotpepper.jp", 1) > 0 Then
Hpp = True
Set r = g.getElementsByClassName("r")
Set r_c = r(0).ChildNodes
iHtml2 = r_c(0).href
End If
Next
i = Cells(Rows.Count, 2).End(xlUp).Row + 1
''Cells(i, 1).Value = srcTxt '検索値
Cells(i, 2).Value = Lya
Cells(i, 3).Value = iHtml1
Cells(i, 4).Value = Hpp
Cells(i, 5).Value = iHtml2
End If
End With
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
検索結果のURLの取得
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
読み方
-
nslookupでIPアドレスが表示さ...
-
「Yahoo.com」とは何ですか?Ya...
-
レザークラフト ブレスレット...
-
Yahoo!の検索結果のタイトルが...
-
ドライバーのOD式安全テストOD...
-
こんなエラーがこのサイトで出ます
-
標準価格と定価と希望小売価格...
-
太宰府天滿宮 求解籤詩
-
10億ウォンって日本円でいくら...
-
best sunset beach
-
googleへの問い合わせメールか...
-
教えて!goo よりも Yahoo!知恵...
-
愛知万博 藤井フミヤプロデュ...
-
証明写真機本体の価格について
-
NslookupでIPアドレスだけ出力,...
-
痴女ってどうゆう意味ですか? ...
-
毒親で悩んでいる事をこう言っ...
-
ロボティクスウェアの「Panel B...
-
違法サイト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
読み方
-
yahooブックマークでは、フォル...
-
「Yahoo.com」とは何ですか?Ya...
-
シークレットオブエヴァンゲリ...
-
規定打席の3.1の意味。
-
nslookupでIPアドレスが表示さ...
-
制服 てかり
-
夜の8時30分ごろ、キィ、キィ、...
-
尾張温泉東海センターの 昔の写...
-
Yahoo!の検索結果のタイトルが...
-
ドライバーのOD式安全テストOD...
-
まろも世にあらばこそあらめ、 ...
-
相撲の星取表をすばやく作る
-
yahoo電話登録の登録仕方教えて...
-
VF1000R整備
-
HPのURLを変更した場合、検索エ...
-
【助けてください】googleの画...
-
吉田拓郎「元気です」の歌詞を...
-
「夢にもうかがうことのできぬ...
-
ヤフーの検索ができない
おすすめ情報
いち早いご回答をありがとうございます!
実際、マクロを実行させてみますと、
「Private objIE As InternetExplorer」の部分で
コンパイルエラー:
ユーザ定義型が定義されていません
と出てきてしまいますが、どういうことなのでしょうか?
WindFaller 様
上記の件は解決いたしました。
ただ再度マクロを実行すると、Googleの画面が開いた後に
「プロシージャまたは引数が不正です」
とエクセル上に出てきます。
自分でも調べてみますが、何か理由があれば教えていただけないでしょうか。
何度も申し訳ありません。
デバッグで
iHtml2 = Left(buf, InStr(1, buf, " target", 1) - 2) & vbCrLf
の部分が反転します。
ただ、私には難解でどこを調整したらよいのかが分かりません…。
WindFaller 様
自分なりに調べて解説を付けてみました。
buf = Mid(v.innerHTML, InStr(1, v.innerHTML, "href=""", 1) + 6) 'HTMLソースから、1列から始めてHTMLソースからhref=""が含まれている文字列の6文字目以降すべてが返された変数bufとする
iHtml1 = Left(buf, InStr(1, buf, " target", 1) - 2) & vbCrLf 'bufから、最初から初めてbufの中からスペースtargetを探し、そこから2文字目前までを左から返した変数をiHtml1とする
いつもありがとうございます。
Set r_c = r(0).ChildNodes
の部分がデバッグ反転し、「オブジェクト変数またはwithブロック変数が設定されていません」
と出てきてしまいます。
childNodesに関しては、ネットで調べてみましたが、「与えられた要素の子ノードの collection を返します。」とあり、説明が初めて出てくるものばかりでさっぱりです(笑)
これから勉強します。