質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

4210閲覧

VBAでCSVファイル内の重複を削除したい

name1224

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/11/18 09:07

調べてもなかなかできないので、
お力添えをお願い致します。

ExcelVBAでCSVファイルの重複を削除したいです。
通常であれば簡単なのですが、
行数が100万行くらいあるのでExcelでCSVを開く事ができません。
CSVに直接処理をかけたいです。

実現したいデータの中身は下記のような内容です。

(処理前)
徳川家康,2021/03/03,
明智光秀,2021/03/03,
徳川家康,2021/03/03,
織田信長,2021/03/03,
明智光秀,2021/03/03,
服部半蔵,2021/03/03,
徳川家康,2021/03/04,

(処理後)
徳川家康,2021/03/03,
明智光秀,2021/03/03,
織田信長,2021/03/03,
服部半蔵,2021/03/03,
徳川家康,2021/03/04,

同じ内容の行を削除したいです。

<試した事>

1、object.RemoveDuplicates ( columns [, header ] )
こちらのメソッドを使うのが早くて良さそうでしたが、
Rangeを指定できない為使用方法が分かりませんでした。

2、コマンドプロンプトではできませんでした。
ExcelVBAからpowershellを使った方法も考えましたが、
起動するところまではできましたが、
コマンドが分からずCSVに出力するまでできませんでした。

3、配列に格納してやろうとしましたが、
1次元配列の情報はネットから拾えましたが、
2次元配列のわかりやすい情報が収集できずスキル不足で実現できませんでした。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

VBAで重複削除と言われると、ついDictionaryを連想します。

VBA

1Sub sample() 2 3 Dim fn 4 With Application.FileDialog(msoFileDialogFilePicker) 5 .Show 6 fn = .SelectedItems(1) 7 End With 8 9 Dim dic As Scripting.Dictionary 10 Set dic = New Scripting.Dictionary 11 12 With New ADODB.Stream 13 .Type = adTypeText 14 .Charset = "UTF-8" 15 .LineSeparator = adCRLF 16 17 .Open 18 .LoadFromFile fn 19 20 Do While Not .EOS 21 Dim buf 22 buf = .ReadText(adReadLine) 23 dic(buf) = 0 24 Loop 25 .Close 26 27 .Open 28 Dim k 29 For Each k In dic 30 .WriteText k, adWriteLine 31 Next 32 .SaveToFile fn, adSaveCreateOverWrite 33 .Close 34 End With 35End Sub 36

投稿2021/11/18 12:10

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

name1224

2021/11/18 12:46

ご回答頂きましてありがとうございます。 Dictionaryもネット検索で調べたのですが、 私のスキル不足で使いこなせませんでした。 こちらのコードを使用させて頂きましたところ、 私のやりたかった事が実現されました。 後で復習して中身を理解しようと思います。 回答して頂き大変感謝申し上げます。 お二方ともベストアンサーにしたいのですが、 実現度が高かった為こちらをベストアンサーとさせて頂きます。
guest

0

SQLを使う方法です。
ただし、100万行で実行可能かどうかは未知数です。

vb

1Sub ReadCsv() 2 Const PATH = "z:\" '対象ファイルのフォルダに変更してください 3 Const FILE = "[aaa.csv]" '対象ファイル名に変更してください 4 5 Dim objCon As Object 6 Set objCon = CreateObject("ADODB.Connection") 7 objCon.Provider = "Microsoft.ACE.OLEDB.12.0" 8 objCon.Properties("Extended Properties") = "Text;HDR=NO" 9 Call objCon.Open(PATH) 10 11 'SQL文作成 12 Dim strSQL As String 13 strSQL = "SELECT DISTINCT * FROM " & FILE 14 15 'SQLの実行結果のレコードセットを取得 16 Dim objRecordset As Object 17 Set objRecordset = CreateObject("ADODB.Recordset") 18 Call objRecordset.Open(strSQL, objCon) 19 20 '結果を表示 21 Call Worksheets(1).Cells(1, 1).CopyFromRecordset(objRecordset) 22End Sub

 
追記
こんなことも出来るよという参考程度に

注意
実行後にschema.iniというファイルが作成されてしまうので不要であれば消す必要があります。
また、実行前に出力ファイルがすでに存在すればエラーになります。
データタイプが文字列と判定されたカラムの値は、コーテーションで囲われてしまいます。

vb

1Sub ReadCsv() 2 Const PATH = "z:\" '対象ファイルのフォルダに変更してください 3 Const INFILE = "[aaa.csv]" '入力ファイル名に変更してください 4 Const OUTFILE = "[BBB.txt]" '出力ファイル名に変更してください 5 6 Dim objCon As Object 7 Set objCon = CreateObject("ADODB.Connection") 8 objCon.Provider = "Microsoft.ACE.OLEDB.12.0" 9 objCon.Properties("Extended Properties") = "Text;HDR=NO" 10 Call objCon.Open(PATH) 11 12 'SQL文作成 13 Dim strSQL As String 14 strSQL = "SELECT DISTINCT F1,F2 INTO " & OUTFILE & " FROM " & INFILE 15 16 'テーブル作成クエリを実行しファイルを作成する 17 Dim objCommand As Object 18 Set objCommand = CreateObject("ADODB.Command") 19 objCommand.ActiveConnection = objCon 20 objCommand.CommandText = strSQL 21 Call objCommand.Execute 22End Sub

投稿2021/11/18 12:08

編集2021/11/18 13:39
takanaweb5

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

name1224

2021/11/18 12:35

ご回答頂きましてありがとうございます。 SQLを使うという方法は見落としておりました。 ご教授頂きましてありがとうございます。 100万行が原因なのかExcelにペーストされた時に不具合が起きてしまいますが、 件数を減らして試してみたところ上手くいきました。 実行速度もとても速かったです。 コードも見やすく大変勉強となりました。感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問