excel - 滚动计数
问题描述
我有一个非常大的数据集 ~ 100000 行有 2 列,我想根据 2 个标准计算滚动计数,基本上是 col 1 wrt col 2 的值的多少倍。
数据集看起来像这样
我写了以下代码
这是部分数据集,实际有 100000 行,我想要 col c 中的答案
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 中花费了很长时间,想知道是否有更快的方法来优化代码,感谢您的帮助。
解决方案
尝试。这需要 3 秒才能运行。
Sub test3()
Dim vDB, ans()
Dim Ws As Worksheet
Dim a As Long
Dim i As Long, id, myDay
Dim n As Integer
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)
n = 1
ans(i, 1) = n
End If
End If
DoEvents
Next
.Range("c2").Resize(UBound(ans)) = ans
End With
Debug.Print Now()
End Sub
推荐阅读
- python - 如何从 whl 文件安装 pip
- python - Python 在 for 循环期间冻结
- android - 本地通知处理方法调用失败
- sql-server - 是否有将列命名为特定名称的规则?
- testing - 在没有 UI 交互的情况下设置值。赛普拉斯应用程序操作
- php - 为什么 DOMDocument 会弄乱 unicode 不间断空格
- java - 即使我使用的是 Locale.US,点也会返回 MisMatch 异常
- r - 如何根据具有条件的两个列删除重复项?
- windows - 是否存在 ReadProcessMemory 失败的情况?
- ethereum - 检测 MetaMask 注销(以太坊)