- ベストアンサー
エクセルのマクロでセルのコピーと貼り付けを自動化する方法
- エクセルのマクロを使って、セルを選択してコピーし、ブラウザの検索窓に貼り付け、そしてエクセルに戻るという作業を自動化する方法について教えてください。
- 同じ操作を複数のセルに別々に実行する場合、個々のセルを一つずつ実行するのは効率的ではありません。他の方法があるのでしょうか?
- 上記の作業を行うためのマクロを作成する方法について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
UWSCなどの、複数アプリをまたいでの自動運転が可能なツールを使うのが簡単でしょう。 公式サイト(ダウンロードでFree版を選ぶ) http://www.uwsc.info/ Free版でもExcelを操作できますが、VBAのようにCellsやRangeでセル位置を直接指定するような関数はないので、Ctrl+Homeを押した後にカーソルキーxx回押して目的位置に移動する、的な工夫は必要になりますが、そこさえ注意していればできます。
その他の回答 (4)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
No.2,4です。No.4に訂正です。 Sub SearchYの下から5行め ーーーーー Private Sub SearchY(Target As Range, Optional ByVal 閾 As Long = 3) .... .... .... If cntMtc >= 2 Then c.Offset(, -1).Value = "●" & cntMtc ←■誤 Next oIE.Quit Set colTagA = Nothing: Set colW = Nothing: Set oIE = Nothing End Sub ーーーーー 正しくは、 If cntMtc >= 閾 Then c.Offset(, -1).Value = "●" & cntMtc '←■正 一文字だけ、置き換えてください。 2つのバージョンを並行して作成している内に編集が漏れてしまったものです。 失礼しました。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
No.2、補足欄、拝見しました。 何をなさりたいか、だいぶ解って来ましたので、より具体的なマクロを提示します。 一応おことわりしておきますが、私はブログの世界ことは殆ど知りませんので、 分析方法としての妥当性など評価については語れる素養が私にはありませんのでお知り置きを。 > これをB1~B500までをやりたかったのえですが、同じひとつのWEBブラウザのタブでできるかと思っていたのですが、回答を拝見すると、タブを別々に開く必要があるのでしょうか・・・ 必要はないです。何をなさりたいか、推察がずれていただけのことです。 また、500件という量的な具体性を知れば、No.2の回答は無理がある事が解りますので、忘れてください。 ただ、適当な数の複数タブを同時並行(それぞれ終ったら即次の検索)的に操作した方が、 全体の処理が早く終る、という理由で、1タブ単独で500件 というのは、個人的にはやらない(クラスモジュールで処理する派)です。 "ひとつのWEBブラウザ"の方が数段簡単なコードで済みますし、 そこまで時間(実行速度)的な制約はないようですから、 今回は"ひとつのWEBブラウザ"でお応えします。 > 表示された検索結果画面でさらに<blog>という文字列を探すために<Ctrl+F>を実行します。 この部分が、"<Ctrl+F>"の後、どうやって数えるのか ちょっと現実味がなくてあまりよく判らないのですが、 WEBブラウザの検索機能を使って、 検索結果以外の部分を含めて、一致した件数表示の数字を拾うのか、 目視で数を数える、 といったことなのでしょうか? それとも、全自動のマクロ、ではなくて、 検索結果ページ表示中に、目視で確認したり、手作業による処理を加えたりしたい という雰囲気にも見えなくはないのですが、、、対話型の高度なマクロをお望みとか? こちらから提示するのは、自動的に、 ページ中の検索結果の部分だけを対象にして、 更に、(Yahooの場合、結果の上下に表示される)商用(広告)の検索結果を除き、 ドメイン名にblogが入っているものをカウントします。 ーーーーー 動作確認した検索文字列サンプル(B列) 母の日 2016 いつ 母の日 2016 ギフト バスタ新宿 新社会人 オリエンテーション ハナモモ 望月三起也 雨のち 老木 春休み中 木落 肌トラブル 新社会人 オリエンテーション 春休み中 ハナモモ ーーーーー 下記、標準モジュール(Module1)にコピペして使います。 実行するのは、Rep9153740_2a です。 ' ' ーーーーー標準モジュール(Module1) ' ' ★ B列すべての検索文列をInternetExplorerでYahoo検索して ' ' Topページ内の検索結果からドメイン名に"blog"が含まれた数を数えて、 ' ' 閾値以上であれば、左隣のセルに"●"を出力する Sub Rep9153740_2a() ' ' →とりあえず閾値(ドメイン名にblogが入っていた数:閾値以上)を2にしています。 SearchY Target:=Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row), 閾:=2 ' ' 閾値3のままで良ければ以下のように。 ' SearchY Target:=Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row) End Sub ' ' /// 指定されたセル範囲すべての検索文列をInternetExplorerでYahoo検索して ' ' Topページ内の検索結果からドメイン名に"blog"が含まれた数を数えて、 ' ' 閾値以上であれば、左隣のセルに"●"を出力する Private Sub SearchY(Target As Range, Optional ByVal 閾 As Long = 3) Const URL1 = "http://search.yahoo.co.jp/search?ei=UTF-8&fr=slv1-tospcc5&p=" Dim oIE As Object ' As SHDocVw.InternetExplorer Dim colW As Object ' As MSHTML.IHTMLElementCollection Dim oDiv As Object ' As MSHTML.HTMLDivElement Dim colTagA As Object ' As MSHTML.IHTMLElementCollection Dim c As Range Dim sURL As String Dim cntMtc As Long ' ' →IE生成 Set oIE = CreateObject("InternetExplorer.Application") ' ' →IE表示 oIE.Visible = True ' ' この1つ1つのキーワードをWEBブラウザ(InternetExplorer)で検索をかけます。 ' ' →引数Targetで渡されたセル範囲を総当たりループする。 For Each c In Target cntMtc = 0 ' ' →検索文として、各セルの表示文字列を取得。トリミング。 sURL = Trim$(c.Text) ' ' →検索文が空文字でなければ。 If sURL <> "" Then ' ' →検索文を%エンコーディングし、Yahoo検索用のURLを合成。 sURL = URL1 & Encode2UTF8(sURL) ' ' →IEでURLをナビゲート oIE.Navigate2 sURL ' ' →IEの表示完了を待機 Do While oIE.Busy Or oIE.ReadyState < 4 DoEvents Loop ' ' →IE.Document中<div class="w">要素を抽出する。 Set colW = oIE.Document.body.getElementsByClassName("w") ' ' →<div class="w">で抽出された各要素を総当たりループ。 For Each oDiv In colW ' ' →商用(広告)の検索結果を除きます。商用以外の検索結果に絞る。 If oDiv.ParentNode.ID <> "" Then ' ' →<a>タグ要素を取得。 Set colTagA = oDiv.getElementsByTagName("a") ' ' ドメイン名にblogが入っているものを探します。→カウントする If InStr(colTagA(0).hostname, "blog") Then ' ' →ドメイン名にblogが入っている数の小計 cntMtc = cntMtc + 1 End If End If Next End If ' ' そこで<blog>が3つ以上出てこればB1セルのとなりのA1セルに●をつけます。 ' ' blog2つ以下、もしくは0ならばなにもつけません ' ' →確認用に"●"&[ドメイン名にヒットした数]にしています。不要なら & cntMtc をトル。 If cntMtc >= 2 Then c.Offset(, -1).Value = "●" & cntMtc Next ' ' →IE閉じる oIE.Quit Set colTagA = Nothing: Set colW = Nothing: Set oIE = Nothing End Sub ' ' /// 文字列をURLエンコードして返す(UTF-8)(Office 64bit対応) Function Encode2UTF8(ByVal Source As String) As String Dim oHtmlFile As Object Dim oElement As Object If InStr(Source, "\") Then Source = Replace(Source, "\", "\\") If InStr(Source, "'") Then Source = Replace(Source, "'", "\'") Set oHtmlFile = CreateObject("htmlfile") Set oElement = oHtmlFile.createElement("span") oElement.setAttribute "id", "response" oHtmlFile.appendChild oElement oHtmlFile.parentWindow.execScript _ "document.getElementById('response').innerText " _ & "= encodeURIComponent('" & Source & "');", "JScript" Encode2UTF8 = oElement.innerText Set oElement = Nothing: Set oHtmlFile = Nothing End Function ' ' ーーーーー
- imogasi
- ベストアンサー率27% (4737/17069)
質問の内容がうまく伝わらないのでは。下記の点を補足してはどうでしょう。 エクセルシートと思うが、B1からB?にあるセルのデータは、どういうものですか ・検索語(例 上場会社名) ・URL など考えられるがどちらですか。 検索の場合、多数出るWEBページの選択はどういう風に行えばよいのですか。 目的のWEBページが画面に表示されるところまで行ったとき、何をしたいのですか。 たとえば株式4銘柄(4社)の終値を取ってきて、エクセルに記録したいとか。 もっとも大きいレベルの(最終的)目的を質問に書いておくのも、質問者の目的を読者が推策できて、適切な回答をしやすいのではないですか。 IEのエクセルVBAの本(注)には、指定URLにNavigateしてWEBで出している情報をTAGなどを頼りに取ってきて、その後IEをQuitする例が上がっている。これをB列セルデータの数だけ繰り返してはいけないのですか。 -- エクセルのマクロというよりは「IEのマクロ」とでもいうべき分野で、エクセルからして(オフィス以外の)(たとえMS製でも)他のアプリをいじくるのは、むつかしいことだという認識も必要でしょう。 (注)Googleで「VBA IE」で検索。2本が去年出た。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 > B1をコピー⇒ブラウザの検索窓に貼り付け→エクセルに戻る > B2をコピー⇒ブラウザの検索窓に貼り付け→エクセルに戻る > B3を・・・という作業を自動化したいです。 一般的な用語としての「Webブラウザ」のことですよね? このルーティンだけでは(検索窓に上書きされて)何も起らないと思うのですが、 「B1にある文字列をWebブラウザで検索、以下、繰り返し」 (個々の検索結果をそれぞれ別のタブに表示する) みたいなことでしょうか? 全体として(ご説明の処理のその先に)何をなさりたいか、 その目的に沿って特化した方法はまた別にある、という気もしますが、、、。 こちらの解釈に副って端的に(「簡単にすること」を主眼に)お応えするならば、 %エンコーディング用の関数をひとつ用意さえしておけば、 ひとつひとつのセルを選択し直したり、コピーしたり、検索窓に貼り付けたり しなくても、直接Web検索できるようにはなります。 何れにしても、全体として何をどう処理するか、によって、 設計面での改善が見込める事例、であるように(今の処)見えます。 (お求めに対するこちらの理解が至っていないようでしたら、 わかるように補足を頂けると助かります。) 手軽さを理由に、workbook.FollowHyperlink メソッドを使いますが、 お使いの"ブラウザ"の種類や"ブラウザ"とExcelとの関連付けによって 検索ページに正しく遷移できない設定である場合には、 部分的に他の方法を用いることになりますので別途相談を。 こちらでは、InternetExplorer11 を既定のブラウザに設定した状態でテストしています。 "ブラウザの検索窓に貼り付け"た時の検索先についても、 個々にカスタマイズするものですから、 google、yahoo、bing、とりあえず3種(三者択一)の中から選んでください。 尚、下記EncodeUTF8()は、UDF(ユーザー定義関数)としてExcel数式にも使えますので、 C1: =HYPERLINK("https://www.google.co.jp/search?q="&EncodeUTF8(B1),B1) みたいに、HYPERLINK()関数等と組み合わせてシート上でリンクを張ることも可能です。 下記、標準モジュール(Module1)にコピペして使います。 実行するのは、 Rep9153740a Rep9153740b の何れかです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' ★ B列すべての文字列をブラウザで検索 Sub Rep9153740a() SearchWeb Target:=Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row) End Sub ' ' ★ 選択中セル範囲すべての文字列をブラウザで検索 Sub Rep9153740b() SearchWeb Target:=Selection End Sub ' ' /// 指定されたセル範囲すべての文字列を (エンコードして)(指定のサイトで) ブラウザで検索 Private Sub SearchWeb(Target As Range) Dim c As Range Dim sURL As String For Each c In Target sURL = Trim$(c.Text) If sURL <> "" Then sURL = EncodeUTF8(sURL) sURL = "https://www.google.co.jp/search?q=" & sURL ' (1/3択)google ' sURL = "http://search.yahoo.co.jp/search?ei=UTF-8&fr=slv1-tospcc5&p=" & sURL ' (2/3択)yahoo ' sURL = "http://www.bing.com/search?src=IE-SearchBox&FORM=IESR02&q=" & sURL ' (3/3択)bing ThisWorkbook.FollowHyperlink sURL End If Next End Sub ' ' /// 文字列をURLエンコードして返す(UTF-8)(Office 64bit対応) Function EncodeUTF8(ByVal Source As String) As String Dim oHtmlFile As Object Dim oElement As Object Source = Replace(Source, "\", "\\") Source = Replace(Source, "'", "\'") Set oHtmlFile = CreateObject("htmlfile") Set oElement = oHtmlFile.createElement("span") oElement.setAttribute "id", "response" oHtmlFile.appendChild oElement oHtmlFile.parentWindow.execScript _ "document.getElementById('response').innerText " _ & "= encodeURIComponent('" & Source & "');", "JScript" EncodeUTF8 = oElement.innerText Set oElement = Nothing: Set oHtmlFile = Nothing End Function ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
お礼
ありがとうございます。取り急ぎのお礼となります。後程捕捉を投稿させていただきます。
補足
〉全体として(ご説明の処理のその先に)何をなさりたいか 検索需要があって、かつ検索結果で上位表示(たとえばYAHOO検索結果でトップページ入りしている)サイトやブログなどのなかでライバルの弱いキーワードを探したいのです。 検索需要のあるキーワードが、エクセルの表に入力されているB1~B500の表です。 1つのセルに1つの複合キーワード(例:母の日 2016 いつ )が入力されています ライバルが弱いというのは、ど判断するかというと、ドメイン名にblogが入っているものを探します。ドメイン名にblogが入っているのは無料ブログである可能性があるからです。 もちろんドメイン名だけでなく他のところ (たとえばタイトル)などからひっぱってくることもあろうかとおもいますが、とりあえずblogの3つ以上の生むを確認できれば、あとは黙視で確認しようかと思っています。 ちょっとややこしいのですが、エクセルの表(B列)には、キーワードプランナーというツールからCSV出力されたキーワードが入力されています。 例として、B1に<母の日 2016いつ> B2に<母の日 2016 ギフト>~といったところです。 この1つ1つのキーワードをWEBブラウザで検索をかけます。たとえばB1に入力されているキーワード(文字列)をWEBブラウザにいれて検索をかけ、表示された検索結果画面でさらに<blog>という文字列を探すために<Ctrl+F>を実行します。 そこで<blog>が3つ以上出てこればB1セルのとなりのA1セルに●をつけます。blog2つ以下、もしくは0ならばなにもつけません これをB1~B500までをやりたかったのえですが、同じひとつのWEBブラウザのタブでできるかと思っていたのですが、回答を拝見すると、タブを別々に開く必要があるのでしょうか・・・
お礼
お礼が遅くなっていしまい申し訳ありませんでした。 何度も、本当にありがとうございます! しかもコード文だけでなく、その意味まで。 本当にありがとうございました。