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

Excel中用VBA合并A列相同值行并分析列众值的技术求助

按A列合并行并取各列众值的高效VBA实现方案

嘿,刚好处理过类似的大数据量合并需求,给你一套稳定高效的VBA代码,完美解决你要的「按A列唯一值合并行、每列保留出现次数最多的众值」的需求,而且完全避开公式方案的性能瓶颈。

实现思路拆解

  1. 先抓唯一标识:把A列里的所有唯一值提出来,作为合并后每一行的主键
  2. 逐列统计众值:对每个唯一值对应的所有行,用字典统计每列中各个值的出现次数,实时跟踪出现次数最多的那个值(如果有多个众值,默认取第一个出现的)
  3. 安全输出结果:把合并后的结果写到新工作表里,绝对不会破坏你的原始数据

完整可运行的VBA代码

Sub MergeRowsByColumnA_Mode()
    Dim wsSource As Worksheet, wsResult As Worksheet
    Dim lastRow As Long, lastCol As Long, resultRow As Long
    Dim uniqueIDs As Collection, id As Variant
    Dim cellValue As Variant, col As Integer, row As Long
    Dim freqDict As Object, maxFreq As Integer, modeValue As Variant
    
    ' 可修改:指定源工作表,比如改成Sheets("原始数据")
    Set wsSource = ThisWorkbook.ActiveSheet
    ' 新建结果工作表,放在源表后面
    Set wsResult = ThisWorkbook.Sheets.Add(After:=wsSource)
    wsResult.Name = "合并结果"
    
    ' 获取源数据的边界(最后一行、最后一列)
    lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).row
    lastCol = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column
    
    ' 复制表头到结果表
    wsSource.Range(wsSource.Cells(1, 1), wsSource.Cells(1, lastCol)).Copy _
        wsResult.Cells(1, 1)
    resultRow = 2 ' 结果从第二行开始写入
    
    ' 提取A列的所有唯一值(用Collection去重)
    Set uniqueIDs = New Collection
    On Error Resume Next ' 忽略重复添加的报错
    For row = 2 To lastRow
        cellValue = wsSource.Cells(row, "A").Value
        If Not IsEmpty(cellValue) Then
            ' Key参数确保不重复添加
            uniqueIDs.Add cellValue, Key:=CStr(cellValue)
        End If
    Next row
    On Error GoTo 0 ' 恢复正常错误处理
    
    ' 逐个处理每个唯一ID
    For Each id In uniqueIDs
        ' 先写入A列的唯一标识
        wsResult.Cells(resultRow, "A").Value = id
        
        ' 遍历从B到最后一列,统计每列的众值
        For col = 2 To lastCol
            Set freqDict = CreateObject("Scripting.Dictionary")
            maxFreq = 0
            modeValue = ""
            
            ' 统计当前列中,该ID对应的所有值的出现次数
            For row = 2 To lastRow
                If wsSource.Cells(row, "A").Value = id Then
                    cellValue = wsSource.Cells(row, col).Value
                    If Not IsEmpty(cellValue) Then
                        ' 更新字典中的计数
                        If freqDict.Exists(cellValue) Then
                            freqDict(cellValue) = freqDict(cellValue) + 1
                        Else
                            freqDict(cellValue) = 1
                        End If
                        
                        ' 实时更新最大频率和对应的众值
                        If freqDict(cellValue) > maxFreq Then
                            maxFreq = freqDict(cellValue)
                            modeValue = cellValue
                        End If
                    End If
                End If
            Next row
            
            ' 把众值写入结果表
            wsResult.Cells(resultRow, col).Value = modeValue
            Set freqDict = Nothing ' 释放字典对象,避免内存泄漏
        Next col
        
        resultRow = resultRow + 1 ' 结果行下移一行
    Next id
    
    ' 自动调整结果表的列宽,方便查看
    wsResult.Columns.AutoFit
    
    MsgBox "合并完成!结果已存放在「" & wsResult.Name & "」工作表中", vbInformation
End Sub

关键细节说明

  1. 关于字典的启用:如果运行时提示字典相关错误,按Alt+F11打开VBA编辑器,依次点击「工具」→「引用」,勾选「Microsoft Scripting Runtime」即可解决
  2. 数据安全:所有操作都不会修改原始数据,结果直接输出到新工作表,放心用
  3. 众值逻辑:如果某列有多个值出现次数相同(并列众值),代码会取第一个出现的那个值,你可以根据需求修改这部分逻辑(比如改成拼接所有众值)
  4. 性能适配:用字典统计比循环计数高效得多,几万行数据也能快速处理,完全满足你大数据量的需求

使用步骤

  1. 打开你的Excel文件,按Alt+F11打开VBA编辑器
  2. 插入一个新模块(右键VBAProject→插入→模块)
  3. 把上面的代码粘贴进去
  4. 回到Excel,按Alt+F8选择MergeRowsByColumnA_Mode并执行

内容的提问来源于stack exchange,提问作者phantom234234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:32:01