求助:如何在Excel宏中实现带动态范围的COUNTIFS公式
Excel宏实现动态范围的COUNTIFS公式
先简化你的原公式
你当前的公式重复了多次$E$2:$E$97,J2,这是冗余的——COUNTIFS的所有条件是同时满足,所以E列等于J2只需要写一次即可,简化后逻辑不变:
=COUNTIFS($C$2:$C$97,"<>33",$C$2:$C$97,"<>55",$C$2:$C$97,"<>10",$C$2:$C$97,"<>76",$E$2:$E$97,J2)
方法1:用VBA宏实现动态范围
以下是直接可用的VBA代码,会自动识别C列最后一行有数据的位置,生成动态范围的公式:
Sub AddDynamicCountIFS() Dim lastRow As Long Dim ws As Worksheet Dim formulaText As String ' 替换成你的报表工作表名称,比如"销售报表" Set ws = ThisWorkbook.Worksheets("报表") ' 获取C列最后一行有数据的行号(自动适配新增数据) lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' 构建动态范围的公式 formulaText = "=COUNTIFS($C$2:$C$" & lastRow & ",""<>33""," & _ "$C$2:$C$" & lastRow & ",""<>55""," & _ "$C$2:$C$" & lastRow & ",""<>10""," & _ "$C$2:$C$" & lastRow & ",""<>76""," & _ "$E$2:$E$" & lastRow & ",J2)" ' 将公式写入目标单元格,比如K2,可自行修改 ws.Range("K2").Formula = formulaText End Sub
使用步骤:
- 打开你的Excel文件,按
Alt+F11打开VBA编辑器 - 右键左侧的工作簿名称,选择插入→模块
- 将上面的代码粘贴到模块窗口中
- 修改代码中的工作表名称(
"报表")和目标单元格("K2")为你实际需要的内容 - 回到Excel界面,按
Alt+F8,选择AddDynamicCountIFS,点击运行即可
方法2:无需VBA的动态范围方案(更简单)
如果不想用宏,可将数据转为Excel表格,实现自动动态范围:
- 选中你的数据区域(包含表头),按
Ctrl+T创建表格 - 假设表格名称为
Table1,C列表头为状态,E列表头为类别,公式可写成:
=COUNTIFS(Table1[状态],"<>33",Table1[状态],"<>55",Table1[状态],"<>10",Table1[状态],"<>76",Table1[类别],J2)
后续新增数据行时,表格会自动扩展范围,公式无需手动修改。
内容的提问来源于stack exchange,提问作者Josh Camacho
相关产品推荐
相关产品推荐

