よろしくお願いします。
似たような質問・回答がありますが、どうも私の意図するところと微妙に異なるので、新たに質問させていただきます。
◆条件説明
・「日付(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ファイルの「日付」を指定してやるだけで、対象の日付のデータが結合できる。
ピボットテーブルを使えば何だかできそうな気がしてかなり努力してみましたが、そもそもピボットテーブルがあまりよく理解できていないので、失敗しております。
説明が下手なので文字での説明に限界を覚えますが、よろしくお願いいたします。
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
' ' ========================================================================
ご回答ありがとうございました。
結論として、CSVファイルを生成する装置のメーカーから、1日1枚のワークシートに結合するためのソフトを提供いただいて解決できました。
こんな解決方法で申し訳ない。
せっかくご苦労いただいたようなのでマクロも試してみたいのですが、マクロが苦手な私は、いずれ取り組まなければならない問題として、ひとまず温存しておきます。
ありがとうございました。
No.3
- 回答日時:
1℃見てみたい、日付(mm:dd)_出始まるそのふぁいる
この回答への補足
時刻3号排気温度(瞬時)4号排気温度(瞬時)
0:00:0070.3151.1
0:00:1070.2150.8
0:00:2070.2149.9
0:00:3070.2149
0:00:4070.2148.2
0:00:5070.2147.7
0:01:0070.2147.5
0:01:1070.3147.3
0:01:2070.3147.2
0:01:3070.3147.1
0:01:4070.3147.9
・・・・
このようなファイルが無数に存在します。
各ファイルはファイル名称(=シート見出し名称)での関連しかありません。
ちなみに厳密なファイル名称は「D01_01_01(D日付dd_01_シリアルNo).csv」です。
自動生成された10月のフォルダ(Y2012_10)のなかに、D01_01_01 ~ D31_01_63までが出来上がることになります。
(ファイル名称真ん中の01は意味はありません。自動生成失敗した場合に、2回目に生成してできたファイルなら02となります)
何か妙案はありますか?
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も難なく読めるはずです。
この回答への補足
再度の回答ありがとうございます。
とりあえず今のところ255列に収まっているので、問題なしかと。
会社のPCなので、Officeそのもののバージョンアップも難しいですし、何とか現状の環境でよい方法がないかと悩んでおります。
時間さえかければ、「手作業で」という方法もないわけではないのですけどね。
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」に引っかかることになり、おかしくなる場合があります。
この回答への補足
回答ありがとうございます。
DOSを利用するとは、目からうろこの思いです。
遠い昔の記憶を辿ってやってみました。
結果、CSV(テキスト)をそのまま連結するため、01の末尾行の下に02のシートのデータがつながりました。
(Excell2003ですので、65,000行を超えて「全体を表示できません」になってしまいました)
希望としてはシート01(仮に3列)の最右列(C列)右側に、シート02(仮に4列)の2~4列目(B~D列)を結合したいのです。
※A列には同じように時刻データがあるので、A列はシート01のものだけでよい。
いかがでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数のCSVファイルを横に並べて...
-
エクセルの指数を無効にしたい
-
excelインポート時の「実行時エ...
-
同じ形のCSVファイルを複数同時...
-
Excel VBAを使った複数のCSVフ...
-
CSVファイルの結合(重複データ...
-
二つのCSVファイルを照らし合わ...
-
複数のcsvファイルを1つのEXCEL...
-
EXCELにcsv形式の外部データを...
-
大量のCSVデータを1つのエ...
-
8.3型がとられてきた理由は?
-
複数のデータ系列の線の太さを...
-
エクセル終了時の保存確認メッ...
-
ExcelVBAで今開いているユーザ...
-
Excelが勝手にシート移動してし...
-
Powerpointでランダムな数字の...
-
フォルダ内の全ブックのシート...
-
エクセルでツールバーに「縮小...
-
VBA マクロ実行時エラー’1004Ra...
-
EXCEL マクロ クリップボードク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの指数を無効にしたい
-
複数のCSVファイルを横に並べて...
-
excelインポート時の「実行時エ...
-
大量のCSVデータを1つのエ...
-
VBAでCSVの1行目だけを書き換え...
-
CSVファイルの結合(重複データ...
-
EXCELにcsv形式の外部データを...
-
複数のcsvファイルを1つのEXCEL...
-
二つのCSVファイルを照らし合わ...
-
Excel VBAを使った複数のCSVフ...
-
「ほかのアプリケーションを無...
-
datファイル→csvファイル→datフ...
-
【VBA初心者】同じフォルダ内の...
-
VBAでユーザーフォーム上に参照...
-
EXCELLの動きが遅い
-
破損したExcelファイルの内容を...
-
二つのファイル間でデータリン...
-
ExcelでCSVファイル読み込み時...
-
エクセルの日付への自動変換を...
-
エクセルの関数、VBAの使い分け
おすすめ情報