- ベストアンサー
エクセルマクロ、複数のCSVファイルを読み込んで一つのファイルに繋げる方法
別質問で教えて貰った方法(下記URLの#2)で、複数のCSVファイルを 読み込むマクロはわかったのですが、それらのファイルを一つに まとめる方法がよくわかりません。 新しいシート(or結果保存用のブック)を用意して、ここに順に繋げて いきたいのですが、どうしたら良いのでしょうか。 ちなみに、入力されるCSVファイルのデータの入っている列数は固定 なのですが、行数はファイル毎に異なります。 <大元の質問> http://oshiete1.goo.ne.jp/kotaeru.php3?q=359726
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 #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
その他の回答 (3)
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 > ただ、そのまま実行すると、1行ずつデータが短くなってしまったので 確かにそうですね。 End(xlup).Row は最終データになるので、例のままでは最終データを上書きしちゃいますね。
- nishi6
- ベストアンサー率67% (869/1280)
準備:下のコードの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
お礼
どうもありがとうございます。 やってみたのですが、何故か、 Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2),Dt(c, 3), Dt(c, 4) のところで止まってしまいます。 原因は調査中なのですが、よくわかりません。 もし何かお気づきの点があれば、教えてください。
補足
どうもありがとうございます。 やってみたのですが、何故か、 Input #fileNo, Dt(c, 0), Dt(c, 1), Dt(c, 2),Dt(c, 3), Dt(c, 4) のところで止まってしまいます。 原因は調査中なのですが、よくわかりません。 もし何かお気づきの点があれば、教えてください。
csvは単純なテキストファイルですから、 copy a.csv+b.csv+c.csv d.csv というようなコマンドで一発結合できますし、それさえ面倒ならunix系ツールのcatで cat *.csv >all.csv という処理をすれば、本当の一発結合が可能です。 マクロとは、また違う分野ですがご一考ください。
お礼
アドバイスどうもありがとうございます。 マクロで処理する前にデーターファイルを結合する訳ですね。 今考えている方法がどうしてもうまくいかないときには参考にさせて 頂きます。 ただ、できればそういう手間をかけずに、マクロを走らせるだけで 全ての処理ができるようにしたいと思ってるんです。 やっぱりそういうのは難しいのでしょうか。。。
お礼
どうもありがとうございました。 ただ、そのまま実行すると、1行ずつデータが短くなってしまったので、 下記の所を追加しました。 .Cells(.Range("A65536").End(xlUp).Row+1, 1). _ ↑ こうしたら、うまくいきました。