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

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

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

Q&A

解決済

2回答

1946閲覧

Excelへcsvを取込む前に既存データとの重複チェックを行う方法を教えてください

shhan0704

総合スコア1

0グッド

0クリップ

投稿2021/10/15 06:00

前提・実現したいこと

excelにcsvデータを追記で取込むときに、すでに登録されている指定列”G”と”O”のデータと重複チェックを行い
重複がある場合は、エラーリスト(別シート)に出力、重複がない場合はcsv取り込みを進めるようなVBAを書きたいのですが、
どのようにしたらよいか、お知恵をお貸しください。(最近VBAを触り始めました)

該当のソースコード

素人ながらに現状、下記コードを書いています。

Sub cmdBtn_Csv_Import()
Dim myFileName As Variant
Dim Fcn As Long
Dim i As Long
Dim buf As String
Dim tmp As Variant
Dim n, m, h As Long

' csvファイル選択 myFileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") If myFileName = False Then MsgBox "キャンセルされました。" Exit Sub End If ' イベント停止 Application.DisplayAlerts = False Call EventTermination With Worksheets("Sheet1") ' 最終行を取得 n = .Cells(.Rows.Count, 4).End(xlUp).Row If INT_ROW_DATAHEAD_START <= 5 Then End If ' 重複チェック Set ws1 = Worksheets("Sheet1") Workbooks.Open FileName:=myFileName Set ws2 = ActiveWorkbook.Worksheets() For m = 5 To n For h = 2 To 200 If ws2.Range("G", h).Value = ws1.Range("G", m).Value Then MsgBox "重複データがあります" Exit Sub Exit For End If Next Next '書き出し Open myFileName For Input As #1 Line Input #1, buf Do Until EOF(1) Line Input #1, buf Fcn = Fcn + 1 tmp = Split(buf, ",") n = n + 1 ws1.Cells(n, 4).Value = tmp(2) ws1.Cells(n, 5).Value = tmp(3) ws1.Cells(n, 6).Value = tmp(4) ws1.Cells(n, 7).Value = tmp(6) ws1.Cells(n, 8).Value = tmp(7) ws1.Cells(n, 9).Value = tmp(8) ws1.Cells(n, 10).Value = tmp(9) ws1.Cells(n, 11).Value = tmp(10) ws1.Cells(n, 12).Value = tmp(11) ws1.Cells(n, 13).Value = tmp(14) ws1.Cells(n, 14).Value = tmp(12) ws1.Cells(n, 15).Value = tmp(13) Loop Close #1 ' イベント開始 Application.DisplayAlerts = True Call EventRestart ThisWorkbook.Activate MsgBox "処理が完了しました。" ws1.Activate

End With
End Sub

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

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

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

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

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

hatena19

2021/10/15 06:47

> 指定列”G”と”O”のデータと重複チェック G列またはO列のどちらか一方でも重複してたらエラーでしょうか。 それともG列とO列の組み合わせで、重複していた場合にエラーでしょうか。
shhan0704

2021/10/15 09:11

G列とO列の組み合わせで重複していた場合にエラーにしたいです。
guest

回答2

0

Dictionaryを使った方法は既にでてますので、
AdvancedFilterを使った方法を紹介しておきます。

vba

1 Dim ws1 As Worksheet '取り込み先 2 Dim ws2 As Worksheet 'CSV 3 Dim ws3 As Worksheet 'エラー 4 Set ws1 = Worksheets("Sheet1") 5 Set ws2 = Workbooks.Open(myFileName) 6 Set ws3 = Workbooks.Add.Worksheets(1) 7 8 Dim rngMoto As Range 9 Set rngMoto = ws1.Cells(1, 1).CurrentRegion 10 Dim rngCSV As Range 11 Set rngCSV = ws2.Cells(1, 1).CurrentRegion 12 Dim rngCriteria As Range 13 Set rngCriteria = ws3.Cells(1, 1).Resize(rngMoto.Rows.Count, 2) 14 rngCriteria.Columns(1).Value = rngMoto.Columns("B").Value 15 rngCriteria.Columns(2).Value = rngMoto.Columns("D").Value 16 'CSVデータに取りこみ先のG列、O列でフィルタをかける 17 rngCSV.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rngCriteria 18 rngCriteria.Clear 19 With rngCSV.SpecialCells(xlCellTypeVisible) '重複データを 20 .Copy ws3.Cells(1, 1) 'エラーシートにコピー 21 .EntireRow.Delete '削除 22 End With 23 ws2.ShowAllData 'フィルター解除 24 ws2.Cells(1, 1).CurrentRegion.Copy _ 25 ws1.Cells(rngMoto.Rows.Count + 1, 1) '取り込み先に追加コピー

投稿2021/10/15 16:48

hatena19

総合スコア33795

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

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

0

ベストアンサー

たとえばこんな感じでどうでしょうか。

VBA

1 Dim ws1 As Worksheet '取り込み先 2 Dim ws2 As Worksheet 'CSV 3 Dim ws3 As Worksheet 'エラー 4 Set ws1 = ThisWorkbook.Worksheets("Sheet1") 5 Set ws2 = Workbooks.Open(myFileName).Worksheets(1) 6 Set ws3 = Workbooks.Add.Worksheets(1) 7 8 Dim dic 9 Set dic = CreateObject("Scripting.Dictionary") 10 11 With ws1 12 Dim i, n 13 n = .Range("D" & .Rows.Count).End(xlUp).Row 14 For i = 2 To n 15 dic(.Range("G" & i).Value & vbTab & .Range("O" & i).Value) = 0 16 Next 17 End With 18 19 With ws2 20 Dim e 21 For i = 2 To .Range("A" & .Rows.Count).End(xlUp).Row 22 If dic.Exists(.Range("G" & i).Value & vbTab & .Range("O" & i).Value) Then 23 e = e + 1 24 .Rows(i).Copy ws3.Rows(e) 25 Else 26 n = n + 1 27 .Rows(i).Copy ws1.Rows(n) 28 dic(.Range("G" & i).Value & vbTab & .Range("O" & i).Value) = 0 29 End If 30 Next 31 End With

<追記>
意外とこんな感じでもいいのかも。

VBA

1 Dim i 2 For i = 2 To ws2.Range("A" & ws2.Rows.Count).End(xlUp).Row 3 If WorksheetFunction.CountIfs(ws1.Range("G:G"), ws2.Range("G" & i).Value, ws1.Range("O:O"), ws2.Range("O" & i).Value) = 0 Then 4 ws2.Rows(i).Copy ws1.Range("A" & ws1.Rows.Count).End(xlUp).Offset(1) 5 Else 6 ws2.Rows(i).Copy ws3.Range("A" & ws3.Rows.Count).End(xlUp).Offset(1) 7 End If 8 Next

投稿2021/10/15 06:31

編集2021/10/15 23:50
jinoji

総合スコア4585

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

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

shhan0704

2021/10/15 09:12

ありがとうございます。 試してみたいと思います。結果をまたご報告します。
shhan0704

2021/10/20 09:03

ご親切にありがとうございました。無事うまく動作させることができました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問