Excel VBAでのwebクエリ取得データの表示方法

このQ&Aのポイント
  • Excel VBAを使用してwebクエリで複数のURLからデータを取得し、横に表示する方法について解説します。
  • VBA初心者でもわかりやすく、ループ処理を使用してデータを取得する方法を紹介します。
  • ユーザーが指定したURLのデータを自動的に取得して表示するためのサンプルコードも提供します。
回答を見る
  • ベストアンサー

Excel VBAでのwebクエリ取得データの表示

Excel VBAを使用してwebクエリでSheet1のB2セル~B3、B4、B5・・・と複数のURLからデータをループで取得し、Sheet2のA1セル~A2、A3、A4にて表示しています。 取得データの内容が3行だと仮定(あくまで仮定です)すると、通常であれば以下※1のように表示されると思います。 ※1 ━━【A】━━━━ 【1】B2セルURLの取得内容 【2】B2セルURLの取得内容 【3】B2セルURLの取得内容 【4】B3セルURLの取得内容 【5】B3セルURLの取得内容 【6】B3セルURLの取得内容 【7】B4セルURLの取得内容 【8】B4セルURLの取得内容 【9】B4セルURLの取得内容 ・      ・ ・      ・ ・      ・ ━━━━━ これを以下※2のように、取得したデータを横に表示することはできないでしょうか? ※2 ━━【A】━━━━━━━━【B】━━━━━━━━【C】━━━━ 【1】B2セルURLの取得内容 B2セルURLの取得内容 B2セルURLの取得内容 【2】B3セルURLの取得内容 B3セルURLの取得内容 B3セルURLの取得内容 【3】B4セルURLの取得内容 B4セルURLの取得内容 B4セルURLの取得内容 【4】B5セルURLの取得内容 B5セルURLの取得内容 B5セルURLの取得内容 【5】B6セルURLの取得内容 B6セルURLの取得内容 B6セルURLの取得内容 ・      ・          ・          ・ ・      ・          ・          ・ ・      ・          ・          ・ ━━━━━ 参考までに以下VBAを使用して、webクエリをループでデータ取得しています。 ━━━━━ 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       .WebTables = "2"       .Refresh BackgroundQuery:=False     End With     Cells(ActiveCell.Row + QueryTables(1).ResultRange.Rows.Count, 1).Select   Next End Sub ━━━━━ 当方VBA初心者ですので、できるだけわかりやすくご教授頂けると助かります。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

NO2のjcctairaです。 > ただ、取得データの1行目しか表示されません。 とのことですが、エラーになるので下記のように修正してテストしています。 URLの内容により違うのかも知れませんが、私のテストではうまくいっているようですが? Sub webクエリ()   Dim myQT As QueryTable   Dim i As Long   Dim myURL As String   Cells.Delete   For Each myQT In ActiveSheet.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 ActiveSheet.QueryTables _         .Add(Connection:="URL;" & myURL, Destination:=Selection)       .BackgroundQuery = False       .AdjustColumnWidth = False       .WebSelectionType = xlEntirePage       .WebFormatting = xlWebFormattingNone ''     .WebTables = "2" ' エラーになるのでコメントアウト       .Refresh     End With     Cells(ActiveCell.Row, "B") = Cells(ActiveCell.Row + 1, "A")     Cells(ActiveCell.Row, "C") = Cells(ActiveCell.Row + 2, "A")     Cells(ActiveCell.Row + 1, "A").Select     Range(ActiveCell.Row & ":" & Rows.Count).Delete   Next End Sub

colorbox0831
質問者

お礼

ありがとうございました!

その他の回答 (2)

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.2

End With以降を修正してください。 【説明】 ・取得した3行(縦)を横にコピーします。 ・次のデータを取得するために1行ActiveCellを下に ・ActiveCell以降をクリアー            :      End With      Cells(ActiveCell.Row, "B") = Cells(ActiveCell.Row + 1, "A")      Cells(ActiveCell.Row, "C") = Cells(ActiveCell.Row + 2, "A")      Cells(ActiveCell.Row + 1, "A").Select      Range(ActiveCell.Row & ":" & Rows.Count).Delete    Next

colorbox0831
質問者

補足

ありがとうございます。 ただ、取得データの1行目しか表示されません。

  • tossy2011
  • ベストアンサー率17% (3/17)
回答No.1

すみません。 調べてみましたがwebクエリでテーブルから取得したデータの操作方法が分かりませんでした。 ただ Cells(ActiveCell.Row + QueryTables(1).ResultRange.Rows.Count, 1).Select を Cells(ActiveCell.Row , 1+ QueryTables(1).ResultRange.Columns.Count).Select とすれば3行分のデータを縦に書き込んだら 右にデータの項目数分スライドして次のデータを書き込むはずですので、 全てのデータが書き込まれたら縦と横を入れ替えれば似たようなことはできるのではないかと思います。

関連するQ&A

  • VBA Webクエリについて

    VBA初心者です。 VBAを使い、下記「やりたいこと」をしたいのですが、 「質問内容」にありますように、上手くできません…。 基礎がわかっていない為、お粗末な内容かもしれませんが、 教えてください。何卒よろしくお願い致します。 ■やりたいこと シート「1」にあるURLアドレスのリスト(C列)に沿って WEBクエリを実行し、シート「2」に取得したデータを 連続して末行に入力したいです。 ■質問内容 見よう見真似で、下記VBAを作成しました。(1To3は仮の回数です) WEBクエリが実行され、末行に取得データが入力されますが、 1回目、2回目の取得データは消え(長い空白行ができ)、 ラストの3回目のデータのみが残るかたちになります。 取得したデータが消えず、連続してWEBクエリを実行できるよう 下記を添削して頂けませんでしょうか。 ---------------------------------------------------------------- Sub Macro2() Dim Lrow As Long For カウンタ = 1 To 3 Lrow = Worksheets("2").Range("A" & CStr(Rows.Count)).End(xlUp).Row セル範囲 = "C" & カウンタ With ActiveSheet.QueryTables.Add(Connection:= _ "URL;" & Worksheets("1").Range(セル範囲).Value, Destination:=Worksheets("2").Range("A" & Lrow)) .Name = Worksheets("1").Range(セル範囲).Value .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With Next End Sub

  • またまたエクセルでWEBデータを取り込む

    下のVBAは以前にお世話になった方に教えていただいたWEBからのデータ取得するものです。 日付を入力することで、その日のデータを取り出すことができます。 ところがWEBのURLが変更になってしまいました。 当方、VBAは疎いため適当に部分修正で利用しようとしたもののなかなかうまくできません。 呼び出したデータも以前と若干形式がちがっているためそのへんも直したいところがあるのですが 取りあえずWEBの取り出し方記述を教えていただければありがたいです。 (70, 80, 32, 62, 101,…というのはたぶんジャンル区分なので今回は不要です。) よろしくお願いします。 WEBURL(旧) http://www.m******/****/0062/00620726.html WEBURL(新) http://m*****/*****/2012-04-17/ ●旧WEB取り出しVBA Sub Using_Web_query30A() Dim arrMenu As Variant Dim myDate As String Dim myURL As String Dim Connection_URL As String arrMenu = Array(70, 80, 32, 62, 101, 102, 90, 120, 40, 22, 31) myDate = InputBox("オープンする日付を「月/日」のように入力してください。", _ "日付の入力", Format(Date, "m/d")) myURL = "0062/0062" & Format(Split(myDate, "/")(0) * 1, "00") & _ Format(Split(myDate, "/")(1) * 1, "00") Connection_URL = "http://www.m*********/***/" & myURL & ".html" Columns(1).ClearContents With ActiveSheet.QueryTables.Add(Connection:= _ "URL;" & Connection_URL, Destination:=Range("A1")) .WebFormatting = xlWebFormattingNone .WebTables = "9" .Refresh BackgroundQuery:=False End With

  • Webクエリで困っています

    以下のマクロを作りました。Webクエリで、セルA1に入力してあるURLを読み込んで表を取り込み、必要なところを選択してコピーするようにしたいのです。しかし、実行すると上から3行目まで黄色になってエラーになります。特に3行目には矢印が表示されています。いろいろ調べましたが結局分かりませんでした。宜しくお願いします。 ------------------------------------------------------ Sub クエリで取得() ' ' クエリで取得 Macro ' マクロ記録日 : 2009/7/30 ユーザー名 : charlie ' ' With ActiveSheet.QueryTables.Add(Connection:= _ Range("A1").Value _ , Destination:=Range("A2")) .Name = "resultlist?tbws=x0p01a&hd=20090716&jcd=01_2" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = False .RefreshOnFileOpen = False .BackgroundQuery = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = True .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With Range("A19:Q54").Select Selection.Copy End Sub ----------------------------------------------------------

  • エクセルVBA WEB取得データの横方向への出力

    仮に、sheet1のA1からA100までに、異なるWEBページのURLを入力しているとします。 そして、それぞれのURLからWebTables = "8"のデータを抽出して、 B1セルから順に出力するVBAを、下記のとおり作成しているとします。 このとき、特定のURLのWebTables = "8"のデータ項目は表形式で出力され、 次のURLのデータについては、列を挿入する形でどんどん表が追加されていきますが、 これを表形式ではなく横方向に1列ずつ表示するにはどうすればよいのでしょうか。 ************************************************ sub macro1()  dim h as range  for each h in range("A1:A100")  With ActiveSheet.QueryTables.Add(Connection:="URL;" & h, Destination:=h.offset(0,1))  .WebSelectionType = xlSpecifiedTables  .WebFormatting = xlWebFormattingNone  .WebTables = "8"  .Refresh BackgroundQuery:=False  End With  next end sub ************************************************

  • WEBクエリ

    WEBクエリでヤフーから、時系列で株価を取得するマクロを作っています。 シートAの左に、次々と1銘柄1シートで読み込む場合、下のコードをもっと短くする方法はあるのでしょうか?コードは同じで、銘柄の番号のみ違います。よろしくお願いします。 Sheets("A").Select Sheets.Add ActiveSheet.Name = "2002" With ActiveSheet.QueryTables.Add(Connection:="URL;http://table.yahoo.co.jp/t?s=2002.T&g=d", Destination:=Range("A2")) .Refresh BackgroundQuery:=False End With Range("A1").Select ActiveCell.FormulaR1C1 = "2002" Sheets("A").Select Sheets.Add ActiveSheet.Name = "2202" With ActiveSheet.QueryTables.Add(Connection:="URL;http://table.yahoo.co.jp/t?s=2202.T&g=d", Destination:=Range("A2")) .Refresh BackgroundQuery:=False End With Range("A1").Select ActiveCell.FormulaR1C1 = "2202" Sheets("A").Select Sheets.Add ActiveSheet.Name = "3000" With ActiveSheet.QueryTables.Add(Connection:="URL;http://table.yahoo.co.jp/t?s=3000.T&g=d", Destination:=Range("A2")) .Refresh BackgroundQuery:=False End With Range("A1").Select ActiveCell.FormulaR1C1 = "3000" ・ ・ ・ このような感じで銘柄の番号のみが違うコードが続きます。

  • 連続してWEBクエリを実行

    VBA初心者です。(作業環境Windows7 64bit Excel2010) 現在、WEBクエリを使用し、あるホームページより情報を収集する作業を行っているのですが、 WEBクエリをループさせる技術がない為、作業が難航しております。 具体的に行いたい作業としましては、 A列に商品番号を数種類入れておき、VBAにてURLの後ろにその番号を追加、 つなぎ合わせたURLでホームページにアクセス ⇒ 情報を収集するというものです。 乏しい知識をフル活用し、ループさせずに情報を収集するところまでは作成できたのですが、 どちら様か、ループさせる方法を教えていただける方がおりましたら、ご指導いただけないでしょうか。 ■セルに予め入力する番号例■       A 【1】 131023999 【2】 131022082 【3】 131023869 【4】 131023796 【5】 131044236 ※最終的には、一度に100種類のページにアクセスしたいと考えております。 ■現在作成しているVBAサンプル■ Sub WEBクエリ実行() Dim SIC1 As String Dim SIC2 As String Dim SIC3 As String SIC1 = Range("A1").Text SIC2 = Range("A2").Text SIC3 = Range("A3").Text On Error Resume Next With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.bcn-chubu.jp/search/detailed.php?id=" & SIC1, Destination:=Range("C1")) .FieldNames = True .FillAdjacentFormulas = False .PreserveFormatting = True .BackgroundQuery = True .SaveData = True .AdjustColumnWidth = True .WebTables = "1" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .Refresh BackgroundQuery:=False End With With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.bcn-chubu.jp/search/detailed.php?id=" & SIC2, Destination:=Range("C31")) .FieldNames = True .FillAdjacentFormulas = False .PreserveFormatting = True .BackgroundQuery = True .SaveData = True .AdjustColumnWidth = True .WebTables = "1" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .Refresh BackgroundQuery:=False End With With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.bcn-chubu.jp/search/detailed.php?id=" & SIC3, Destination:=Range("C61")) .FieldNames = True .FillAdjacentFormulas = False .PreserveFormatting = True .BackgroundQuery = True .SaveData = True .AdjustColumnWidth = True .WebTables = "1" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .Refresh BackgroundQuery:=False End With End Sub ちなみに、WEBクエリで収集した情報は、それぞれ指定のセルにアウトプットさせております。 ※30行刻みで情報が書き出されるようになっております。 VBA初心者のため、現在作成しているプログラムが「正しいのか」さえ、判断できていない状況ですが、ご指導いただける方がおりましたら、何卒よろしくお願いいたします。

  • WEBクリエを使って、財務情報を取得

    WEBクリエを使って、ロイターのサイトからを損益計算書、 貸借対照表、キャッシュ・フロー計算書を取得しています 成功するときは3つとも確実に取得出来るのですが、たまに失敗して 3つとも損益計算書だったりする時があります この原因は何なのでしょうか? 解る方、ご教授下さい コードは下記の様な感じで書いてます myURL21 = "URL;http://jp.reuters.com/investing/quotes/financialStatements?symbol=" myURL22 = ".T&statement=is" With ActiveSheet.QueryTables.Add(Connection:= _ myURL21 & Sheets("DL1").Range("A1") & myURL22, Destination _ :=Range("A10")) .Name = "financialStatements?symbol=" & Sheets("DL1").Range("A1") & myURL22 .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = False .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .WebSelectionType = xlAllTables .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .Refresh BackgroundQuery:=False .Delete End With

  • マクロを使ったWEBクエリでデータが正常にできない

    マクロを使ったWEBクエリでデータが正常に取得できない エクセル2013を使用しております。 下記URLを参考に、マクロでWEBクエリで116ページ分の データ取得用マクロを作成してみたのですが、データ取得が出来ません。 マクロを使用したWEBクエリをご存知の方がいらっしゃいましたら 解決方法をアドバイス頂きたいと思います。 -参考元- http://okwave.jp/qa/q8208492.html 取得したいWEBページ http://www.walkerplus.com/spot_list/ar0300/2.html http://www.walkerplus.com/spot_list/ar0300/3.html ... http://www.walkerplus.com/spot_list/ar0300/117.html 取得用シートに記載したURL 2.html 3.html ... 117.html -作成したマクロです- Sub WEBクエリ実行() Dim St As Object Dim I As Integer Set St = ActiveSheet Sheets.Add After:=Sheets(Sheets.Count) For I = 1 To 116 With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.walkerplus.com/spot_list/ar0300/" & Format(St.Cells(I, 1), "@"), Destination:=Range("C" & (I - 1) * 1000 + 1)) .FieldNames = True .FillAdjacentFormulas = False .PreserveFormatting = True .BackgroundQuery = True .SaveData = True .AdjustColumnWidth = True .WebTables = "1" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .Refresh BackgroundQuery:=False End With Next I End Sub -マクロは ここまで- 修正箇所のアドバイス もしくは、 他の方法でも、117ページ全て取得可能なマクロをアドバイス頂けると嬉しいです!

  • WEBクエリを使用して企業情報を取得したい

    VBA初心者です。よろしくお願いいたします。 Excel2007のWEBクエリを使用してyahooファイナンスより複数銘柄の企業情報を取得したい。 ・Sheets("meigara")のセルA列(複数銘柄)から企業コードを取得。 ・WEBクエリを実行させて、取得データを銘柄毎にシートに書き出し 上記を複数銘柄で繰り返し処理したい。 【詳細】 Sheets("meigara").SelectのA列に複数銘柄コードを記載 繰り返し企業コードを取得しSheets("data1")、Sheets("data2")、Sheets("data3")…と WEBクエリの書き出しを銘柄コード毎にシートを作成して繰り返し処理したい 宜しくお願いいたします。 ----------------------------------------------------------------------- Sub iyahoo情報() ' ' yahooファイナンス銘柄情報取得 ' Sheets("data").Select With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://stocks.finance.yahoo.co.jp/stocks/profile/?code=2162.T", _ Destination:=Range("$A$2")) .Refresh BackgroundQuery:=False End With End Sub ※上記の2162に代入したい

  • エクセルVBA WEBからデータ取得 文字化け

    社内の業務管理システムにエクセルVBAでIE経由のアクセスをして表のデータを取得し、エクセルのシートに転記したら文字化けします。原因として何が考えられますか? アドバイスをお願いします。(UTF-8になってしまいます。) ●●●●備考●●●● ◆VBAのコード With ActiveSheet.QueryTables.Add(Connection:="url;http:***略***?no=112", Destination:=Range("a3")) .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "1" .Refresh BackgroundQuery:=False .Delete End With ◆ウェブページはmetaタグでshift-JIS指定してあり、IEでは正しく表示されます。 ◆他のshift-JISのウェブページ(例 http://www.tohoho-web.com/)なら文字化けせずデータ取得できます。

専門家に質問してみよう