从 Excel 中包含逗号分隔值的两个单元格中提取公共值

Mat*_*Mat 2 excel vba

有没有一种简单的方法可以从两个以逗号分隔的数字单元格中提取共同的数字?

我有单元格,每个单元格中有 12 个逗号分隔的数字。(它们并不都是唯一的。有些数字可以重复两次。但不能超过两次。数字都是正数,并且只能是一位或两位数字)

我的数据是这样的:它们在A列中:

11,11,13,15,16,18,20,20,26,27,28,29
8,9,10,12,13,14,18,20,21,22,24,28
13,13,14,14,15,17,18,19,20,21,23,25
6,6,8,10,12,14,15,17,18,20,20,25
11,13,17,18,19,19,22,25,26,28,28,31
7,9,15,16,17,18,23,24,24,25,26,27
7,9,11,12,12,15,16,16,18,18,20,23
9,11,13,15,18,22,23,24,25,28,29,29
7,9,10,11,12,12,13,14,15,16,19,22
5,10,11,12,12,16,17,18,20,22,24,25
7,10,13,16,16,17,18,19,21,23,24,24
10,14,16,18,18,19,21,23,23,25,27,28
Run Code Online (Sandbox Code Playgroud)

我想要的结果是这样的:

在此输入图像描述

我需要一个不将值分成不同列的解决方案。感谢您的帮助。

由于在某些情况下数字可能会重复两次,因此我愿意接受这样的解决方案。

在此输入图像描述

Jvd*_*vdV 5

无需 VBA 即可实现:

在此输入图像描述

公式为B1

=TEXTJOIN(",",,UNIQUE(IF(ISNUMBER(FIND(","&FILTERXML("<t><s>"&SUBSTITUTE(A1,",","</s><s>")&"</s></t>","//s")&",",","&A2&",")),FILTERXML("<t><s>"&SUBSTITUTE(A1,",","</s><s>")&"</s></t>","//s"),"")))
Run Code Online (Sandbox Code Playgroud)

如果没有,UNIQUE您可以使用 XPATH 返回唯一值:

=TEXTJOIN(",",,IF(ISNUMBER(FIND(","&FILTERXML("<t><s>"&SUBSTITUTE(A1,",","</s><s>")&"</s></t>","//s[not(preceding::*=.)]")&",",","&A2&",")),FILTERXML("<t><s>"&SUBSTITUTE(A1,",","</s><s>")&"</s></t>","//s[not(preceding::*=.)]"),""))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您还需要通过以下方式确认CtrlShiftEnter


VBa*_*008 5

匹配子字符串

这是更简单的“重复”解决方案:

使用时Excel是这样的:

=comStr(A2,A3)
Run Code Online (Sandbox Code Playgroud)

将代码复制到标准模块中,例如Module1

代码

Option Explicit

Function comStr(String1 As String, _
                 String2 As String, _
                 Optional ByVal Delimiter As String = ",") _
         As String
         
    Dim Data1, Data2, Result(), i As Long, j As Long, l As Long
    Data1 = Split(String1, Delimiter)
    Data2 = Split(String2, Delimiter)
    For i = 0 To UBound(Data1)
        For j = 0 To UBound(Data2)
            If Data1(i) = Data2(j) Then GoSub writeResult: Exit For
        Next j
    Next i
                    
    comStr = Join(Result, Delimiter)

    Exit Function

writeResult:
    ReDim Preserve Result(l)
    Result(l) = Data1(i)
    l = l + 1
    Return

End Function
Run Code Online (Sandbox Code Playgroud)

编辑:

这是“完整”版本,您可以选择是否允许重复。

使用时Excel是这样的:

=comStr(A2,A3,TRUE)允许重复(如上面的版本)或 =comStr(A2,A3)=comStr(A2,A3,FALSE)不允许重复。

Function comStr(String1 As String, _
                 String2 As String, _
                 Optional allowDupes As Boolean = False, _
                 Optional ByVal Delimiter As String = ",") _
         As String
         
    Dim Data1, Data2, Result(), Curr, i As Long, j As Long, l As Long, n As Long
    Data1 = Split(String1, Delimiter)
    Data2 = Split(String2, Delimiter)
    For i = 0 To UBound(Data1)
        Curr = Data1(i)
        For j = 0 To UBound(Data2)
            If Data2(j) = Curr Then GoSub writeResult: Exit For
        Next j
    Next i
                    
    If l = 0 Then Exit Function
    comStr = Join(Result, Delimiter)

    Exit Function

writeResult:
    If Not allowDupes Then
        If l > 0 Then
            For n = 0 To l - 1
                If Result(n) = Curr Then Exit For
            Next
            If n <= l - 1 Then Return
        End If
    End If
    ReDim Preserve Result(l)
    Result(l) = Data1(i)
    l = l + 1
    Return

End Function
Run Code Online (Sandbox Code Playgroud)