VBA(辞書による集計)


https://excel-ubara.com/excelvba4/EXCEL216.html
https://vba-create.jp/vba-dictionary-item-change/

 

-- 1. 開発タブの挿入でボタンを作成
ActiveXコントロールのものを使用する

-- 2. デザインモードONで作成したボタンをダブルクリックするとエディタが開くので下記コードを記載。デザインモードOFFで実行


※ 下記設定必要
Microsoft Scripting Runtime」の参照設定

Option Explicit

Private Sub CommandButton1_Click()

    
    
    'テストデータ作成
    Range("A1") = "プロジェクト名"
    Range("A2") = "PJ01"
    Range("A3") = "PJ02"
    Range("A4") = "PJ02"
    Range("A5") = "PJ03"
    Range("A6") = "PJ01"
    Range("A7") = "PJ01"
    Range("A8") = "PJ02"
    Range("A9") = "PJ01"
    Range("A10") = "PJ01"
    
    Range("B1") = "種別"
    Range("B2") = "TABLE"
    Range("B3") = "INDEX"
    Range("B4") = "VIEW"
    Range("B5") = "TABLE"
    Range("B6") = "TABLE"
    Range("B7") = "INDEX"
    Range("B8") = "VIEW"
    Range("B9") = "TABLE"
    Range("B10") = "TABLE"
    
    Range("C1") = "名前"
    Range("C2") = "T01"
    Range("C3") = "I01"
    Range("C4") = "V01"
    Range("C5") = "T02"
    Range("C6") = "T03"
    Range("C7") = "I02"
    Range("C8") = "V02"
    Range("C9") = "T06"
    Range("C10") = "T05"
    
    Dim myDic As New Dictionary
    Set myDic = Nothing
    
    
    Dim total As Long
    Dim i As Long
    Dim k As String
    
    
    With ThisWorkbook.Sheets("Sheet1")
        total = 0
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            k = .Cells(i, 1).Value & "." & .Cells(i, 2).Value
            If Not myDic.Exists(k) Then
                myDic.Add k, 1
            Else
                myDic(k) = myDic(k) + 1
            End If
            total = total + 1
        Next i
    End With
    
    
    Dim vKey As Variant
    Debug.Print "プロジェクト/種別毎の集計"
    For Each vKey In myDic
        Debug.Print vKey, myDic(vKey)
    Next
    
    'distinct プロジェクト名を取得
    Dim myDic2 As New Dictionary
    
    Set myDic2 = Nothing
    
    
    Dim myArr As Variant
    Dim pjmei As String
    
    
    For Each vKey In myDic
        myArr = Split(vKey, ".")
        pjmei = myArr(0)
        
        If Not myDic2.Exists(pjmei) Then
            myDic2.Add pjmei, myDic(vKey)
        Else
            myDic2(pjmei) = myDic2(pjmei) + myDic(vKey)
        End If
    Next
        
    Debug.Print "プロジェクト毎の集計"
    For Each vKey In myDic2
        Debug.Print vKey, myDic2(vKey)
    Next
    
    
    Debug.Print "TOTAL=" & total
    
    Dim vKey2 As Variant
    
    Dim syubetsu As String
    
    
    For Each vKey In myDic2
        Debug.Print "■" & vKey
        
        For Each vKey2 In myDic
            myArr = Split(vKey2, ".")
            pjmei = myArr(0)
            syubetsu = myArr(1)
            
            If pjmei = vKey Then
                Debug.Print syubetsu & " -> " & myDic(vKey2)
            End If
        Next
        Debug.Print ""
    Next

End Sub