滚动计数

问题描述 投票:0回答:1

我有一个非常大的数据集〜100000行有2列,我想基于2个标准来计算滚动计数,基本上是col 1 wrt col 2中有多少次值。

数据集看起来像这样

我写了以下代码

这是部分数据集,实际有100000行,我想要答案在col c

enter image description here

  Sub test()
   Application.EnableEvents = False
   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual
   Dim id, data_week, ans,  a As Variant
   Dim p As Double

   a = 100000
   Debug.Print Now()


   id = Sheet1.Range("A2:A" & a).Value
   data_week = Sheet1.Range("B2:B" & a).Value
   ans = Sheet1.Range("c2:c" & a).Value

   For p = 1 To a

   ans(p, 1) = Application.WorksheetFunction.CountIfs(Sheet1.Range("A2:A" & p + 1), id(p, 1), 
   Sheet1.Range("b2:b" & p + 1), data_week(p, 1))

   Next p
   Sheet1.Range("c2:c" & a).Value = ans
   Debug.Print Now()
   Application.Calculation = xlCalculationAutomatic
  End Sub

这在VBA中花了很长时间,想知道是否有更快的方法来优化代码,感谢您的帮助。

excel vba countif
1个回答
0
投票

尝试,

Sub test3()
    Dim vDB, ans()
    Dim Ws As Worksheet
    Dim a As Long
    Dim i As Long, id, myDay

    Set Ws = Sheets(1)
    a = 100000
    Debug.Print Now()
    With Ws
        vDB = .Range("a2", .Range("b" & a))
        ReDim ans(1 To UBound(vDB, 1), 1 To 1)
        id = vDB(1, 1)
        myDay = vDB(1, 2)
        For i = 1 To UBound(vDB, 1)
            If vDB(i, 1) <> "" Then
                If id = vDB(i, 1) And myDay = vDB(i, 2) Then
                    n = n + 1
                    ans(i, 1) = n
                Else
                    id = vDB(i, 1)
                    myDay = vDB(i, 2)
                    ans(i, 1) = 1
                    n = 1
                End If
            End If
            DoEvents
        Next
        .Range("c2").Resize(UBound(ans)) = ans
    End With

    Debug.Print Now()


End Sub
© www.soinside.com 2019 - 2024. All rights reserved.