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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:03