dポイントプレゼントキャンペーン実施中!

よろしくお願いします。

似たような質問・回答がありますが、どうも私の意図するところと微妙に異なるので、新たに質問させていただきます。

◆条件説明
・「日付(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ファイルの「日付」を指定してやるだけで、対象の日付のデータが結合できる。

ピボットテーブルを使えば何だかできそうな気がしてかなり努力してみましたが、そもそもピボットテーブルがあまりよく理解できていないので、失敗しております。

説明が下手なので文字での説明に限界を覚えますが、よろしくお願いいたします。

A 回答 (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
' ' ========================================================================
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/09 09:59

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となります)
何か妙案はありますか?

補足日時:2012/10/05 14:09
    • good
    • 0

>希望としてはシート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そのもののバージョンアップも難しいですし、何とか現状の環境でよい方法がないかと悩んでおります。
時間さえかければ、「手作業で」という方法もないわけではないのですけどね。

補足日時:2012/10/05 15:10
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/09 10:01

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のものだけでよい。

いかがでしょうか?

補足日時:2012/10/05 11:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!