在Excel中使用concatenateif时如何忽略重复值?

时间:2018-09-07 10:45:44

标签: excel vba excel-vba concatenation

我使用Microsoft Excel处理大量数据,尤其是制造日期(MFD)和批号。

日期可以有多个条目,条目的可能性类似或不同。例如

MFD             B.No.   
05-Apr-18   AD0418BB05    
05-Apr-18   AD0418BB05    
06-Apr-18   AD0418BB06    
06-Apr-18   AD0418BB06    
07-Apr-18   AA0418BB07    
07-Apr-18   BB0418BB07

我尝试使用公式将日期合并到另一列中,

=IFERROR(INDEX($A$2:$A$15, MATCH(0,COUNTIF($D$1:D1, $A$2:$A$15), 0)),"")

在下一列中,我使用了concatenateif公式来连接与每个日期相对应的值。代码如下,

=CONCATENATEIF($A$2:$A$15, D2, $B$2:$B$15, ",")

我得到的输出是

MFD         B.No.   
05-Apr-18   AD0418BB05,AD0418BB05    
06-Apr-18   AD0418BB06,AD0418BB06    
07-Apr-18   AA0418BB07,BB0418BB07

07-Apr-18上,它很棒。但是,在05-Apr-1806-Apr-18上,两个相似的条目被串联在一起。我希望只显示一次。有谁知道我该怎么办?

谢谢。

P.S。 :我无法执行删除重复项选项,因为我有许多与此相关的数据!

1 个答案:

答案 0 :(得分:2)

您需要为此调整连接功能。

我引入了AllowDuplicates参数来选择是否应将重复项串联起来。

因此,像=CONCATENATEIF($A$2:$A$15, D2, $B$2:$B$15, ",", FALSE)一样使用它,以防止重复。

Function ConcatenateIf(CriteriaRange As Range, _
                       Condition As Variant, _
                       ConcatenateRange As Range, _
                       Optional Separator As String = ",", _
                       Optional AllowDuplicates As Boolean = True) As Variant

    Dim strResult As String
    On Error GoTo ErrHandler
    If CriteriaRange.Count <> ConcatenateRange.Count Then
        ConcatenateIf = CVErr(xlErrRef)
        Exit Function
    End If

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim i As Long
    For i = 1 To CriteriaRange.Count
        If CriteriaRange.Cells(i).Value = Condition Then
            If AllowDuplicates Then
                strResult = strResult & Separator & ConcatenateRange.Cells(i).Value
            Else
                If Not dict.Exists(ConcatenateRange.Cells(i).Value) Then
                    dict.Add ConcatenateRange.Cells(i).Value, 0
                    strResult = strResult & Separator & ConcatenateRange.Cells(i).Value
                End If
            End If
        End If
    Next i

    If strResult <> "" Then
        strResult = Mid(strResult, Len(Separator) + 1)
    End If

    ConcatenateIf = strResult
    Exit Function
ErrHandler:
    ConcatenateIf = CVErr(xlErrValue)
End Function