[[20160208134945]] 『複数のCSVファイルを一つにまとめるマクロ』(でら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のCSVファイルを一つにまとめるマクロ』(でら)

いつもお世話になっております。
マクロ勉強中の者です、以下についてご教示願います。

デスクトップのtest というフォルダに、”ファイル名は異なるが同じレイアウトのCSVデータ”
が複数入っており、これを集約させた別データ(ファイル名をmatome.csvで新規にCSV作成)
したいと思っております。また、集約と併せて、以下のことも踏まえて考えてます。

イメージとしては・・・

sample.csv

   A    B    C     D
1 部番   納期   数量  注番
2 100    0202      50       ABC
3 101    0202      10       ABD
4 100    0204      10       EEW

sample2.csv

   A    B    C     D
1 部番   納期   数量  注番
2 200    0202      50       AAB
3 201    0202      10       BBA
4 200    0204      10       EEW

これを以下のようにしたい

matome.csv

   A    B    C     D
1 部番   納期   数量  注番
2 100    0202      50       ABC
3 101    0202      10       ABD
4 100    0204      10       EEW
5 200    0202      50       AAB
6 201    0202      10       BBA
7 200    0204      10       EEW

★サンプルは2ケのCSVだけですが、通常業務ではランダムでデータ数が毎週発生してます

上記の作業をマクロで実施する場合、どのようになるのでしょうか?
宜しくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


似た内容は、過去に何度も登場しているかと。

ところで、CSVファイルの区切り文字は何ですか? もしカンマの場合、データ自身にカンマはありますか?
連結するファイルの順番は、バラバラでも良いですか?
(例えばDir関数を使っても、どういう順番で表示されるかはディスク内の配置に依るので、不定なのです。
コマンドプロンプト利用の場合、ソートする命令はNASには効かないこともあるので、これも不確実です)

とりあえず、どこまで作っていて、どこで悩んでいるのか見せてください。テキストのまま連結するのか、
Excelブックとして読み込んでからコピペするのか、貴方の方針が知りたいです。
(???) 2016/02/08(月) 14:40


 マクロをご希望のようですが、フリーソフトをインストールしてもいい環境なら
 手作業での方法もあります。何度か手順を踏むことにはなりますが。
(se_9) 2016/02/08(月) 14:52

 >連結するファイルの順番は、バラバラでも良いですか?
 ここが重要、
 バラバラでよければDir関数を使うだけなので比較的簡単、名前順などの順番が
 必要なら、一旦名前を配列に読み込んで並べ替えてやる必要がある。

 書き出しに関しては、例を見る限り行内のレイアウトはどうでもよさそう。
 Line Inputで読んでPrintでそのまま書き出すだけ、その際2ファイル目からは
 一行目は書き出さないようにすればよいだけ。

(とおりすがり) 2016/02/08(月) 15:51


Sub main()
'順番無視の例
    Dim buf  As String, fl As Object, fso As Object, wsh As Variant, pt As String, flg1 As Boolean, flg2 As Boolean
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wsh = CreateObject("Wscript.Shell")
    pt = wsh.SpecialFolders("Desktop") & "\test"
    If fso.FileExists(pt & "\matome.csv") Then Kill pt & "\matome.csv"
    Open pt & "\matome.csv" For Append As #1
        For Each fl In fso.GetFolder(pt).Files
            If (Right(fl.Name, 4) = ".csv" Or Right(fl.Name, 4) = ".CSV") And Not fl.Name = "matome.csv" Then
                Open pt & "\" & fl.Name For Input As #2
                flg2 = False
                    Do Until EOF(2)
                        Line Input #2, buf
                            If flg2 = True Or Not flg1 Then Print #1, buf
                        flg2 = True
                    Loop
                Close #2
                flg1 = True
            End If
        Next fl
    Close #1
    Set fso = Nothing
    Set wsh = Nothing
End Sub
(mm) 2016/02/08(月) 16:14

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.