Как игнорировать повторяющиеся значения при использовании concatenate, если в Excel? - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю в 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-18 И 06-Apr-18 две похожие записи объединяются. Я хочу, чтобы он отображался только один раз. У кого-нибудь есть идеи, что мне делать?

Заранее спасибо.

P.S. : Я не могу выполнить опцию удаления дубликатов, так как у меня много данных, связанных с этим !!

1 Ответ

0 голосов
/ 07 сентября 2018

Для этого вам нужно настроить функцию сцепления.

Я ввел параметр 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
...