hiko-blog

VBA業務改善

MENU

抽出と取りまとめ

Sub 抽出と取りまとめ()
    Dim ws原本 As Worksheet
    Dim ws結果 As Worksheet
    Dim dict As Object
    Dim lastRow As Long
    Dim i As Long
    Dim key As Variant
    
    ' シートの設定
    Set ws原本 = ThisWorkbook.Sheets("Sheet1") ' オリジナルデータがあるシート名
    Set ws結果 = ThisWorkbook.Sheets("Sheet2") ' 結果をまとめるシート名
    
    ' 辞書の初期化
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 最終行を取得
    lastRow = ws原本.Cells(ws原本.Rows.Count, "A").End(xlUp).Row
    
    ' データを辞書に格納
    For i = 2 To lastRow ' ヘッダーがある場合は1からではなく2から始める
        key = ws原本.Cells(i, 1).Value & "_" & ws原本.Cells(i, 2).Value
        If Not dict.Exists(key) Then
            dict.Add key, Array(ws原本.Cells(i, 3).Value, ws原本.Cells(i, 4).Value) ' 日付と単価を配列に格納
        Else
            ' 日付がより新しい場合、単価を更新
            If ws原本.Cells(i, 3).Value > dict(key)(0) Then
                        
            ' 日付の比較を正確に行うために、Date型に変換する
            ' If CDate(ws原本.Cells(i, 3).Value) > CDate(dict(key)(0)) Then
            
                dict(key) = Array(ws原本.Cells(i, 3).Value, ws原本.Cells(i, 4).Value)
            End If
        End If
    Next i
    
    ' 結果を書き込む
    ws結果.Cells.Clear
    ws結果.Range("A1").Value = "項目1"
    ws結果.Range("B1").Value = "項目2"
    ws結果.Range("C1").Value = "最新日付"
    ws結果.Range("D1").Value = "最新単価"
    
    i = 2
    For Each key In dict.keys
        ws結果.Cells(i, 1).Value = Split(key, "_")(0)
        ws結果.Cells(i, 2).Value = "'" & Split(key, "_")(1)
        ws結果.Cells(i, 2).Value = Split(key, "_")(1)
        ws結果.Cells(i, 3).Value = dict(key)(0)
        ws結果.Cells(i, 4).Value = dict(key)(1)
        i = i + 1
    Next key
End Sub