• ベストアンサー

エクセルマクロ、複数のCSVファイルを読み込んで一つのファイルに繋げる方法

別質問で教えて貰った方法(下記URLの#2)で、複数のCSVファイルを 読み込むマクロはわかったのですが、それらのファイルを一つに まとめる方法がよくわかりません。 新しいシート(or結果保存用のブック)を用意して、ここに順に繋げて いきたいのですが、どうしたら良いのでしょうか。 ちなみに、入力されるCSVファイルのデータの入っている列数は固定 なのですが、行数はファイル毎に異なります。 <大元の質問> http://oshiete1.goo.ne.jp/kotaeru.php3?q=359726

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

こんにちは。 #2さんの回答で解決かもしれませんが、元の質問からの流れで、、、 単純な、開く、コピー、貼付け、閉じるの繰り返し処理です。 Sub Test() Dim Files, FilesCnt As Integer, i As Integer Dim cBook As Workbook, pBook As Workbook    Files = Application.GetOpenFilename _     (FileFilter:="CsVFile(*.csv), *.csv", MultiSelect:=True)  If IsArray(Files) Then    Set pBook = Workbooks.Add(xlWBATWorksheet)    FilesCnt = UBound(Files)    For i = 1 To FilesCnt      Workbooks.Open Files(i)      Set cBook = ActiveWorkbook      cBook.ActiveSheet.UsedRange.Copy      With pBook.ActiveSheet       .Cells(.Range("A65536").End(xlUp).Row, 1). _       PasteSpecial (xlPasteAll)      End With      Application.CutCopyMode = False      cBook.Close    Next i  End If Set cBook = Nothing: Set pBook = Nothing End Sub

Brown2002
質問者

お礼

どうもありがとうございました。 ただ、そのまま実行すると、1行ずつデータが短くなってしまったので、 下記の所を追加しました。      .Cells(.Range("A65536").End(xlUp).Row+1, 1). _                        ↑ こうしたら、うまくいきました。

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

こんにちは。 > ただ、そのまま実行すると、1行ずつデータが短くなってしまったので 確かにそうですね。 End(xlup).Row は最終データになるので、例のままでは最終データを上書きしちゃいますね。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

準備:下のコードのdataFolderにCSVファイルのあるドライブ、フォルダを入力します。    10000件くらいで検証してみました。必要なら、Dt(10000, 5) As String の10000を増やして下さい。    ただし、限界はあります。(65536行を超えられないとか、メモリー具合です) 1.開始年月日を入力 2.終了年月日を入力 ・・・指定したフォルダにある開始年月日.csv~終了年月日.csvのデータをSheet2につなげて書き出します。    データを統合した後、ソート等を行われると思い、期間中のファイルの処理順は考慮していません。    また、コードが長くなるので、入力ミス等に対するエラー処理等も省いています。    読み込むファイルを2次元配列に読み込んで、Sheet2(2行目から)にはきだしているだけです。    複数ファイルの読み込みにどのようなコードが書かれているか分からないので、自分なりに(勝手に)ループさせて読み込んでいます。    ただ、年月日を入力するとこが一番長い? ご参考に。 ここから ↓ Sub CSVfilesRead()   Const Kakucyoshi = ".csv"   Dim dataFolder As String     dataFolder = "D:\・・・\・・・\・・・"     If Right(dataFolder, 1) <> "\" Then dataFolder = dataFolder & "\"   Dim StartYMD As Date '開始年月日(日付)   Dim EndYMD As Date '開始年月日(文字)   Dim strStartYMD As String '終了年月日(日付)   Dim strEndYMD As String '終了年月日(文字)   '日付の入力   StartYMD = InputBox("開始年月日を入力して下さい。(yyyy/mm/dd)")     strStartYMD = Format(StartYMD, "yyyymmdd")   EndYMD = InputBox("終了年月日を入力して下さい。(yyyy/mm/dd)")     strEndYMD = Format(EndYMD, "yyyymmdd")   'ファイルの読み込み   Dim DataFile As String 'データファイル名   Dim fileNo As Integer 'ファイル番号   Dim Dt(10000, 5) As String '読み込み用配列   Dim c As Long 'データカウンタ   DataFile = Dir(dataFolder & "*" & Kakucyoshi)   While DataFile <> ""     If strStartYMD <= Left(DataFile, 8) And Left(DataFile, 8) <= strEndYMD Then       fileNo = FreeFile       Open dataFolder & DataFile For Input As #fileNo       Do Until EOF(fileNo)         Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2), Dt(c, 3), Dt(c, 4)         c = c + 1       Loop       Close     End If     DataFile = Dir   Wend   Application.ScreenUpdating = False   '結果をSheet2に書き出す   With Worksheets("Sheet2")     .Activate     .Cells.Clear     .Range(.Cells(2, 1), .Cells(c + 1, 5)) = Dt   End With   Worksheets("Sheet1").Activate   Application.ScreenUpdating = True End Sub

Brown2002
質問者

お礼

どうもありがとうございます。 やってみたのですが、何故か、  Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2),Dt(c, 3), Dt(c, 4) のところで止まってしまいます。 原因は調査中なのですが、よくわかりません。 もし何かお気づきの点があれば、教えてください。

Brown2002
質問者

補足

どうもありがとうございます。 やってみたのですが、何故か、  Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2),Dt(c, 3), Dt(c, 4) のところで止まってしまいます。 原因は調査中なのですが、よくわかりません。 もし何かお気づきの点があれば、教えてください。

noname#8602
noname#8602
回答No.1

csvは単純なテキストファイルですから、 copy a.csv+b.csv+c.csv d.csv というようなコマンドで一発結合できますし、それさえ面倒ならunix系ツールのcatで cat *.csv >all.csv という処理をすれば、本当の一発結合が可能です。 マクロとは、また違う分野ですがご一考ください。

Brown2002
質問者

お礼

アドバイスどうもありがとうございます。 マクロで処理する前にデーターファイルを結合する訳ですね。 今考えている方法がどうしてもうまくいかないときには参考にさせて 頂きます。 ただ、できればそういう手間をかけずに、マクロを走らせるだけで 全ての処理ができるようにしたいと思ってるんです。 やっぱりそういうのは難しいのでしょうか。。。