アプリ版:「スタンプのみでお礼する」機能のリリースについて

CSVファイルを結合したいのですが、重複しているデータは削除した結果で結合させたいと
思っています。

CSVファイルはカンマ区切りで30列分、5000行ぐらいのデータ量となっています。
(1行目はタイトル行)
結合したときに、30列分のデータが全て同じ場合はひとつだけ残してかぶっているデータは
削除させたいです。

処理のイメージとしては下記が一番やりやすいのかなと思っていますが、VBA初心者なので
お知恵をお借りしたいです。
・結合したいファイルをCドライブ直下にフォルダ作って置いておく。(多くても10ファイルぐらいです)
・それをエクセルのマクロ(VBA)でマクロ実行したら、上記ファイルを読み込んでワークシートにデータをすべて貼り付けて、重複データを削除。
・残ったデータを新規ファイルで保存(同じディレクトリにCSV形式で保存)
※結合させたときにどれくらいのデータ量になるかは把握出来ていません。

A 回答 (4件)

以下のマクロを標準モジュールに登録してください。


使用上の注意
Const folder As String = "D:\goo\excel\goo166"・・・CSVファイルのあるフォルダ
Const outfile As String = "結合.csv"・・・出力するCSVファイル名
上記はあなたの環境に合わせて適切に設定してください。
①拡張子がCSVのファイルのみを処理しています。
②同じ内容か否かは、1行の文字が全く同じなら、同じ内容と判断します。
③入力データ件数、出力データ件数に見出し行は含めません。
④全てのファイルに見出し行があるものとします。
⑤2回目に実行する際は、結合.csvを削除してから行ってください。そうしないと、そのファイルも入力ファイル扱いになってしまいます。
------------------------------------------------------------
Option Explicit
Public Sub CSVファイル結合()
Const folder As String = "D:\goo\excel\goo166"
Const outfile As String = "結合.csv"
Dim dicT As Object
Dim in_data_ctr As Long
Dim out_data_ctr As Long
Dim fname As String
Dim file_ctr As Long
Dim header_line As String
Dim fileNo As Long
Dim out_path As String
Dim key As Variant
in_data_ctr = 0
out_data_ctr = 0
file_ctr = 0
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
fname = Dir(folder & "\" & "*.csv", vbNormal)
Do While fname <> ""
file_ctr = file_ctr + 1
Call read_csv(folder & "\" & fname, dicT, in_data_ctr, header_line)
fname = Dir()
Loop
out_path = folder & "\" & outfile
fileNo = FreeFile '空き番号取得
Open out_path For Output As #fileNo
Print #fileNo, header_line
For Each key In dicT
Print #fileNo, key
out_data_ctr = out_data_ctr + 1
Next
Close #fileNo
MsgBox (file_ctr & "件のファイルを処理しました。入力データ件数=" & in_data_ctr & " 出力データ件数=" & out_data_ctr)

End Sub

Private Sub read_csv(ByVal file_path As String, ByVal dicT As Object, ByRef in_ctr As Long, ByRef header As String)
Dim fileNo As Long
Dim text As String
fileNo = FreeFile '空き番号取得
Open file_path For Input As #fileNo
Line Input #fileNo, header '1行目は見出しなのでヘッダー行へ格納
Do Until EOF(fileNo)
Line Input #fileNo, text
in_ctr = in_ctr + 1
If dicT.exists(text) = False Then
dicT(text) = True
End If
Loop
Close #fileNo
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございました!
問題無く結合する事出来ています。
大変助かりました。

お礼日時:2018/10/15 10:24

そうすると、””でくくられたデータは全て同じ列になるのでしょうか。


"aaa",bbb,ccc,"ddd",eee,fff,ggg,hhh,iii,"jjj",kkk,lll,mmm,nnn,ooo,ppp,"qqq",rrr,sss,ttt,"uuu",vvv,www,"xxx",
①      ②           ③
①=1列目(A列)
②=4列目(D列)
③=10列目(J列)
つまり、①②③・・・以降省略 に示される列が””でくくられており、この列の位置は全てのCSVファイルで共通でしょうか。
それであれば、マクロの提供は可能です。
    • good
    • 0
この回答へのお礼

""でくくられたデータは1行目含めて全て同じ列になると考えて頂いて問題ありません。
全てのCSVファイル共通となっています。

お礼日時:2018/10/12 23:55

データの形式は①②のどちらでしょうか。


① "AAA","BBB","CCC"
② AAA,BBB,CCC
上記は、セルに格納されると
A1=AAA
B1=BBB
C1=CCC
となり、同じ内容ということになります。

①と②の形式が混在しないという条件なら、簡単に重複データの削除が可能ですが、混在する場合がありますか。
1つのファイル内に混在する場合は、もちろんですが、
ファイル1が①のタイプで、ファイル2が②のタイプの場合も混在する扱いとなります。
混在しない場合とは、
そのフォルダ内の全てのCSVファイルのデータ形式が①のケース
そのフォルダ内の全てのCSVファイルのデータ形式が②のケース
上記の何れかの場合です。

混在しないのなら、マクロの提供は可能です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
残念ながら1つのファイル内で混在していました。
1行目のタイトル行は①ですが、2行目以降は全て下記となっています。
フォルダ内すべてのCSVファイルはこのデータ形式になっています。
"aaa",bbb,ccc,"ddd",eee,fff,ggg,hhh,iii,"jjj",kkk,lll,mmm,nnn,ooo,ppp,"qqq",rrr,sss,ttt,"uuu",vvv,www,"xxx","yyy","zzz","abab","acac",adad,"aeae"

お礼日時:2018/10/12 23:35

はじめまして



エクセルでおっしゃられるような操作をマクロの記録でされればどうでしょう?
それが一番簡単だと思いますが…
    • good
    • 0
この回答へのお礼

ありがとうございます。
CSVファイルをマクロで開くところでつまずいています。
一番の問題はファイル数が決まっていないのでどうすれば良いのか分からず・・・

OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv")
これでファイル選択してやろうと思ったのですが、CSVファイルがエクセルで開いてくれませんでした。
Workbooks.Open Filename:="***"
上記のようにファイル指定でも良いのですが、ファイルの数が決まっていないので悩んでいます。

お礼日時:2018/10/12 19:31

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

このQ&Aを見た人はこんなQ&Aも見ています