複数のCSVファイルを1シートに結合させる方法

このQ&Aのポイント
  • 複数のCSVファイルを1シートに結合させる方法について教えてください。
  • 日付とシリアル番号が付いた膨大な数のCSVファイルを結合する方法を教えてください。
  • ピボットテーブルを使用して複数のCSVファイルを1枚のワークシートに結合する方法を教えてください。
回答を見る
  • ベストアンサー

複数のCSVファイルを1シートに結合させる方法

よろしくお願いします。 似たような質問・回答がありますが、どうも私の意図するところと微妙に異なるので、新たに質問させていただきます。 ◆条件説明 ・「日付(mm:dd)_シリアル番号.csv」というファイルが膨大にあります。 ・ひとつの日付に対し、シリアル番号は01~63まであります。 (つまり同一の日付・・・のファイルが63個あります) ・新たな日付が毎日追加されますので、毎日63個のCSVファイルができます。 ・各CSVファイルは9,000行×3~10列程度です。 ・全てのワークシートのA列は0:00:00~23:59:50と時間が入力されています。 ・一度作成されたCSVデータは更新されません。 ◆欲しい結果 ・各日63個のCSVファイルを1枚のワークシートに結合するテンプレートが欲しい。 ・結合元の対象CSVファイルの「日付」を指定してやるだけで、対象の日付のデータが結合できる。 ピボットテーブルを使えば何だかできそうな気がしてかなり努力してみましたが、そもそもピボットテーブルがあまりよく理解できていないので、失敗しております。 説明が下手なので文字での説明に限界を覚えますが、よろしくお願いいたします。

  • hama-t
  • お礼率71% (146/204)

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

こんにちは。 VBA、書いてみましたので、よろしければ。 確認できている条件の他に特筆事項がなければ、要求に応えるものが書けていると思うのですが、 まぁ、一発ですんなり動くかどうかは、状況しだいです。 私にしては珍しくダミーサンプルを作らずに書いていますので、動作確認十分とは言えません。 試した上で、具体的で詳しいフィードバックを貰えれば、ある程度お応えするつもりです。 ' ' ======================================================================== ' ' ====指定の日付 をセルに入力して、そのセルをアクティブにしてから 実行==== ' ' ==コードの1行目で指定するフォレダの中にあるcsvテキストファイルから== ' ' ======指定日付の、年月に対応フォルダの、日に対応したファイル複数を====== ' ' ==============シリアル番号順にExcelシートに出力します============== ' ' ======同日同じシリアル番号のファイルが重複する場合上位Ver.のみ出力====== ' ' ===========指定の日付シートが既存の場合はシート名 (2)のように=========== ' ' ========エラートラップ未設定。Excel Ver.9以降用の汎用簡易タイプ========= Sub Re7732994a() ' ' 運用に合わせて、フォルダ「Y2012_10」親フォルダへのパス を 略さず正確に指定   Const S_PATH As String = "D:\CSVDATA" ' ←◆必ず!指定!◆      Const S_DLM As String = "_"   Const S_EXTN As String = ".csv"   Dim dateRet As Variant   Dim oDtObj As Object   Dim sh As Worksheet   Dim sYear As String, sMonth As String, sDate As String   Dim sFullPath As String, sStn1 As String   Dim sTmp As String, sTmp2 As String, sBuf As String   Dim col As Long, nVer As Long   Dim i As Long, j As Long   Dim nFree As Integer ' ' 日付指定   dateRet = ActiveCell.Value   If Not IsDate(dateRet) Then MsgBox "指定の日付をセルに入力してそのセルをアクティブにしてからやり直し": Exit Sub   sYear = Format(dateRet, "yyyy")   sMonth = Format(dateRet, "mm")   sDate = Format(dateRet, "dd") ' ' New DataObject:テキスト成形・貼り付けに使う外部オブジェクト   Set oDtObj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' ' 月別フォルダのフルパス ◇ドライブ名:\親フォルダのパス\"Y"yyyy_mm\◇   sFullPath = S_PATH & "\Y" & sYear & S_DLM & sMonth & "\" ' ' ファイル名(ショートネーム)前半 ◇"D"dd_◇0#_0#.csv   sStn1 = "D" & sDate & S_DLM ' ' シーケンシャル入力用のフリーナンバー   nFree = FreeFile ' ' アプリケーションの更新抑止   Application.ScreenUpdating = False ' ' 出力用シート追加   Set sh = Worksheets.Add(After:=ActiveSheet) ' ' シート名を設定 ◇"Y"yyyy_mm_"D"dd◇   On Error GoTo ReName_   sh.Name = "Y" & sYear & S_DLM & sMonth & S_DLM & "D" & sDate   On Error GoTo 0   For i = 1 To 63 ' ' ◇ドライブ名:\親フォルダのパス\"Y"yyyy_mm\"D"dd_0*_##.csv◇     sTmp = Dir(sFullPath & sStn1 & "0*" & S_DLM & Format(i, "00") & S_EXTN)     If sTmp <> "" Then       sTmp2 = "0"       Do While sTmp2 <> ""         sTmp2 = Dir()         If sTmp2 > sTmp Then sTmp = sTmp2       Loop       Open sFullPath & sTmp For Input As #nFree         sBuf = StrConv(InputB(LOF(nFree), #nFree), vbUnicode)       Close #nFree       With oDtObj ' DataObject経由でクリップボードへテキスト出力         .SetText Replace(sBuf, ",", vbTab)         .PutInClipboard       End With       col = Cells(5, 256).End(xlToLeft).Column + 1       Cells(5, col).PasteSpecial       If i > 1 Then Columns(col).Delete       nVer = Val(Right(sTmp, 9))       If nVer > 1 Then Cells(3, col).Value = "ver." & Format(nVer, "00")     Else       col = Cells(5, 256).End(xlToLeft).Column + 1       Cells(5, col).Value = "◆ Not Found !! ◆"     End If     Cells(2, col).Value = "sr." & Format(i, "00")   Next i   sh.UsedRange.EntireColumn.AutoFit   Cells(1).Select Exit_:   Set oDtObj = Nothing   Set sh = Nothing   Exit Sub ReName_:   Worksheets("Y" & sYear & S_DLM & sMonth & S_DLM & "D" & sDate).Copy Before:=sh   sBuf = ActiveSheet.Name   Application.DisplayAlerts = False   ActiveSheet.Delete   Application.DisplayAlerts = True   sh.Name = sBuf   Resume Next End Sub ' ' ========================================================================

hama-t
質問者

お礼

ご回答ありがとうございました。 結論として、CSVファイルを生成する装置のメーカーから、1日1枚のワークシートに結合するためのソフトを提供いただいて解決できました。 こんな解決方法で申し訳ない。 せっかくご苦労いただいたようなのでマクロも試してみたいのですが、マクロが苦手な私は、いずれ取り組まなければならない問題として、ひとまず温存しておきます。 ありがとうございました。

その他の回答 (3)

回答No.3

1℃見てみたい、日付(mm:dd)_出始まるそのふぁいる

hama-t
質問者

補足

時刻 3号排気温度(瞬時) 4号排気温度(瞬時) 0:00:00 70.3 151.1 0:00:10 70.2 150.8 0:00:20 70.2 149.9 0:00:30 70.2 149 0:00:40 70.2 148.2 0:00:50 70.2 147.7 0:01:00 70.2 147.5 0:01:10 70.3 147.3 0:01:20 70.3 147.2 0:01:30 70.3 147.1 0:01:40 70.3 147.9 ・・・・ このようなファイルが無数に存在します。 各ファイルはファイル名称(=シート見出し名称)での関連しかありません。 ちなみに厳密なファイル名称は「D01_01_01(D日付dd_01_シリアルNo).csv」です。 自動生成された10月のフォルダ(Y2012_10)のなかに、D01_01_01 ~ D31_01_63までが出来上がることになります。 (ファイル名称真ん中の01は意味はありません。自動生成失敗した場合に、2回目に生成してできたファイルなら02となります) 何か妙案はありますか?

  • asciiz
  • ベストアンサー率70% (6633/9396)
回答No.2

>希望としてはシート01(仮に3列)の最右列(C列)右側に、シート02(仮に4列)の2~4列目(B~D列)を結合したいのです。 それはさすがにマクロなりなんなり組まないと出来なさそうです。(私だったらperlでやる所ですが) しかし、それはそれで別の問題が出てきそうですよ… Excel2003ならば、列数は最大255列までです。 63個のファイルが各5列ずつだったなら、63×5=315 で、オーバーしてしまいます。 最初の1行を削除したならば、5 + 62×4=253 で、ギリギリ、本っ当にギリギリ、入りますが。 1シート平均5列以上あったならば、横にも結合できない、と言うことになります。 管理方法から考え直す必要があるのではないでしょうか。 あるいは、excel2007以降(今ならOffice 2010等)を購入するかです。 新しいバージョンならば、行数約100万行と、列数約16,000 列まで扱えるようになっていますので、DOS結合したCSVも難なく読めるはずです。

hama-t
質問者

お礼

結果として、メーカー提供のソフトで解決を見ることができました。 お手数おかけしました。 ありがとうございました。

hama-t
質問者

補足

再度の回答ありがとうございます。 とりあえず今のところ255列に収まっているので、問題なしかと。 会社のPCなので、Officeそのもののバージョンアップも難しいですし、何とか現状の環境でよい方法がないかと悩んでおります。 時間さえかければ、「手作業で」という方法もないわけではないのですけどね。

  • asciiz
  • ベストアンサー率70% (6633/9396)
回答No.1

DOSの操作の方が楽な気がします。 CSVファイルは、テキストファイルです。 単純なテキストファイルの結合ならば、コマンドプロンプトでできてしまうのです。 コマンドプロンプトを起動し、CSVデータのある場所に移動してください。 (1)スタート→アクセサリ→コマンド プロンプト 黒いウインドウが出て、下のようなプロンプトが出ます。 ↓ C:\Document and Settings\(ユーザー名)> ここに、コマンドを打っていきます。 (2)D: ドライブに移動(必要な場合) C:\Document and Settings\(ユーザー名)> D: D:\> (3)CSVファイルがあるフォルダに移動 ※ここでは \Work と仮定 D:\> CD \work D:\Work> (4)ワイルドカード(*)を使用して、copyコマンドで複数ファイルを1つのファイルに結合。 D:\Work> copy 20121005_*.csv all20121005.csv 20121005_01.csv 20121005_02.csv 20121005_03.csv   :   (中略) 1 個のファイルをコピーしました。 D:\Work> こうすると、新しく出来た all20121005.csv は、20121005_(連番).csv ファイルのすべてを連結した、CSVファイルとなっています。 これをexcelで開けば完了です。 ただし、ファイルの順番が前後するかもしれません。(ファイル名の順ではなく、ファイルが作成された順に、コピーが行われるので) CSVに時刻の列があるなら、念のためそこで並べ換えすると良いでしょう。 ---- 一つ注意があります。 結合後のファイル名を、最初のワイルドカード指定とかぶらないように決めましょう。 (悪い例) copy 20121005_*.csv 20121005_all.csv このようにやってしまうと、「20121005_all.csv」自身が「20121005_*.csv」に引っかかることになり、おかしくなる場合があります。

hama-t
質問者

補足

回答ありがとうございます。 DOSを利用するとは、目からうろこの思いです。 遠い昔の記憶を辿ってやってみました。 結果、CSV(テキスト)をそのまま連結するため、01の末尾行の下に02のシートのデータがつながりました。 (Excell2003ですので、65,000行を超えて「全体を表示できません」になってしまいました) 希望としてはシート01(仮に3列)の最右列(C列)右側に、シート02(仮に4列)の2~4列目(B~D列)を結合したいのです。 ※A列には同じように時刻データがあるので、A列はシート01のものだけでよい。 いかがでしょうか?

関連するQ&A

  • CSVファイルを読み込んだらセル結合が解除されます。

    excel2000で、結合セルが含まれているシートに対して 外部データとしてCSVファイルを読み込み、貼り付けると、 貼り付け先のシートのセル結合が解除されてしまいます。 以前読んだあるハンドブックで、外部データを取り込む際には、 セル結合をしてはならないと書いてあったんですが、 今回の作業対象となるフォーマットには、結合セルが1枚のシートで 百組以上存在しています。 やはり地道に自力で復旧作業をするしか方法は無いのでしょうか? ご教授をお願いいたします。

  • 複数個のcsvファイルから一気にデータを統合?

    初めて質問させていただきます。 毎日一定の書式が決まった形でデータを管理しております。(出勤簿).出勤者のみの氏名が表記される。 1.ファイル名(2005_1_1.csv)日付 2.シート1 3.列Aに通し番号(1.2・・・・)、列Bに氏名 社員名簿が一応あります。 1.A列に通し番号、B列に氏名(meibo.csv) この形で毎日記録をしておりましたので、データ(csv)ファイルがたくさんたまってしまいました。 そこで、このような複数のデ-タファイルを、社員名簿を元に、出勤日に●をつけるといったことをしたいと思っています。 一気に複数のファイルからデータを吸出し、統計を取ることは可能でしょうか? ちょっとデータの管理で困ってしまっていて、悩んでいます。 具体的な事例などをもしお教えいただけたら幸いです。

  • 複数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で作業したいと考えてます。色々とお手数ですが、よろしくお願いします。 また、他にお勧めのサイトや、参考になる質問がありましたら、 合わせて、教えていただけると幸いです。

  • csvのデーターファイルから任意の行をエクセルファイルへ入力するエクセ

    csvのデーターファイルから任意の行をエクセルファイルへ入力するエクセルVBA が上手くできません。 6列2000行のcsvデーターのテキストファイルの作成は、色々な参考書があり成功しました。次に このcsvのデーターファイルから任意の複数行をシート4などの任意のワークシートの任意の場所に60行程度をインポートして、この60行の数値データーを加工しようとしていますが、入力が上手くできません。数値データーの加工のプログラムは一応できているため、その様式にあわせて、所定の場所にデーターを入れる必要が有ります。 1列目には日付(シリアルの数値にしています)、その他はすべて数値(LONG型)です。エクセルは2003を使用しています。 VBAの初心者です。宜しくお願いいたします。

  • CSVファイルの結合

    ある業務で、4月から毎月の会計仕訳取引のデータを CSVファイルで月単位で入手しました。 さて、この毎月のCSVファイルを一つに結合するにはどうしたらいいでしょうか?

  • CSVファイルを読んでシートに書き込む方法

    エクセルのマクロ(VB6.5)でCSVファイルをよんでシートに書き込みたいのですが誰か教えて下さい。 例えば CSVファイルはこんな感じだとします。 ファイルID:test.csv ファイル内容  (1レコード)123,123,123,123,123,123  (2レコード)456,456,456,456,456  (3レコード)789,789,789,789 書き込むシートは「abcシート」とします。 CSVファイルはカンマ区切りですがレコード毎にカンマ区切りのデータ数が違います。 シートには指定したセルに書き込めば一番いいのですが、上から順番に書き込んでもいいです。 申し訳ありませんが、宜しくお願い致します。

  • CSV シートの結合その2

    エクセルのセル結合について教えて下さい。 静岡県  静岡市あああ町5-32 あああビル111号 と言う風に、みっつの列にデータが入っています。 この列を一つに結合して  静岡県静岡市あああ町5-32あああビル111号 としたいのですが、できません。結合しようとすると、一番左の列意外はデータが消えてしまいますと言われてしまいます。 この問題に対して、以下の回答を頂いたのですが、問題発生です。結合したセルを、一番左のセルに移動したいのですが、そうすると、他のセルの数値を参照して中身が変わってしまうのです。結合したデータが一番左にでないと、CSVで取り込むときに不具合が生じます。左側のセルに最初から指定すると、循環参照で不正です?というようなことを言われます。どうしたらいいんでしょうか? いただいた回答↓ 皆さんが回答しているように =A1&A2&A3 が簡単ですが、 関数を使った方法としては =CONCATENATE(A1,A2,A3) があります。 関数には色々種類があり、覚えると非常に便利です。 1.セルに「=」と打つ。 2.左側にある▼でその他関数を選ぶ、 3.文字列操作を選ぶ。 4.CONCATENATE等の関数名を選ぶ。 5.ヒント、ガイドにそって、入力です。 色々試してみてください。

  • csvファイルのインポート

    Accessでcsvファイルをインポートさせようとしています。しかし、「F1フィールドがありません」のようなエラー表示が出て、できません。私の予想では、テーブルの型とcsvファイルの型が違うのではないかと思っています。テーブルには、数値型、テキスト型、日付/データ型があります。 保存したcsvファイルをExcelで開くと日付がApr-01や、2001/06/26となったりしていました。どこかで型変換のようなことをするのでしょうか?csvのことはよく分かりません。どうか、よろしくお願いします。

  • csvファイルを結合するバッチファイル作成方法

    こんにちは。 フォルダ名cccの中にある2つのcsvファイル、sheet1とsheet2を 結合してketsugoというcsvファイルつくるために、 バッチファイルを作成しようとしています。 (sheet1とsheet2のcsvファイルは4万行前後/シートで、 今後結合させるファイル数を増やす予定です。 手作業では難しいと思い、バッチ処理を検討中です。) C:\aaa\My Douments\ccc>copy /y sheet1.csv+sheet2.csv ketsugo.csv というコマンドが、コマンドプロンプト上で実行できます。 (aaaやcccはファイル略称で、漢字や半角スペース含む) 次にウィンドウズのメモ帳を開き、同じコマンドを入力し、 拡張子.batのバッチファイルを作りました。 作成したバッチファイルを開いてコマンドを実行させようと しましたが、容量ゼロの、アプリケーションを選択させる ファイルしかできません。コマンドの中に半角スペースを含む ファイル名がある場合は、""でくくるルールがあるそうですが、 実際に上記のコマンドのどこからどこまでを""でくくったら よいかわかりません。その他にも不備な点がありましたら 改善方法を教えていただきたいと思います。 よろしくお願いします。

  • InDesign CSV データ結合

    InDesign CS4 で CSVファイルからデータ結合を しようとしています。 CSVを読み込みましたが、部分的に読み込まれない部分があります。 CSVの改行を削除をしたりしていますが、解決できません。 改行以外の原因は他にありますか? セル内のデータには、 10:00~12:00 14:00~21:00 という文字列が含まれますが、 それらも読み込まれている箇所と、そうでない箇所があります。

専門家に質問してみよう