使用VBA统计A列产品ID在P列出现次数并输出到C列的咨询
VBA统计产品ID对应客户出现次数实现方案
原有代码存在几个问题:
- 循环对象错误:原代码遍历P列,实际需求是遍历A列的每一个产品ID,统计该ID在P列的出现次数
- 行号获取逻辑错误:第一个表(A、B列)和第二个表(O、P列)行数可能不一致,不能共用同一个LastRow变量
- 语法疏漏:Cell变量未声明,会触发编译错误
- 缺失核心匹配统计逻辑
修正后可直接运行的完整代码如下:
Sub CountOccurrences() Dim ID As String Dim Result As Long ' Result存储对应ID在P列的出现次数 Dim tablerng As Range ' 第二个表的P列数据范围 Dim resultsrng As Range Dim LastRowA As Long ' 第一个表A列的最大有效行号 Dim LastRowP As Long ' 第二个表P列的最大有效行号 Dim Cell As Range ' 分别获取两列的最大有效行,避免两个表格行数不一致的问题 LastRowA = Cells(Rows.Count, "A").End(xlUp).Row LastRowP = Cells(Rows.Count, "P").End(xlUp).Row ' 定义P列的统计范围 Set tablerng = Range("P1:P" & LastRowP) ' 定义C列的结果输出范围 Set resultsrng = Range("C1:C" & LastRowA) ' 遍历A列每一个产品ID For Each Cell In Range("A1:A" & LastRowA) ID = Cell.Value ' 调用表格函数CountIf统计ID出现次数,效率高于自行遍历判断 Result = Application.WorksheetFunction.CountIf(tablerng, ID) ' 结果写入当前行对应的C列单元格 Cells(Cell.Row, "C").Value = Result Next Cell ' 释放对象内存 Set tablerng = Nothing Set resultsrng = Nothing End Sub
如果你实际需要统计的是O列的产品ID和A列ID匹配后对应的客户数,仅需要把代码中
Set tablerng = Range("P1:P" & LastRowP)修改为Set tablerng = Range("O1:O" & LastRowP)即可,两种统计逻辑按需选择。
内容的提问来源于stack exchange,提问作者Lysander2001
相关产品推荐
相关产品推荐

