Страницы: 1
RSS
Удаление дубликатов в таблице по условию
 
Доброго дня.
Бьюсь второй день с задачкой, никак не могу найти решения.
Есть таблица, которая есть консолидация данных из нескольких источников.
Нужно сделать проверку и удаление ненужных строк, чтобы оставалась 1 уникальная запись для каждого Id.
На примере таблице, для id1 должна остаться строка, где все заполнено. Для id2, та где есть ФИО. Для id3, аналогично id1.
 
Abrio,предложите в этой теме новое название для темы (согласно правилам), название будет похожее удалить дубликаты в таблице по условию
 
Да, согласен.
Так будет верно. Просьба переименовать тему на "Удаление дубликатов таблицы по условию".
 
Условие уникальности недоопределено.
Например,
id101,ok,,,fio101
id101,,ok,,fio101
которую оставляем?
Или если fio разные для одного id (rule незаполнены)?
 
Такие условия возможны, но не в данном случае.
Заполнение регламентировано. То что есть "человеческая ошибка" ее будут отдельно отслеживать, в коде не надо предусматривать.
Есть следующие типы строк:
1. Полностью заполнненая
2. Только id и ФИО
3. Только id
 
тут много лишнего (особенно в сортировке), но работает
Код
Sub zxc()
    Dim a, b As Integer
    
    For i = 2 To 8
        If Cells(i, 2) = "" And Cells(i, 3) = "" And Cells(i, 4) = "" And Cells(i, 5) = "" Then
         Rows(i).Delete
        End If
    Next
Range("A1:E1").AutoFilter
    ActiveWorkbook.Worksheets("Лист1").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист1").AutoFilter.Sort.SortFields.Add Key:=Range( _
        "A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Лист1").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
For i = 2 To 8
    If Cells(i + 1, 1) = Cells(i, 1) Then
        a = Len(Cells(i, 2) & Cells(i, 3) & Cells(i, 4) & Cells(i, 5))
        b = Len(Cells(i + 1, 2) & Cells(i + 1, 3) & Cells(i + 1, 4) & Cells(i + 1, 5))
        If a > b Then
        Rows(i + 1).Delete
        Else
        Rows(i).Delete
        End If
    End If
Next
End Sub
Изменено: Илья Демид - 23.08.2017 16:06:40
 
Уфф, с сортировкой скорее всего будут проблемы. Так как оригинальная таблица в разы больше и там разные размеры ячеек. Далее
Код
For i = 2 To 8        If Cells(i, 2) = "" And Cells(i, 3) = "" And Cells(i, 4) = "" And Cells(i, 5) = "" Then
         Rows(i).Delete
        End If
    Next
Это сработает, если с данным id, есть какие-то еще строки. Если же дубляжей нет, ее удалять не надо.
 
Цитата
Abrio написал:
ее удалять не надо.
т.е. если есть уникальный id но по нему пустые столбцы то его необходимо оставить?
Изменено: Илья Демид - 23.08.2017 16:18:09
 
Да, верно.
 
Код
Sub qq()
    Dim ar, aitems, arez
    Dim i&, j&
    ar = [a2:e8].Value
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(ar)
            If .exists(ar(i, 1)) Then
                If Len(ar(i, 5)) Then
                    If Len(ar(i, 2)) Then
                        If Split(.Item(ar(i, 1)), "|")(0) < 3 Then .Item(ar(i, 1)) = 3 & "|" & i
                    Else
                        If Split(.Item(ar(i, 1)), "|")(0) < 2 Then .Item(ar(i, 1)) = 2 & "|" & i
                    End If
                End If
            Else
                .Item(ar(i, 1)) = 1 + IIf(Len(ar(i, 2)), 2, 1) & "|" & i
            End If
        Next
        aitems = .items
        ReDim arez(1 To .Count, 1 To 5)
        For i = 1 To UBound(arez)
            For j = 1 To 5
                arez(i, j) = ar(Val(Split(aitems(i - 1), "|")(1)), j)
            Next
        Next
    End With
    [G2].Resize(UBound(arez), UBound(arez, 2)) = arez
End Sub
Изменено: RAN - 23.08.2017 16:59:10
 
Спасибо. Буду благодарен, если добавите описание к строчкам, так как не все понятно.
Чтобы можно было осознано применять.
Страницы: 1
Наверх