- ベストアンサー
VBAでwebクエリをループさせる方法
- Excel VBAを使用して複数のURLのwebページの内容を一括で取得する方法について教えてください。
- Sheet1のB2セルから始まる複数のURLを指定し、コマンドボタンを押すことで、取得した内容をSheet2のA1セルから順に表示する方法についてお教えください。
- VBA初心者ですので、わかりやすく解説していただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>Excel VBAを使用してwebクエリをループさせる方法が知りたいです。 「webクエリ」ですよね? Excel の 標準メニュー [データ(D)] - [外部データの取り込み(D)] - [新しい Web クエリ(W)...] のお話しとして回答を書かせていただきます。 【作業の段取り】 1)先ず、データ を取り込む「Sheet2のA1セル」を アクティブ にします。 2)次に「Sheet1のB2セル~B3、B4、B5・・・」の URL を1つずつ読み込んで、WEb クエリ を実行します。 3)1つの URL の データ を読み込んだ後には、その クエリ デーブル の最終行の次行を アクティブ にします。 【VBA の コード を書く場所について】 「コマンドボタン」を右クリック し、[コードの表示(V)] を クリック すると、 Private Sub CommandButton*_Click() End Sub というような コード が現われます(「*」の部分は数字)ので、その2行の「間」に Sheets("Sheet2").Select Application.Run "Sheet2.webクエリをループ" を コピペ してください。 次に、Sheet2 の シート タブ を 右クリック し、[コードの表示(V)] を クリック すると現われる コード ウィンドウ に下記を コピペ してください。 Sub webクエリをループ() Dim myQT As QueryTable Dim i As Long Dim myURL As String Cells.Delete For Each myQT In QueryTables: myQT.Delete: Next Range("A1").Select For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row myURL = Sheets("Sheet1").Cells(i, "B").Value With QueryTables _ .Add(Connection:="URL;" & myURL, Destination:=Selection) .BackgroundQuery = False .AdjustColumnWidth = False .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .Refresh BackgroundQuery:=False End With Cells(ActiveCell.Row + QueryTables(1).ResultRange.Rows.Count, 1).Select Next End Sub 【コーディング について】 先ず、 .BackgroundQuery = False 以下の、QueryTables の プロパティ につきましては、実情に応じて変更なさってください。 QueryTables の操作は、当該シート を離れると、記述が厄介になりますので、Sheet2 に 実行マクロ を書いて、その マクロ を CommandButton*_Click() で呼び出すようにしました。 【クエリ デーブル の最終行の取得】 ポイント としては、1つの URL の データ を読み込んだ後の最終行の取得ですが、最後に実行された Web クエリ について QueryTables の インデックス が「1」になるようですので、 QueryTables(1).ResultRange.Rows.Count が 当該 クエリ テーブル の行数になります。 従いまして、現在の カーソル 位置(データ の反映位置「Destination」)の行番号に、それを足すと、「クエリ デーブル の最終行の次行」を取得できます。 Cells(ActiveCell.Row + QueryTables(1).ResultRange.Rows.Count, 1).Select 【これは、余談かも知れませんが。。】 Sheet2 の データ を全部削除しても、QueryTables がそのまま残って、ファイル の容量を大きくしたり、他にも問題が残りそうな気がします。 これを回避するためには、 For Each myQT In QueryTables: myQT.Delete: Next を付加しました。
その他の回答 (2)
- layy
- ベストアンサー率23% (292/1222)
参考で。 やり方は違いますが、似たようなことはしています。 1) 画面のハードコピーを(ショートカット押すだけで)取得するフリーソフトを使う。 2) webを参照し、 とあるフォルダに「xxxx01.jpg」「xxxx02.jpg」「xxxx03.jpg」・・・と ハードコピーのファイルがファイル名が規則的にできあがる。 3) エクセルのマクロでこのフォルダの「*.jpg」ファイルを取得して シート1に順番に列挙する。 画像ファイルを作るまでは自分で操作してがんばって、 画像ファイルを一括でエクセルへ、というのはVBAに任せたことあります。
- layy
- ベストアンサー率23% (292/1222)
確認。 シート1のB2を押すとそのリンクが表示される 画面のハードコピーを取得 取得した画面をシート2のA1へ貼り付け シート1のB3を押すとそのリンクが表示される 画面のハードコピーを取得 取得した画面をシート2のA51へ貼り付け シート1のB4を押すとそのリンクが表示される 画面のハードコピーを取得 取得した画面をシート2のA101へ貼り付け (貼り付け画像の高さが50行分、とみた場合) こんなことがしたいということでしょうか。
補足
ありがとうございます。 そういう感じと言えばそういう感じです。 ただ、上記すべてのことをコマンドボタンワンプッシュでできないでしょうか?