You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:36:01