程序代码:
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
测试数据和结果:
增加一个辅助列 然后数据透视表就高定了
实在无需大炮打蚊子 用到VBA ~~~
用公式可以搞定的呀。