ホームページ上の複数のCSVファイルを、エクセルに自動取り込みする方法

このQ&Aのポイント
  • ホームページ上のCSVファイルをエクセルに自動取り込む方法について教えてください。
  • マクロを使用して、1回の起動で複数のダウンロードファイルを同じブック内の別々のシートに貼り付ける方法を教えてください。
  • サンプルのマクロでは、IBMの株価をダウンロードして終了しますが、DELLやAAPLの株価も同じブック内の別のシートにデータを貼り付ける方法を知りたいです。
回答を見る
  • ベストアンサー

ホームページ上の複数のCSVファイルを、エクセルに自動取り込みする方法

ホームページ上のCSVファイルをダウンロードし、そのデータをエクセルに貼り付けるマクロで、1回のマクロ起動で、複数のダウンロードファイルを同ブック内で別々のシートに貼り付けていくにはどのようにすればよいのでしょうか? 以下のマクロを教えて頂き、個々のデータを取る事は分かったのですが、新たに、複数の銘柄を一回のマクロで処理する方法を考えております。 以下のマクロであれば、IBMの株価をダウンロードして終了となるところを、DELLの株価、AAPLの株価と一回のマクロで同ブック内で別のシートにデータを貼り付けをしていきたいと思っています。 Sub sample1() Dim url As String Dim sDate As String Dim eDate As String Dim Symbol As String Dim i As Integer sDate = "1000/1/1" '開始日 eDate = "2010/12/31" '終了日 Symbol = "IBM" '銘柄 url = "​http://ichart.finance.yahoo.com/table.csv?g=d&ignore=.csv"​ url = url & "&s=" & Symbol url = url & "&a=" & Month(sDate) - 1 & "&b=" & Day(sDate) & "&c=" & Year(sDate) url = url & "&d=" & Month(eDate) - 1 & "&e=" & Day(eDate) & "&f=" & Year(eDate) 'データ読み込み With ActiveSheet .Cells.Delete For i = 1 To .QueryTables.Count .QueryTables(1).Delete Next With .QueryTables.Add(Connection:="TEXT;" & url, Destination:=.Range("A1")) .TextFileCommaDelimiter = True .Refresh End With End With End Sub

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

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.1

例えばSheet1のA列に銘柄がある場合(A1=IBM,A2=DELL,A3=AAPL...など)、こんなのでは? Sub sample1() Dim ss As Worksheet Dim ds As Worksheet Dim url As String Dim sDate As String Dim eDate As String Dim Symbol As String Dim r As Long Set ss = Sheets("Sheet1") 'またはActiveSheetなど銘柄があるシート sDate = "1000/1/1" '開始日 eDate = "2010/12/31" '終了日 r = 1 Do While ss.Range("A" & r) <> "" Symbol = ss.Range("A" & r) '銘柄 url = "http://ichart.finance.yahoo.com/table.csv?g=d&ignore=.csv" url = url & "&s=" & Symbol url = url & "&a=" & Month(sDate) - 1 & "&b=" & Day(sDate) & "&c=" & Year(sDate) url = url & "&d=" & Month(eDate) - 1 & "&e=" & Day(eDate) & "&f=" & Year(eDate) '同名のシートの削除(手抜き版) Application.DisplayAlerts = False On Error Resume Next Sheets(Symbol).Delete On Error GoTo 0 Application.DisplayAlerts = True 'シートの追加とデータ読み込み Set ds = Worksheets.Add(after:=Worksheets(Worksheets.Count)) With ds .Name = Symbol With .QueryTables.Add(Connection:="TEXT;" & url, Destination:=.Range("A1")) .TextFileCommaDelimiter = True .Refresh End With End With r = r + 1 Loop End Sub p.s. 本当はいちいちSheet作ってquerytables.addしなくても.refreshだけでもいいかと思います。

77morimori
質問者

お礼

hotosysさん、毎回ありがとうございます。 マクロの動き、バッチリです! とても助かりますm(__)m

関連するQ&A

  • ExcelシートをCSVファイルにする

    Excel2000を使用してます。 Excelブックに3つのシートがあります。 シート1はメインシートとして「ボタン1」「ボタン2」が存在してます シート2はインプットデータ用シート シート3はアウトプットデータ用シートです シート1の「ボタン1」を押すとVBAが実行されシート2の情報を読み、 シート3に算出結果を出力する仕組みです。 次にシート1の「ボタン2」を押すとシート3の内容をCSVに出力したいのですが、 下記のロッジクではうまくいきません。 どこを修正すればよいのでしょうか? Sub CSV出力() Dim ONAME As String Dim しーと As Worksheet Dim 新しーと As Worksheet Dim PAS As String 'OUTパス名 PAS = ThisWorkbook.Path ONAME = PAS & "\" & "出力.CSV" '出力しーと Sheets("出力").Select Set しーと = ActiveSheet Set 新しーと = Worksheets.Add With 新しーと しーと.Copy .Move End With With ActiveWorkbook .SaveAs Filename:=ONAME, FileFormat:=xlCSV .Close False End With End Sub

  • 複数のCSVファイルを自動でエクセルに変換したい

    フォルダの中に、300近いCSVフォルダがあります。 ネットで探したマクロVBAでやってみたところ、一つのCSVファイルを選び、それをエクセルファイルに変換できました。 このマクロを使って、フォルダ内にあるすべてのCSVファイルを一気にエクセルに変換するには、どうしたらいいのでしょうか。 ご教授のほど、よろしくお願いいたします。 Sub CSVからXLSX() Dim varFileName As Variant varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") If varFileName = False Then Exit Sub End If Workbooks.Open Filename:=varFileName ActiveSheet.Cells.Copy ThisWorkbook.ActiveSheet.Cells ActiveWorkbook.Close SaveChanges:=False End Sub

  • VBA 日付型を8桁数値へ変換

    VBAの中で、Date型の日付をバッチファイルに渡す時に、8桁数値へ変換したいのですが、0埋めのやり方が分からずに困っております。 Date型 yyyy/mm/dd 8桁数値 yyyymmdd Private Sub cmdBSubmit_Click() Dim rc As Integer Dim sDate As Date Dim eDate As Date '開始日・終了日処理 sDate = DateAdd("d", -5, txtsDate) eDate = DateAdd("d", 5, txteDate) Debug.Print "----------------------" Debug.Print "開始日-5:" & sDate Debug.Print "終了日+5:" & eDate 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) Debug.Print "----------------------" Debug.Print "開始日:" & sDateP Debug.Print "終了日:" & eDateP rc = MsgBox("開始日 : " & sDate & vbCrLf & _ "終了日 : " & eDate & vbCrLf & _ "抽出を開始します宜しいですか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then '集計バッチを実行 'MsgBox "実行" Call 抽出 Else '中止 MsgBox "中止" End If End Sub 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) この書き方だと、月・日が一桁の場合、例えば「2013/01/01」だと、”201311”になってしまいます。 これを、"20130101"にしたいのですが、どう書けば宜しいでしょか? 最初から、8桁日付で入力すればよいのでしょうか、入力した日付の前後5日を自動的に増やす必要がある為に上記の仕様にしてます。

  • CSV取り込み&集計

    '***************************************************************** ' GLOBAL変数の定義 '***************************************************************** Dim CurrentDir As String '現在のディレクトリ Dim ThisBook As String '現在のブック名 Dim WorkSheetName1 As String Dim WorkSheetName2 As String Dim ConfigSheetName As String Dim ListSheetName1 As String Dim ListSheetName2 As String Dim ListSheetName3 As String Dim ListSheetName4 As String Dim ListSheetName5 As String Dim ListSheetName6 As String Dim ListSheetName7 As String Dim ErrorFlag As Integer 'エラーフラグ 0:正常 1:エラー Sub 初期設定() CurrentDir = ActiveWorkbook.Path '現在のディレクトリ ThisBook = ActiveWorkbook.Name '現在のブック名 WorkSheetName1 = "work1" WorkSheetName2 = "work2" ConfigSheetName = "設定" ListSheetName1 = "****" ListSheetName2 = "****" ListSheetName3 = "****" ListSheetName4 = "****" ListSheetName5 = "****" ListSheetName6 = "****" ListSheetName7 = "****" Application.DisplayAlerts = False 'EXCELの警告を無視する End Sub Sub CSV取り込み() Dim LoadBook As String '読み込みブック名 Dim DataMaxCol As Integer '読み込みデータ有効最大カラム数 Dim WorkStartRow As Integer 'workシート開始行 Dim WorkEndRow As Integer 'workシート終了行 Dim ListMaxCol As Integer '一覧シート有効最大カラム数 Dim ListStartRow As Integer '一覧シート開始行 '初期設定コール Call 初期設定 'workシートをクリア DataMaxCol = Sheets(ConfigSheetName).Range("F2").Value WorkStartRow = Sheets(ConfigSheetName).Range("F3").Value WorkEndRow = Sheets(ConfigSheetName).Range("F4").Value Sheets(WorkSheetName1).Select Range(Cells(WorkStartRow, 1), Cells(WorkEndRow, DataMaxCol)).ClearContents '受注データファイルを選択しオープン SelectedPath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv") If SelectedPath <> "False" Then Workbooks.Open Filename:=(SelectedPath) Else 'キャンセル時は終了 Exit Sub End If LoadBook = ActiveWorkbook.Name '現在のブック名 '受注データの開始行をチェック I = WorkStartRow '受注データの最終行をチェック Do Until ActiveCell.Value = Null I = I + 1 Cells(I, 1).Select Loop WorkEndRow = I - 1 '受注データをコピー Range(Cells(WorkStartRow, 1), Cells(WorkEndRow, DataMaxCol)).Select Selection.Copy 'workシートへペースト Windows(ThisBook).Activate Sheets(WorkSheetName1).Select Range("A1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False '受注データファイルをクローズ Windows(LoadBook).Close End Sub Sub 売上() ' Call CSV取り込み Range("K3:K19").Select Selection.Copy Sheets("売上").Select Range("K3:K19").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 上記のようなプログラムを書いているのですが何度もはじかれてしまいます。何が原因なのかいまいちよくわからないのですがVBAに詳しい方助けてもらえませんでしょうか?

  • VB2010でCSV取込

    VB2010とAccessを使用しています。 あるCSVファイルからACCESSへデータ取り込みをしようとして CSVをデータテーブルに代入するコードを考えているのですが 下記のコードでは『FROM句』のエラーのようでうまく作動しません? ご教授お願いします。 Private Sub ToolMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolMenu.Click Dim OFD As New OpenFileDialog OFD.FileName = "" OFD.InitialDirectory = "\\10.20.100.35\data\LOG\" OFD.Filter = "CSVファイル(*.csv)|*.csv|すべてファイル(*.*)|*.*" OFD.FilterIndex = 1 OFD.Title = "取り込むCSVファイルを選択してください" OFD.RestoreDirectory = True OFD.CheckFileExists = True OFD.CheckPathExists = True If OFD.ShowDialog() = DialogResult.OK Then Try Dim DT As New DataTable '===============CSVからクエリ=============== Using OleCn As New System.Data.OleDb.OleDbConnection Dim CSVFileName As String = System.IO.Path.Combine(OFD.InitialDirectory, "aaa.csv") OleCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & OFD.InitialDirectory & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Dim SQL As String = "" SQL = "SELECT * FROM " + CSVFileName Using DA As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter(SQL, OleCn) DT.Clear() DA.Fill(DT) End Using End Using Catch ex As Exception MessageBox.Show(ex.ToString, "例外発生") Exit Sub End Try End If End Sub

  • エクセル2003 CSVファイルの取り込み速度向上について

    CSVファイルを取り込んで、必要なデーターを処理しているのですが、 CSVのファイルのデーター取り込み速度を上げるのを、皆様のご意見 を参考にさせていただきたいと思います。 VBAの構成は以下の構成でつくりました (1)ファイルの選択 ↓ (2)CSVファイルの中身の確認 ↓ (3)CSVファイルの取り込み、エクセルのセルに展開 と言う構成になっております。 で、(3)の所が結構時間を要するのですが、処理が早くなるコードの 書き方とかありましたら、参考にさせていただきたいなぁ~と 思っております。自分的に思っているのは(2)の所は時間をそれほど 要しないので、取り込みよりエクセルのセル展開の処理の方で時間 をくっているように感じるので、その辺を上手くできないのかな? とか思ったりしてます。まだ、VBAを勉強し始めて半年足らずなので 皆さんの意見などを参考にさせていただけましたと思っております。 宜しくお願いいたします。 実際のコードは以下に記します。 __________________________________ Option Explicit Option Base 1 Dim myTxtFile As String Dim myBuf(45) As String Dim i As Integer, j As Integer Dim mytext As String, mymsg As String Dim myselect As Integer Dim FirstDay As String, EndDay As String Dim n As String _______________________________ Private Sub ReadTxt() Application.ScreenUpdating = False n = 1 Open myTxtFile For Input As #1 Do Until EOF(1) Input #1, myBuf(1), myBuf(2), myBuf(3), myBuf(4), _ myBuf(5), myBuf(6), myBuf(7), myBuf(8), myBuf(9), _ myBuf(10), myBuf(11), myBuf(12), myBuf(13), myBuf(14), _ myBuf(15), myBuf(16), myBuf(17), myBuf(18), myBuf(19), _ myBuf(20), myBuf(21), myBuf(22), myBuf(23), myBuf(24), _ myBuf(25), myBuf(26), myBuf(27), myBuf(28), myBuf(29), _ myBuf(30), myBuf(31), myBuf(32), myBuf(33), myBuf(34), _ myBuf(35), myBuf(36), myBuf(37), myBuf(38), myBuf(39), _ myBuf(40), myBuf(41), myBuf(42), myBuf(43), myBuf(44), myBuf(45) If n = 2 Then FirstDay = myBuf(1) End If n = n + 1 EndDay = myBuf(1) Loop EndDay = myBuf(1) mymsg = FirstDay & "~" & EndDay myselect = MsgBox(mymsg, vbYesNo + vbInformation) If myselect = vbNo Then Close #1 Exit Sub End If Close #1 Open myTxtFile For Input As #1 Do Until EOF(1) Input #1, myBuf(1), myBuf(2), myBuf(3), myBuf(4), _ myBuf(5), myBuf(6), myBuf(7), myBuf(8), myBuf(9), _ myBuf(10), myBuf(11), myBuf(12), myBuf(13), myBuf(14), _ myBuf(15), myBuf(16), myBuf(17), myBuf(18), myBuf(19), _ myBuf(20), myBuf(21), myBuf(22), myBuf(23), myBuf(24), _ myBuf(25), myBuf(26), myBuf(27), myBuf(28), myBuf(29), _ myBuf(30), myBuf(31), myBuf(32), myBuf(33), myBuf(34), _ myBuf(35), myBuf(36), myBuf(37), myBuf(38), myBuf(39), _ myBuf(40), myBuf(41), myBuf(42), myBuf(43), myBuf(44), myBuf(45) 'データをセルに展開する i = i + 1 For j = 1 To 45 Cells(i, j) = myBuf(j) Next j Loop Close #1 Application.ScreenUpdating = True End Sub _________________________________ Sub myOpenDialog() myTxtFile = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv") Call ReadTxt End Sub

  • EXCEL→CSV形式で別ファイルに保存

    EXCELデータ内のある1つのシートのデータをそのまま別ファイル(CSV)に保存したいのですがうまくいかないので教えてください。 本を見ながらこのようなマクロを作ったところ、EXCEL(○○.xls)の指定したシート(keihi)のみをCSV形式で別フォルダ(C:\経費振替)に保存することができたんですが、 元のEXCELも、ファイル名称・形式がCSV(○○.xls→keihi.csv)に変わってしまいます。 エクセルのファイル名、形式は変えずにできる方法ってありますか?? Sub データはきだし() Dim Ret As String Dim Res As Integer Dim FolderName As String Set WK1 = Worksheets("1 依頼書") Set WK4 = Worksheets("keihi") FolderName = "C:\経費振替" Ret = Dir(FolderName, 16) If Ret = "" Then Res = MsgBox("DATA保管用フォルダを作成します。", vbYesNo) If Res = vbYes Then MkDir FolderName End If End If ' Dim Res2 As Integer Res2 = MsgBox("DATAを作成します。", vbYesNo) WK4.Select If Res2 = vbYes Then With WK4 .SaveAs Filename:=FolderName & "\keihi", FileFormat:=xlCSV ←多分ココが何か間違ってるのだと思うんですが。 End With

  • 【VBA】ExcelマクロでCSVファイルに保存したデータが""で囲まれてしまう

    添付図のような、Excel2003で作成した表内のデータを CSVで保存するマクロを作成したのですが、 図のように、CSVファイルに「""」で値が囲まれた状態で、 保存されてしまいます。 下記にマクロを記載しますので、 どうすれば文字列が「""」で囲まれずに、 カンマ区切りだけのデータで出力されるのか、 ご存知の方おられましたら、ご教示お願い致します。 Sub csv保存() Dim フォルダ名 As String Dim パス名 As String Dim ファイル名 As String Dim データ As Variant Dim 行数 As Long, 列数 As Integer Dim i As Integer, j As Long, k As Long ファイル名 = "test.csv" フォルダ名 = "csv" パス名 = ActiveWorkbook.Path & "\" & _ フォルダ名 'csvフォルダが存在しなければ作成する If Dir(パス名, vbDirectory) = "" Then MkDir パス名 End If ChDir パス名 Open ファイル名 For Output As #1 For i = 1 To Worksheets.Count Worksheets(i).Activate Worksheets(i).Cells(1, 1).Select ActiveCell.CurrentRegion.Select 行数 = Selection.Rows.Count 列数 = Selection.Columns.Count For j = 1 To 行数 For k = 1 To 列数 - 1 データ = Selection.Cells(j, k) _ .Value Write #1, データ; Next k Write #1, Selection.Cells(j, 列数) _ .Value Next j Next i Close #1 End Sub

  • デスクトップ上のCSVファイルの削除について

    いつもお世話になっております。 VBAでまた難問に詰まってしまいました。ご教授お願い致します。 別のフォルダに保存されているマクロを利用して、とあるデータを作成するのですが 途中でデスクトップ上に一回保存をしたCSVファイルを最後に削除する という動きをさせたいです。 下記のマクロだと、マクロとCSVファイルがデスクトップ上にあれば削除出来るのですが マクロは常にとあるフォルダに保管されており、使用する人間はバラバラです。 ※CSVファイルの他に3種類程データを作成するのですが  マクロを使った人が使っているPCのデスクトップ上に保管する事になっております。  上記の事から、Killステートメントでファイル指定が出来ない状態(不特定のデスクトップ)です。   Sub test() Dim myPath As String Dim i As String myPath = ThisWorkbook.Path & "\" i = "テストデータ.csv" If InStr(i, ".csv") = 0 Then i = i & ".csv" If Dir(myPath & i) <> "" Then Kill myPath & i Else End If End Sub 不特定のデスクトップ上にあるcsvファイルを削除する事は可能でしょうか? 以上、宜しくお願い致します。 環境 WindowsXP Excel2003

  • CSVファイルをMDBに取り込む

    お世話になります。 現在、在庫管理の簡易システムを作成しています。 環境は、下記の通りです。 言語:VB2005 DB:Access2003 AccessのテーブルにCSVの在庫データの取り込みを作成中ですが、下記のエラーが発生します。 「ファイル 'C:\Temp\HAS4PJ\HZaiko20090319160646.mdb' が見つかりませんでした。」 デバッグをすると、CSVのファイル名は確かに「ファイル名.csv」なのですが、 エラーで表示されるファイル名は、「ファイル名.mdb」と表示されます。 因みにソースは下記の通りです。 ------------------------------------ Dim csvNm As String Dim fbd As New FolderBrowserDialog Dim ofd As New OpenFileDialog With ofd .Title = "本社在庫取込" .FileName = "HZaiko*.csv" .FilterIndex = 1 .Filter = "CSVファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*" .Multiselect = False .InitialDirectory = Application.StartupPath & "\CSV\" If .ShowDialog = Windows.Forms.DialogResult.OK Then csvNm = .FileName Dim tfp As New FileIO.TextFieldParser(csvNm, System.Text.Encoding.GetEncoding(932)) MsgBox(csvNm) tfp.Delimiters = New String() {","} Dim Cnn As New OleDb.OleDbConnection(My.Settings.HAS4DBConnectionString) Dim Cmd As OleDb.OleDbCommand = Cnn.CreateCommand() Cnn.Open() Dim sSQL As String = "SELECT * FROM " & csvNm Dim dt As New DataTable Dim Da As New OleDb.OleDbDataAdapter(sSQL, Cnn) Da.Fill(dt) <--ここでエラー発生! 'objDa.SelectCommand = objCmd Da.Update(Me.HaS4DBDataSet1.t_wrkZaiko) End If End With ---------------------------------- 以上、情報をお持ちの方がいらっしゃいましたらよろしくお願いいたします。

専門家に質問してみよう