2015-05-30 2 views
0

Есть ли способ в VBA найти дубликаты записей, когда встречаются критерии в 2 столбцах?Найти повторяющиеся записи, когда 2 критерия выполнены и отмечены ими

У меня есть два столбца данных. Первая колонка имеет даты и вторая сумма. Проблема состоит в том, чтобы найти и выделить все суммы, которые получили дублирующее количество и ту же дату в соответствующей колонке?

Мне до сих пор удалось найти код для выделения дубликатов по 1 критерию.

Вот код

Sub RemoveDuplicateAmounts() 
     Dim cel As Variant 
     Dim myrng As Range 

     Set myrng = Sheets("Sheet1").Range("D2:D" & Sheets("Sheet1").Range("D65536").End(xlUp).Row) 
     myrng.Interior.ColorIndex = xlNone 

     For Each cel In myrng 
     clr = 10 
     If Application.WorksheetFunction.CountIf(myrng, cel) > 1 Then 
      cel.Interior.ColorIndex = 26 
     clr = clr + 10 

     End If 
     Next 

     MsgBox ("All duplicates found and coloured") 

End Sub 
+2

Почему бы не удалить его с помощью меню Data | RemoveDuplicates? –

+2

Привет, мне нужно работать с этими дубликатами, чтобы их нельзя было удалить. Если это так, я бы выбрал два столбца и нажмите удалить дубликаты, и это все. – Tommeck37

+0

Можете ли вы добавить дополнительные столбцы? Если это так, можно связать даты и суммы и использовать функцию COUNTIF с условным форматированием. – ChipsLetten

ответ

3

Это попытка VBA в то же самое я дал формулу. Я не думаю, что это было необходимо, но OP мог учиться у него в любом случае. Ура!

Sub ertdfgcvb() 
Dim LastRow As Long, DatesCol As Long, AmountsCol As Long, a As Double, b As Double 
LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, Searchdirection:=xlPrevious).Row 
DatesCol = 4 'D column with dates 
AmountsCol = 5 'E column with amounts 
Columns(DatesCol).Interior.ColorIndex = xlNone 'dates lose color 
For i = 1 To LastRow 'for each row 
    If i <> 1 Then 'had some fun with row 0 error 
     a = Application.WorksheetFunction.SumIfs(_ 
        Range(Cells(1, DatesCol), Cells(i - 1, DatesCol)), _ 
        Range(Cells(1, DatesCol), Cells(i - 1, DatesCol)), _ 
        Cells(i, DatesCol), _ 
        Range(Cells(1, AmountsCol), Cells(i - 1, AmountsCol)), _ 
        Cells(i, AmountsCol)) 'counts the date values associated with recurrences before 
    Else 
     a = 0 'if it's first row I declared a zero, I don't know why 
    End If 

    If i <> LastRow Then 'yeah, last row stuff 
     b = Application.WorksheetFunction.SumIfs(_ 
        Range(Cells(i + 1, DatesCol), Cells(LastRow, DatesCol)), _ 
        Range(Cells(i + 1, DatesCol), Cells(LastRow, DatesCol)), _ 
        Cells(i, DatesCol), _ 
        Range(Cells(i + 1, AmountsCol), Cells(LastRow, AmountsCol)), _ 
        Cells(i, AmountsCol)) 'counts the date values associated with recurrences after 
    Else 
     b = 0 'if it's the last row, there are definitely none after 
    End If 

    If a <> 0 Or b <> 0 Then Cells(i, 4).Interior.ColorIndex = 26 'if either one of them isn't 0 then the date value gets a nice background color 
Next i 
End Sub 

С Countifs и некоторые оптимизации будет выглядеть следующим образом:

Sub ertdfgcvb() 
Dim LastRow As Long, DatesCol As Long, AmountsCol As Long 
LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, Searchdirection:=xlPrevious).Row 
DatesCol = 4 'D column with dates 
AmountsCol = 5 'E column with amounts 
Columns(DatesCol).Interior.ColorIndex = xlNone 'dates lose color 
For i = 1 To LastRow 'for each row 
If 1 < Application.WorksheetFunction.CountIfs(Range(Cells(1, DatesCol), Cells(LastRow, DatesCol)), _ 
        Cells(i, DatesCol), _ 
        Range(Cells(1, AmountsCol), Cells(LastRow, AmountsCol)), _ 
        Cells(i, AmountsCol)) _ 
        Then Cells(i, 4).Interior.ColorIndex = 26 ' 'counts the date values associated with occurrences if there's more than one then the date gets a nice background color 
Next i 
End Sub 
+1

Это шедевр, который я искал. Макро обрабатывает все данные за несколько секунд.весь результат - это то, что мне нужно, т. е. соответствие двух критериев, одинаковая сумма и одна и та же дата даты, соответствующая каждой сумме. Большое спасибо! Cheers – Tommeck37

+0

В этом случае, пожалуйста, отметьте его как правильно. – user3819867

+0

Привет @ user3819867 его действительно работает удивительно, мне интересно, как добавить больше критериев (3,4,5 ..) для того же. Не могли бы вы помочь мне в этом? – Linga

0
=SUMIFS($D$1:$D1,$D$1:$D1,$D2,$E$1:$E1,$E2)+SUMIFS($D3:$D$1048576,$D3:$D$1048576,$D2,$E3:$E$1048576,$E2) 

И для работы с VBA:

=SUMIFS(R1C4:R[-1]C4,R1C4:R[-1]C4,RC4,R1C5:R[-1]C5,RC5)+SUMIFS(R[1]C4:R1048576C4,R[1]C4:R1048576C4,RC4,R[1]C5:R1048576C5,RC5) 

Эти суммы D (предположительно даты) на основе D (даты) и E (суммы) как до, так и после данной строки. Измените C5 и C4 где необходимо, чтобы соответствовать вашему набору данных.

Чтобы добраться до истинных/ложных утверждений, которые я бы сказал, просто поставить 0<> перед:

=0<>SUMIFS(R1C4:R[-1]C4,R1C4:R[-1]C4,RC4,R1C5:R[-1]C5,RC5)+SUMIFS(R[1]C4:R1048576C4,R[1]C4:R1048576C4,RC4,R[1]C5:R1048576C5,RC5) 
+0

Плюс, чтобы быть разумным, я бы использовал 'Range (« D65536 »). End (xlUp) .Row' вместо константы' 1048576'. – user3819867

+0

Формула не подходит для меня. Я попытался ввести эту формулу для цикла For только в 1000 строк, и файл сломался. Недостаточно памяти для ее обработки. Кроме того, файл имеет около 15 000 строк, чтобы проверить, что это неприменимо. – Tommeck37

+0

Можно ли перевести формулу в функцию vba «Application.Sumif» ??? – Tommeck37

Смежные вопросы