Excel: объединение строк на основе повторяющихся ключей

У меня две колонки
ключ и стоимостью
(стандартная карта)

дублированные ключи. Это тривиально, чтобы удалить дубликаты ключей (а именно кнопку удалить дубликаты). Но это удалит некоторые полезные данные в столбце Значение (или, альтернативно, испортит пары).

что действительно следует сделать, так это консолидировать данные таким образом, чтобы значения были объединены на основе повторяющихся ключей. Идеально это было бы сделано с a особое форматирование в виду, но это менее важно.

Это кажется относительно простым для числовых значений, но в меньшей степени для текстовых требований.

Е. Г. http://www.extendoffice.com/documents/excel/1268-excel-combine-duplicate-rows-and-sum.html

Я надеялся, что суммирование будет эквивалентно конкатенации;но, увы, это не так.

19
задан Stumbler
16.02.2023 6:17 Количество просмотров материала 3307
Распечатать страницу

2 ответа

I think это звучит как аналогичный вопрос Я только что ответил VBA. Для вашего решения, вы бы скопировать Key столбец, удалить дубликаты, а затем использовать формулу для вызова UDF, который возвращает строку значений, разделенных запятыми.

вот окончательный результат из этого вопроса:

Screenshot 1

и вот код:

Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String

    Dim s As String 'Results placeholder
    Dim sTmp As String  'Cell value placeholder
    Dim r As Long   'Row
    Dim c As Long   'Column
    Const strDelimiter = "|||"  'Makes InStr more robust

    s = strDelimiter
    For r = 1 To lookupRange.Rows.Count
        For c = 1 To lookupRange.Columns.Count
            If lookupRange.Cells(r, c).Value = lookupValue Then
                'I know it's weird to use offset but it works even if the two ranges
                'are of different sizes and it's the same way that SUMIF works
                sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
                If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
                    s = s & sTmp & strDelimiter
                End If
            End If
        Next
    Next

    'Now make it look like CSV
    s = Replace(s, strDelimiter, ",")
    If Left(s, 1) = "," Then s = Mid(s, 2)
    If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)

    LookupCSVResults = s 'Return the function

End Function

показать пример, вот формула показана в ячейке E1:

=LookupCSVResults(D1,B1:B7,A1:A7)

и вот CSV версия данных в диапазоне A1:D7:

Адам,Красный,Красный

Адам, Зеленый,, Зеленый

Адам,Синий, Синий

Боб, Красный, Желтый

Боб, Желтый,,

Боб,Зеленый,,

Карл,Красный,,

3
отвечен Engineer Toast 2023-02-17 14:05

Я искал весь интернет для этого. Я изменил эту строку:

If lookupRange.Cells(r, c).Value = lookupValue Then

к этому, так что частичное совпадение строк работает:

If InStr(1, lookupRange.Cells(r, c).Value, lookupValue) Then
0
отвечен littlemo 2023-02-17 16:22

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх