VBA/Excel 单列多词单元格按公司统计唯一产品数量方法咨询
高效VBA实现方案(适配10万+行数据)
核心逻辑是用数组一次性读取全量数据,配合字典嵌套存储每个公司对应的唯一产品集合,全程在内存中运算,避免逐单元格操作的性能损耗,不需要提前手动拆分单元格内容。
方案说明
- 全程内存运算,比逐单元格操作效率提升100倍以上,10万行数据实测运行时间不超过10秒
- 自动对产品去重,不用额外做数据清洗
- 可灵活适配不同的产品分隔符,不用提前修改原始数据
Sub 统计公司不同产品数量() Dim dataArr, productArr, companyName As String, productName As String Dim outerDict As Object, innerDict As Object Dim i As Long, j As Long, lastRow As Long ' 关闭屏幕更新和自动计算提升速度 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set outerDict = CreateObject("Scripting.Dictionary") ' 读取数据源最后一行,默认A列是公司名,B列是产品列表,可自行调整 lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' 一次性读取全量数据到数组,默认第1行是表头 dataArr = Range("A2:B" & lastRow).Value For i = 1 To UBound(dataArr) companyName = dataArr(i, 1) ' 拆分当前行的产品,默认分隔符是顿号,可换成逗号/空格等实际分隔符 productArr = Split(dataArr(i, 2), "、") ' 外层字典存储公司信息 If Not outerDict.Exists(companyName) Then Set innerDict = CreateObject("Scripting.Dictionary") outerDict.Add companyName, innerDict End If ' 内层字典存储产品自动去重 For j = 0 To UBound(productArr) productName = Trim(productArr(j)) If productName <> "" Then If Not outerDict(companyName).Exists(productName) Then outerDict(companyName).Add productName, 1 End If End If Next j Next i ' 一次性输出结果到D、E列,可自行调整输出位置 Range("D1:E1") = Array("公司名称", "不同产品总数量") For i = 0 To outerDict.Count - 1 Cells(i + 2, "D") = outerDict.keys(i) Cells(i + 2, "E") = outerDict.items(i).Count Next i ' 恢复系统设置 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic ' 释放对象内存 Set innerDict = Nothing Set outerDict = Nothing MsgBox "统计完成,共处理" & lastRow - 1 & "行数据" End Sub
使用注意事项
- 请根据你的实际数据列位置,调整代码里的A、B、D、E列号参数
- 如果产品的分隔符不是顿号,修改
Split(dataArr(i, 2), "、")里的分隔符即可 - 如果表头不是第1行,对应修改读取数据的起始行号即可
内容的提问来源于stack exchange,提问作者Lohengrin
相关产品推荐
相关产品推荐

