• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数のCSVファイルを1シートに結合させる方法)

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

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

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

  • ベストアンサー
  • 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% (6809/9681)
回答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% (6809/9681)
回答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