Excel 2007条件合并需求:按CODE分组整理CHECKED非OK数据
我来帮你搞定Excel 2007里的这个数据整理需求,因为2007没有后来版本的TEXTJOIN这类便捷函数,我给你两种可行方案——一种不用宏的数组公式法,另一种更高效的VBA自定义函数法,都能满足你的要求:
解决方案步骤
第一步:提取唯一的CODE值到输出列
先把所有不重复的CODE提取到F列,这样我们才能按CODE分组处理:
- 选中F2单元格
- 点击「数据」选项卡 →「高级」筛选
- 选择「将筛选结果复制到其他位置」
- 列表区域选择你的A列数据范围(比如
$A$1:$A$13),条件区域留空,复制到选择$F$2 - 勾选「选择不重复的记录」,点击确定
这样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函数
- 按「Alt+F11」打开VBA编辑器
- 右键点击你的工作簿名称 → 插入 → 模块
- 在模块里粘贴以下代码:
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
- 关闭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
相关产品推荐
相关产品推荐

