EXCEL vba某列日期按月统计数量,并统计另外一列不重复数量

2025-02-06 08:58:14
推荐回答(3个)
回答1:

程序代码:

Option Explicit

Sub 宏1()
    Dim cnt, arr, i, mon, d_min, d_max
    Set cnt = CreateObject("Scripting.Dictionary")
    arr = Range("a1").CurrentRegion
    For i = 2 To UBound(arr)
        If arr(i, 3) < d_min Or IsEmpty(d_min) Then d_min = arr(i, 3)
        If arr(i, 3) > d_max Or IsEmpty(d_max) Then d_max = arr(i, 3)
        mon = Format(arr(i, 3), "yyyy年m月")
        If Not cnt.Exists(mon) Then cnt.Add mon, CreateObject("Scripting.Dictionary")
        cnt(mon)(arr(i, 2)) = cnt(mon)(arr(i, 2)) + 1
        If arr(i, 4) < 180 Then cnt(mon)("天") = cnt(mon)("天") + 1
    Next i
    ReDim arr(1 To 1000, 1 To 4)
    i = 1
    While d_min < d_max
        mon = Format(d_min, "yyyy年m月")
        arr(i, 1) = mon
        If cnt.Exists(mon) Then
            arr(i, 2) = cnt(mon).Count - 1
            arr(i, 3) = cnt(mon)("天")
            arr(i, 4) = arr(i, 3) / arr(i, 2)
        End If
        If Month(d_min) = 12 Then
            d_min = DateSerial(Year(d_min) + 1, 1, 1)
        Else
            d_min = DateSerial(Year(d_min), Month(d_min) + 1, 1)
        End If
        i = i + 1
    Wend
    i = i - 1
    Range("i2").Resize(i, 4) = arr
    Range("l2").Resize(i, 1).NumberFormatLocal = "0.00%"
End Sub

测试数据和结果:

回答2:

增加一个辅助列 然后数据透视表就高定了
实在无需大炮打蚊子 用到VBA ~~~

回答3:

用公式可以搞定的呀。