dポイントプレゼントキャンペーン実施中!

別質問で教えて貰った方法(下記URLの#2)で、複数のCSVファイルを
読み込むマクロはわかったのですが、それらのファイルを一つに
まとめる方法がよくわかりません。

新しいシート(or結果保存用のブック)を用意して、ここに順に繋げて
いきたいのですが、どうしたら良いのでしょうか。

ちなみに、入力されるCSVファイルのデータの入っている列数は固定
なのですが、行数はファイル毎に異なります。

<大元の質問>
http://oshiete1.goo.ne.jp/kotaeru.php3?q=359726

A 回答 (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
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

ただ、そのまま実行すると、1行ずつデータが短くなってしまったので、
下記の所を追加しました。

     .Cells(.Range("A65536").End(xlUp).Row+1, 1). _
                       ↑
こうしたら、うまくいきました。

お礼日時:2002/09/20 15:38

こんにちは。



> ただ、そのまま実行すると、1行ずつデータが短くなってしまったので

確かにそうですね。
End(xlup).Row は最終データになるので、例のままでは最終データを上書きしちゃいますね。
    • good
    • 0

準備:下のコードの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)
のところで止まってしまいます。
原因は調査中なのですが、よくわかりません。
もし何かお気づきの点があれば、教えてください。

補足日時:2002/09/20 15:35
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/09/19 11:17

csvは単純なテキストファイルですから、



copy a.csv+b.csv+c.csv d.csv

というようなコマンドで一発結合できますし、それさえ面倒ならunix系ツールのcatで

cat *.csv >all.csv

という処理をすれば、本当の一発結合が可能です。

マクロとは、また違う分野ですがご一考ください。
    • good
    • 0
この回答へのお礼

アドバイスどうもありがとうございます。
マクロで処理する前にデーターファイルを結合する訳ですね。

今考えている方法がどうしてもうまくいかないときには参考にさせて
頂きます。

ただ、できればそういう手間をかけずに、マクロを走らせるだけで
全ての処理ができるようにしたいと思ってるんです。
やっぱりそういうのは難しいのでしょうか。。。

お礼日時:2002/09/18 16:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!