- ベストアンサー
複数のCSVファイルを1シートに結合させる方法
- 複数のCSVファイルを1シートに結合させる方法について教えてください。
- 日付とシリアル番号が付いた膨大な数のCSVファイルを結合する方法を教えてください。
- ピボットテーブルを使用して複数のCSVファイルを1枚のワークシートに結合する方法を教えてください。
- みんなの回答 (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 ' ' ========================================================================
その他の回答 (3)
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
1℃見てみたい、日付(mm:dd)_出始まるそのふぁいる
補足
時刻 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)
>希望としてはシート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も難なく読めるはずです。
お礼
結果として、メーカー提供のソフトで解決を見ることができました。 お手数おかけしました。 ありがとうございました。
補足
再度の回答ありがとうございます。 とりあえず今のところ255列に収まっているので、問題なしかと。 会社のPCなので、Officeそのもののバージョンアップも難しいですし、何とか現状の環境でよい方法がないかと悩んでおります。 時間さえかければ、「手作業で」という方法もないわけではないのですけどね。
- asciiz
- ベストアンサー率70% (6809/9681)
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」に引っかかることになり、おかしくなる場合があります。
補足
回答ありがとうございます。 DOSを利用するとは、目からうろこの思いです。 遠い昔の記憶を辿ってやってみました。 結果、CSV(テキスト)をそのまま連結するため、01の末尾行の下に02のシートのデータがつながりました。 (Excell2003ですので、65,000行を超えて「全体を表示できません」になってしまいました) 希望としてはシート01(仮に3列)の最右列(C列)右側に、シート02(仮に4列)の2~4列目(B~D列)を結合したいのです。 ※A列には同じように時刻データがあるので、A列はシート01のものだけでよい。 いかがでしょうか?
お礼
ご回答ありがとうございました。 結論として、CSVファイルを生成する装置のメーカーから、1日1枚のワークシートに結合するためのソフトを提供いただいて解決できました。 こんな解決方法で申し訳ない。 せっかくご苦労いただいたようなのでマクロも試してみたいのですが、マクロが苦手な私は、いずれ取り組まなければならない問題として、ひとまず温存しておきます。 ありがとうございました。