• ベストアンサー

複数のcsvファイルを1つのEXCELファイルにマージするVBAを教えてください

csvファイル数は700~1000個程度でひとつのフォルダに格納されています。 このファイルをEXCEL形式で開くと、1行目にフィールド名(A~Z列で固定)、2行目以降にデータが入っています。行数はファイルにより1~100行程度で変動します。 このファイルを1つのエクセルファイルの同一シートに結合(マージ)するVBAがほしいです。 ここで、(できればですが)EXCELにマージするにあたり、1行目のみフィールドの値、2行目以降にそれぞれのcsvの2行目以降データの値を入れていくようにしたいです。つまり、フィールド名の行が何行も出てくるのを避けたいです。 申し訳ございませんが、ご指導いただけたら幸いです。よろしくお願いします。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

しばらく前に書いた事があるコードです。 参考になるようだったら応用してみてください。 '--------------------------------------------------------------------- Private Sub try()   Dim ws As Worksheet   Dim fd As String   Dim fn As String   Dim ret As String   Dim i  As Long   Dim n  As Long   Dim x  As Long   Dim s  As Long      fd = ThisWorkbook.Path & "\"   'fd = FDSELECT 'フォルダ選択の場合   If Len(fd) = 0& Then Exit Sub   Application.ScreenUpdating = False   'ActiveWorkbookにシートを追加して処理   Set ws = Sheets.Add   On Error GoTo errHndler   fn = Dir(fd & "*.csv")   x = 1   s = 1   Do Until Len(fn) = 0&     i = i + 1     'データCountにより次のセット先変更     n = n + x     '外部データ取り込み     x = CSVQRY(ws, fd & fn, ws.Cells(n, 2), s)     If x < 0 Then       Err.Raise Number:=1000, Description:="CSV読み込みに失敗"     ElseIf (n + x) >= Rows.Count Then       '行数overしてもエラーかからないため取り込み直し       ws.Rows(n).Resize(x).Delete       Set ws = Sheets.Add       n = 1       x = CSVQRY(ws, fd & fn, ws.Cells(n, 2), 1&)     End If     'ファイル名をA列にセット     ws.Cells(n, 1).Resize(x).Value = fn     s = 2     fn = Dir()   Loop   If i > 0 Then     ret = i & "files.done"   Else     ret = "no file"   End If errHndler:   If Err.Number <> 0 Then     ret = Err.Number & vbTab & Err.Description     Debug.Print ret   End If   Application.ScreenUpdating = True   MsgBox ret   Set ws = Nothing End Sub '--------------------------------------------------------------------- Private Function CSVQRY(ByRef ws As Worksheet, _             ByRef fs As String, _             ByRef rs As Range, _             ByVal sr As Long) As Long   Dim cnt As Long   On Error GoTo errChk   With ws.QueryTables.Add(Connection:="TEXT;" & fs, _               Destination:=rs)     .AdjustColumnWidth = False     .TextFilePlatform = xlWindows     .TextFileStartRow = sr     .TextFileCommaDelimiter = True     .Refresh False     cnt = .ResultRange.Rows.Count     .Parent.Names(.Name).Delete     .Delete   End With   CSVQRY = cnt   Exit Function errChk:   CSVQRY = -1 End Function '--------------------------------------------------------------------- Private Function FDSELECT() As String 'フォルダ選択Function   Dim obj As Object   Dim ret As String   Set obj = CreateObject("Shell.Application") _        .BrowseForFolder(0, "SelectFolder", 0)   If obj Is Nothing Then Exit Function   On Error Resume Next   ret = obj.self.Path & "\"   If Err.Number <> 0 Then     ret = obj.Items.Item.Path & "\"     Err.Clear   End If   On Error GoTo 0   Set obj = Nothing   FDSELECT = ret End Function

japan116
質問者

お礼

end-uさん ありがとうございます!まさにこんなツールがほしいと思ってました!しかもA列にファイル名が追加されるのは、データの出所がわかるのでさらに便利ですね!早速活用させていただきます! 本当にありがとうございました。 これにて質問を締め切らせていただきます。

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

自動化するならVBAを利用することになるでしょう。 基本的な考え方としては、csvをテキストファイルで1行ずつ読み込み、2行目以降をシートにコピーしてゆくということになるのかな? (もちろん最初のファイルのみ、1行目も処理する) 処理が1行単位なので、カンマの処理さえできれば、あとはなんとかなるでしょう。 ただし、ファイル数1000、データの行数100とすると最大で100,000行くらいになるかも知れないので、1シートには納まらない可能性があります。 記入対象の行を監視して、シートの最大行を超えるなら、新しいシートに記入するなどの制御をしておいたほうがよさそうですね。 以下を組み合わせれば、概ねのところはできるかと。 1)フォルダ内の各ファイルを処理する方法は以下を参照  http://homepage2.nifty.com/kasayan/vba/dir.htm 2)ファイルの読込み(テキストファイル)の基本はこちら  http://officetanaka.net/excel/vba/file/file08.htm 3)csvの読み込みについてはこちら  http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_020.html 各データ(セルに記入するデータ)内にカンマ(,)を含んでいる可能性がある場合は、その処理がちょいと面倒かも。

japan116
質問者

お礼

fujillinさん ありがとうございます!ご紹介いただいたもわかりやすいですね。これを一人で作れるかは不安ですが、参考にさせていただきます! > 基本的な考え方としては、csvをテキストファイルで1行ずつ読み込み、2> 行目以降をシートにコピーしてゆくということになるのかな? > (もちろん最初のファイルのみ、1行目も処理する) おっしゃる通りです。 トータルのデータでEXCELの行数で何とか間に合いそうですが、やはり大きなデータになるので処理速度を考えると、ACCESSなどに一度インポートして、そのデータをEXCELで加工したほうが良さそうですかね。。

関連するQ&A

  • csvファイルとexcelをマージ

    定期的にcsvファイルが手元に届きます。csvファイルをそのまま印刷しても見栄えが悪いので前もって表らしい書式のexcelファイルを作成しており(列行幅の設定・タイトル・罫線等)、それにcsvファイルからカット&ペーストして値だけをコピーしています。 excelマクロを組めば自動で可能だとは思うのですが、結構ファイルの種類も多いので汎用的なツールって無いでしょうか?

  • excel vbaで複数のcsvファイルの読み込み

    100シート分のcsvファイルのデーターを一つずつ読み込んでexcelにコピーして使用してますが莫大な時間がかかって困ってます。 vbaを使用して作業を簡素化出来る事は出来ないでしょうか? ------------------------------------------ ※ csvの概要 excelで1枚のcsvファイルを開くとA列の11行目から65536行まで数値データがあります。 ※ vbaできたらよいなと思う仕様 そこで、複数のcsvファイルを選択して読み込むとCSV_データと言うSeetのA列の10行目から1枚目のcsvファイル、B列の10行目から2枚目のcsvファイルと言う風に選択した分のcsvを列に続けて数値データを貼り付けしてくれるvbaをご教授していただけると大変助かります。 不躾で申し訳ございませんが宜しくお願い致します。 excel2003 ------------------------------------------

  • EXCELファイルをマージするツール

    複数のEXCELファイルがパソコンの同一フォルダーにあります。 すべてのファイルはそれぞれタブは1つで、しかも行数も列数も見出しも全く同じファイルです。ちがうのはそこに入っている文字列データだけです。 同じ行番号&列番号のセルにはいずれかの1ファイルにしかデータは入っていません。 これらをマージして、集計(正確には転記)を完了したファイルを作りたいのですが、 何かツールを使って省力化できないでしょうか。

  • エクセルVBAでCSVを読み込んで別ファイルにまとめたいです。

    エクセルVBA初心者の者です。 マクロの記録でできたコードをいじって、 なんとか動くものができるレベルです。 Aというフォルダに20~40行程度の内容のCSVファイルが 数百個あります。開けてみないと何行あるのかわかりません。 そのAフォルダのCSVの内容をエクセルで開いて、別のエクセルファイルの一枚のシートにまとめたいのです。 最初にCSVファイル名を一枚のシートのA列に書き出すところ まではやれたのですが、それを順番に読み込んでコピペの 流れができません。 CSVファイル名読み込み 読み込んだファイル1つめCSV開く CSVの20~40行をコピー 別のエクセルファイルのシートに貼り付け 1つめCSV閉じる ↓ 読み込んだファイル2つめCSV開く 繰り返し こういうやり方じゃない方がいいのかもわかりません。 もしかして考え方も違うのでしょうか? サンプルコード教えていただけるとありがたいです。 よろしくお願いします。

  • XLS・CSVファイルのマージソフトについて

    XLSやCSV形式のファイルをマージしたいのですがどなたかご存知ありませんか?(無論行・列のフォーマットは同一とします) できればFREEで。ドラッグ&ドロップ程度の操作で出来るのもであればうれしいです。 よろしくお願いいたします

  • エクセルVBAでCSVファイルから取り込みたいのですが・・・

    CSVファイルのデータを取り込むコードを教えていただけないでしょうか。 「共有フォルダ」の中に「作業用.xls」と「090820.csv」があります。csvファイルは日によって名前が変わりますが、必ず一つしか入れないことにしています。 CSVファイルの1行目は見出しです。2行目以降がデータになっています。 A2からI列最終行を「作業用.xls」のsheet1のA6にコピー(取り込み)したいのですが、よろしくお願いします。

  • 複数のCSVファイルを1つのファイルにまとめる方法

    EXCELで、あるフォルダ(例:Dir1)に格納されている複数のCSVファイルを読み込んで、そのファイルの1行目をコピーし、別ファイル(a.csv)にペーストしたいと思っております。 例えば、Dir1には1.csv,2.csv,3.csvの3つのCSVファイルが存在した時に、a.csvに出力されるのは、 ----------------------------------- 1.csvの1行目 2.csvの1行目 3.csvの1行目 ----------------------------------- となるのが、理想の形です。 方法を知っている方がいらっしゃったら お教えいただければと思います。

  • エクセルVBA 一枚のシートにcsvファイルをまとめる 

    教えてください。 以下の処理をしたいのですが、どのようにしたらよいか教えてください。 (1)デスクトップの1つのフォルダに格納しているcsvファイルを全て開く(ファイルがいくつあるかはその時によって違う) (2)開いたcsvファイルのデータがある行を全て選択して、開いてあるデータベースとしてあるシートに貼り付ける。 (これをcsvファイル数分実行する) (3)コピーの終わったcsvファイルを全て閉じる どうしても(2)の処理がわからず、どなたか教えてください。 よろしくお願い致します。

  • VBA 複数のファイルの特定の列だけ取得してマージ

    お世話になっております。 VBAで、複数のCSVファイルの特定の列だけを抽出して別のCSVファイルにマージする方法を探しています。 例えば、マージフォルダに1000のCSVファイルがあります。 1000あるファイルのA列とC列だけを抽出して、 それを別の「マージ.CSV」というファイルにA列とB列にマージして一つにしたいのです。 1000のファイルにはA~Qまで値が入っていて、A~Q列の値全て取り込みマージするとデータが重くなってしまうのです。 Unionメソッドを仕様して列を選択するのかなと思うのですが。。。 現在、こちらのコードを参考にしています。 わかる方いましたらよろしくお願いいたします。 Sub csvmerge() wpath = Range("B3") wfile = Dir(wpath & "\") flag = 0 Do While wfile <> "" If InStr(wfile, ".csv") Then flag = flag + 1 If flag = 1 Then FileCopy wpath & "\" & wfile, ThisWorkbook.Path & "\output.csv" Open ThisWorkbook.Path & "\output.csv" For Output As #1 Close #1 End If Open ThisWorkbook.Path & "\output.csv" For Append As #1 Open wpath & "\" & wfile For Input As #2 Do Until EOF(2) Line Input #2, w_str Print #1, w_str Loop Close #2 Close #1 End If wfile = Dir() Loop MsgBox "マージ完了", vbInformation End Sub

  • 複数CSVファイルをExcel形式1つにまとめたい

    VBA初心者です。 似たような質問・回答がありますが、どうも私の意図するところと異なるので、 新たに質問させていただきます。 どうぞお願いします。 仕事場で、基本1日1ファイル取得している複数のCSVファイルを、 1週間に一度Excelファイルに一週間分のデータを追加し、 最終的には1か月毎に1つのExceファイル(1シート)に集計してます。 全ファイルとも内容は同じで、1シートで作成されており、 タイトル行は1行目、2行目以降データ(行:データ数はファイル毎に異なる)、 列数はA-IV列といった構成になります。 新しい1つのファイルにまとめる際には、 B列とG列のみ抽出し、一行目にタイトル行、2行目からデータ、 最終行に次のファイルのデータと、いうように複数のファイルのデータをつなげて 1つのファイルにしたいのです。 ちなみに出来上がったExcelファイルとしては、 A列に元CSVファイルのB列データ、C列に元CSVファイルのG列データ、 B列に各データがどのCSVファイルの物か分かるように、 各ファイル名の日付にあたる後ろ部分を表示させたいのです。 ファイル名から日付を拾えない場合は、 ファイルをまとめる前に、列を挿入し、 C列にデータ日付の項目を作り、そこに日付を入力し、 まとめる際に、B・C列+G列を抽出、といった形で、まとめられたらと思ってます。 *各Exceファイルのタイトルの後部分がデータの日付を表す (タイトル例:0803abcde2013_08_03.xls) B列2行目以降に、それぞれ抽出したデータのファイル名から、 日付にあたる部分を書き出し(8月3日と言ったように)表示させたい。 場合によっては、前部分を抽出するパターンもあるので、そちらもお願いします。 *今後、他の何種類かの複数CSVファイルでもファイル毎に (こちらも全ファイルとも内容は同じ)同様に1カ月毎にまとめたいので、 違う条件でも抽出できるように、応用できたらと、考えております。 (抽出する列がB列とI列のみ、A~C列+F列など) VBAで作業したいと考えてます。色々とお手数ですが、よろしくお願いします。 また、他にお勧めのサイトや、参考になる質問がありましたら、 合わせて、教えていただけると幸いです。

専門家に質問してみよう