- ベストアンサー
複数のcsvファイルを1つのEXCELファイルにマージするVBAを教えてください
csvファイル数は700~1000個程度でひとつのフォルダに格納されています。 このファイルをEXCEL形式で開くと、1行目にフィールド名(A~Z列で固定)、2行目以降にデータが入っています。行数はファイルにより1~100行程度で変動します。 このファイルを1つのエクセルファイルの同一シートに結合(マージ)するVBAがほしいです。 ここで、(できればですが)EXCELにマージするにあたり、1行目のみフィールドの値、2行目以降にそれぞれのcsvの2行目以降データの値を入れていくようにしたいです。つまり、フィールド名の行が何行も出てくるのを避けたいです。 申し訳ございませんが、ご指導いただけたら幸いです。よろしくお願いします。
- japan116
- お礼率85% (6/7)
- オフィス系ソフト
- 回答数2
- ありがとう数10
- みんなの回答 (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
その他の回答 (1)
- fujillin
- ベストアンサー率61% (1594/2576)
自動化するなら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 各データ(セルに記入するデータ)内にカンマ(,)を含んでいる可能性がある場合は、その処理がちょいと面倒かも。
お礼
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で。ドラッグ&ドロップ程度の操作で出来るのもであればうれしいです。 よろしくお願いいたします
- 締切済み
- その他(ITシステム運用・管理)
- エクセル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
- 締切済み
- Excel(エクセル)
- 複数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で作業したいと考えてます。色々とお手数ですが、よろしくお願いします。 また、他にお勧めのサイトや、参考になる質問がありましたら、 合わせて、教えていただけると幸いです。
- ベストアンサー
- Visual Basic
お礼
end-uさん ありがとうございます!まさにこんなツールがほしいと思ってました!しかもA列にファイル名が追加されるのは、データの出所がわかるのでさらに便利ですね!早速活用させていただきます! 本当にありがとうございました。 これにて質問を締め切らせていただきます。