Option Explicit
Public Sub CSV作成()
Dim MFile As String '商品.csv
Dim SFile As String '1.csv
Dim mb As Workbook '商品.csvのbook
Dim ms As Worksheet '商品.csvのSheet
Dim sb As Workbook '1.csvのbook
Dim ss As Worksheet '1.csvのSheet
Dim tb As Workbook '有り.csvのbook
Dim ts As Worksheet '有り.csvのSheet
Dim mrow As Long '商品.csv 行番号
Dim srow As Long '1.csv 行番号
Dim trow As Long: trow = 2 '有り.csv 行番号
Dim dicM As Object '商品.csv キー:商品コード 値:行番号
Dim dicS As Object '1.csv キー:商品コード 値:行番号
Dim key As Variant 'キー(商品コード)
Dim BPath As String 'デスクトップパス
Dim WSH As Variant
'デスクトップのパスを取得
Set WSH = CreateObject("WScript.Shell")
BPath = WSH.SpecialFolders("Desktop") & "\"
Set dicM = CreateObject("Scripting.Dictionary") ' Dictionaryの定義
Set dicS = CreateObject("Scripting.Dictionary") ' Dictionaryの定義
MFile = BPath & "商品.csv"
SFile = BPath & "1.csv"
'商品.csvをオープン
Workbooks.OpenText Filename:=MFile, DataType:=xlDelimited, comma:=True, textqualifier:=xlTextQualifierNone
Set mb = Workbooks.Item(Workbooks.count)
Set ms = mb.Worksheets(1)
'1.csvをオープン
Workbooks.OpenText Filename:=SFile, DataType:=xlDelimited, comma:=True, textqualifier:=xlTextQualifierNone
Set sb = Workbooks.Item(Workbooks.count)
Set ss = sb.Worksheets(1)
'有り.csv用bookをオープン
Set tb = Workbooks.Add
Set ts = tb.Worksheets(1)
'商品.csvの商品コードを記憶
For mrow = 2 To ms.Cells(Rows.count, 1).End(xlUp).Row
key = ms.Cells(mrow, "A").Value
dicM(key) = mrow
Next
'有り.csvへ見出しをコピー
ts.Cells(1, "A").Resize(1, 3).Value = ss.Cells(1, "A").Resize(1, 3).Value
'1.csvを処理する
For srow = 2 To ss.Cells(Rows.count, 1).End(xlUp).Row
key = ss.Cells(srow, "A").Value
'1.csvの商品コードが商品.csvに存在し
If dicM.exists(key) = True Then
'1.csv内で最初に出現した商品コードの場合
If dicS.exists(key) = False Then
'有り.csvへコピーする
ts.Cells(trow, "A").Resize(1, 3).Value = ss.Cells(srow, "A").Resize(1, 3).Value
'この商品コードを記憶する(次回は対象外とする為)
dicS(key) = srow
'有り.csvの行番号に1加算
trow = trow + 1
End If
End If
Next
'有り.csvを保存
Application.DisplayAlerts = False
tb.SaveAs BPath & "有り.csv", FileFormat:=xlCSV, CreateBackup:=False
Application.DisplayAlerts = True
'bookのクローズ
tb.Close
mb.Close
sb.Close
MsgBox ("完了")
End Sub