Excel VBA如何统计动态列表中同时满足B、C列多条件的条目数
现有代码错误与不足
- 语法错误:
b是数值型变量,不能用Set关键字赋值(Set仅用于对象赋值),且Column(1)写法有误,正确写法为Columns(1) - 逻辑错误:
i变量仅在满足判断条件时才自增,不满足条件时i永远不变,会陷入死循环;同时用For Each遍历范围和i计数完全冗余,逻辑脱节 - 溢出风险:
i、a声明为Integer类型,最大仅支持32767,数据量超过该值会直接报错,建议改为Long类型 - 效率极低:逐行读取单元格的操作在数据量过万时会非常卡顿
更高效的实现方案
无代码方案(优先推荐)
不需要写VBA,直接在H2单元格输入公式即可,自动适配每月动态变化的数据源:=COUNTIFS(B:B,"Open",C:C,"Chequing")
如果要统计Closed的Chequing账户,修改对应条件即可:=COUNTIFS(B:B,"Closed",C:C,"Chequing")
VBA方案(有自动化需求时使用)
方案1:调用工作表函数(代码最简洁,效率高)
Sub 统计账户数量() ' 统计Open状态Chequing账户写入H2 Range("H2") = Application.CountIfs(Columns("B"), "Open", Columns("C"), "Chequing") ' 统计Closed状态Chequing账户写入H3 Range("H3") = Application.CountIfs(Columns("B"), "Closed", Columns("C"), "Chequing") ' 其他统计项可按照上面格式自行添加 End Sub
方案2:数组遍历(适合后续有复杂扩展逻辑的场景,效率远高于逐行读单元格)
Sub 数组法统计账户() Dim lastRow As Long, dataArr As Variant, i As Long, openCnt As Long, closeCnt As Long lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' 一次性把B、C两列所有数据读入内存数组 dataArr = Range("B1:C" & lastRow).Value openCnt = 0 closeCnt = 0 ' 遍历数组统计 For i = 1 To UBound(dataArr) If dataArr(i, 2) = "Chequing" Then If dataArr(i, 1) = "Open" Then openCnt = openCnt + 1 ElseIf dataArr(i, 1) = "Closed" Then closeCnt = closeCnt + 1 End If End If Next ' 写入结果 Range("H2") = openCnt Range("H3") = closeCnt End Sub
内容的提问来源于stack exchange,提问作者Newbie123
相关产品推荐
相关产品推荐

