Excel自定义VBA函数需求:依据A/B/C单元格生成D列结果
Excel自定义函数Group的VBA实现
需求说明
实现Excel自定义函数=Group(A#,B#,C#),用于生成D列结果,逻辑规则如下:
- 若A#单元格内所有逗号分隔的值都包含在C#中,D#返回B#的值 + C#中未出现在A#里的逗号分隔值;
- 若A#存在任意值未包含在C#中,D#直接返回C#的原始内容。
示例
- 行1:A1值为
Z002,Z003,Z004,Z006,Z007,B1值为Z200,C1值为Z002,Z003,Z004,Z005,Z006,Z007,Z008,D1结果为Z200,Z005,Z008; - 行2:A2值为
Z002,Z003,Z004,Z006,Z007,B2值为Z200,C2值为Z002,Z003,Z005,Z006,Z007,D2结果为Z002,Z003,Z005,Z006,Z007。
VBA实现代码
Function Group(valuesA As String, valuesB As String, valuesC As String) As String Dim arrA() As String Dim arrB() As String Dim arrC() As String Dim Unmatched As String Dim i As Integer, Found As Boolean ' 将逗号分隔的字符串拆分为数组,便于逐一对比 arrA = Split(valuesA, ",") arrB = Split(valuesB, ",") arrC = Split(valuesC, ",") ' 检查A中所有值是否都存在于C中 For i = LBound(arrA) To UBound(arrA) Found = False Dim j As Integer For j = LBound(arrC) To UBound(arrC) ' 去除前后空格,避免因空格导致匹配失败 If Trim(arrA(i)) = Trim(arrC(j)) Then Found = True Exit For End If Next j ' 只要有一个值不在C中,直接返回C的内容并结束函数 If Not Found Then Group = valuesC Exit Function End If Next i ' 若A完全包含于C,以B的值为基础构建结果 Unmatched = valuesB ' 筛选C中不在A里的值,追加到结果字符串 For i = LBound(arrC) To UBound(arrC) Found = False For j = LBound(arrA) To UBound(arrA) If Trim(arrC(i)) = Trim(arrA(j)) Then Found = True Exit For End If Next j If Not Found Then ' 处理结果字符串的逗号拼接逻辑 If Len(Unmatched) > 0 Then Unmatched = Unmatched & "," & arrC(i) Else Unmatched = arrC(i) End If End If Next i Group = Unmatched End Function
使用方法
- 打开Excel,按下
Alt + F11打开VBA编辑器; - 插入一个新模块(右键点击工作簿 -> 插入 -> 模块);
- 将上述代码粘贴到模块中;
- 返回Excel工作表,在D列单元格输入
=Group(A1,B1,C1),拖动填充柄即可批量应用。
内容的提问来源于stack exchange,提问作者mbart67
相关产品推荐
相关产品推荐

