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

Excel 2007条件合并需求:按CODE分组整理CHECKED非OK数据

我来帮你搞定Excel 2007里的这个数据整理需求,因为2007没有后来版本的TEXTJOIN这类便捷函数,我给你两种可行方案——一种不用宏的数组公式法,另一种更高效的VBA自定义函数法,都能满足你的要求:

解决方案步骤

第一步:提取唯一的CODE值到输出列

先把所有不重复的CODE提取到F列,这样我们才能按CODE分组处理:

  1. 选中F2单元格
  2. 点击「数据」选项卡 →「高级」筛选
  3. 选择「将筛选结果复制到其他位置」
  4. 列表区域选择你的A列数据范围(比如$A$1:$A$13),条件区域留空,复制到选择$F$2
  5. 勾选「选择不重复的记录」,点击确定
    这样F列就会得到所有唯一的CODE值了。

方案一:不用宏的数组公式法(适合小数据量)

这个方法不用启用宏,直接用Excel内置函数,但数据量大时可能会有点卡顿:

生成不带USERID的合并列(G列)

在G2单元格输入以下公式,输入完成后按「Ctrl+Shift+Enter」确认(这是数组公式的要求):

=SUBSTITUTE(TRIM(CONCATENATE(IF(($A$2:$A$13=F2)*($D$2:$D$13<>"OK"),$B$2:$B$13&" ","")))," "," - ")

然后下拉填充到所有CODE对应的行。

生成带USERID的合并列(H列)

在H2单元格输入以下公式,同样按「Ctrl+Shift+Enter」确认:

=SUBSTITUTE(TRIM(CONCATENATE(IF(($A$2:$A$13=F2)*($D$2:$D$13<>"OK"),$B$2:$B$13&"("&$C$2:$C$13&") ","")))," "," - ")

下拉填充即可。

公式说明

  • ($A$2:$A$13=F2)*($D$2:$D$13<>"OK"):筛选出当前CODE下CHECKED不等于OK的行
  • IF(..., 内容&" ", ""):给符合条件的内容加空格,方便后续替换成分隔符
  • CONCATENATE:把所有符合条件的内容拼接成一个字符串
  • TRIM:去掉首尾多余的空格
  • SUBSTITUTE:把空格替换成你需要的「 - 」分隔符

方案二:VBA自定义函数法(适合大数据量,更高效)

如果你的数据有120个CODE,数组公式可能会变慢,推荐用这个方法,只需要简单写个自定义函数:

步骤1:添加自定义VBA函数

  1. 按「Alt+F11」打开VBA编辑器
  2. 右键点击你的工作簿名称 → 插入 → 模块
  3. 在模块里粘贴以下代码:
Function JoinIf(ByVal rngCode As Range, ByVal code As Variant, ByVal rngCheck As Range, ByVal checkValue As String, ByVal rngResult As Range, Optional ByVal withUserID As Range, Optional delimiter As String = " - ") As String
    Dim cell As Range
    Dim resultStr As String
    Dim i As Integer
    resultStr = ""
    
    For i = 1 To rngCode.Cells.Count
        If rngCode.Cells(i).Value = code And rngCheck.Cells(i).Value <> checkValue Then
            If Not withUserID Is Nothing Then
                resultStr = resultStr & rngResult.Cells(i).Value & "(" & withUserID.Cells(i).Value & ")" & delimiter
            Else
                resultStr = resultStr & rngResult.Cells(i).Value & delimiter
            End If
        End If
    Next i
    
    If Len(resultStr) > 0 Then
        JoinIf = Left(resultStr, Len(resultStr) - Len(delimiter))
    Else
        JoinIf = ""
    End If
End Function
  1. 关闭VBA编辑器,回到Excel

步骤2:使用自定义函数

  • 不带USERID的列(G2):输入公式后回车,下拉填充
=JoinIf($A$2:$A$13,F2,$D$2:$D$13,"OK",$B$2:$B$13)
  • 带USERID的列(H2):输入公式后回车,下拉填充
=JoinIf($A$2:$A$13,F2,$D$2:$D$13,"OK",$B$2:$B$13,$C$2:$C$13)

这个函数会自动遍历数据,按CODE筛选符合条件的记录,拼接成你需要的格式,处理120个CODE完全没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:25:09