Сравнить и объединить дубликаты значений в Excel с помощью VBA - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть отчет в формате Excel, который имеет поле номера дела в отношениях один ко многим с другими полями.Например: если дело обрабатывается несколькими командами, для каждой команды есть отдельные записи.

Я пытаюсь удалить дубликаты, объединяя значения строк, сравнивая номер дела.

Дело № Тип команды Название Страна

111 aa xx Название страны

111 бб гг Название страны

Я хочу выводбыть:

Дело № Тип Команда Имя Страна

111 aa, bb xx, yy Название страны

У меня есть код VBA ниже:

Sub mergeCaseNumberValues()
Dim lngRow As Long
With ActiveSheet
    Dim columnToMatch As Integer: columnToMatch = 1

    lngRow = .Cells(65536, columnToMatch).End(xlUp).Row
    .Cells(columnToMatch).CurrentRegion.Sort key1:=.Cells(columnToMatch), Header:=xlYes
    Do
        If .Cells(lngRow, columnToMatch) = .Cells(lngRow - 1, columnToMatch) Then

            For i = 2 To 12
            .Cells(lngRow - 1, i).Value = .Cells(lngRow, i).Value & .Cells(lngRow - 1, i).Value

            Next i
            .Rows(lngRow).Delete
        End If
        lngRow = lngRow - 1
    Loop Until lngRow = 1
End With
End Sub

Это дает мне:

Дело № Тип Название команды Страна

111 aabb xxyy NameName countrycountry

В данных только команда и тип отличаются для каждой записи, остальные значения одинаковы.Как мне изменить мой VBA, чтобы получить результат?Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 06 февраля 2019

Я думаю, вам нужно изменить это:

        For i = 2 To 12
        .Cells(lngRow - 1, i).Value = .Cells(lngRow, i).Value & .Cells(lngRow - 1, i).Value

на это:

        For i = 2 To 12
        .Cells(lngRow - 1, i).Value = .Cells(lngRow, i).Value & ", " & .Cells(lngRow - 1, i).Value

Вам нужно исправить конкатенацию, чтобы вставить запятую.

ДляВаша проблема с повторением, я думаю, что-то подобное может сработать.Имейте в виду, что это «воздушный код», полностью непроверенный, но он должен направить вас в правильном направлении:

        For i = 2 To 12
          If .Cells(lngRow, i).Value <> .Cells(lngRow - 1, i).Value Then
            .Cells(lngRow - 1, i).Value = .Cells(lngRow, i).Value & ", " & .Cells(lngRow - 1, i).Value
          Else 
            .Cells(lngRow - 1, i).Value = .Cells(lngRow, i).Value
          End If

По сути, вы хотите сравнить значения, используя оператор IF, и если они равны, то выне хочу брать их обоих.

...