2016-03-14 3 views
0

Excel Example as I can't post picturesVBA Excel - Как удалить дубликаты на основе в двух колонках

Я загрузил образ первенствует с некоторыми примерами. Что мне нужно:

  • Ряды 3 и 4 повторяются, но строка 4 имеет данные в колонке «Dir». В этом случае удалите оба значения
  • Строки 12 и 13 дублируются и данные не отображаются в столбце «Dir». В этом случае оставить только одну строку

Я использовал условное форматирование, чтобы выделить дубликаты и использовать «IF» «Countif» .... но не повезло и не знаю, как это сделать.

+1

Aaaaand что вы пробовали до сих пор? – m02ph3u5

+0

Это может помочь: http://stackoverflow.com/help/how-to-ask – newguy

+0

У меня просто «ActiveSheet.Range» («A1: C» и K) .RemoveDuplicates Столбцы: = 1, Заголовок: = xlYes 'K представляет собой строку –

ответ

0

Для подхода, основанного на формуле (с хелперов столбцов, вы можете сделать ниже:

  1. формула D2: =COUNTIFS($A$1:$A2,A2) формула
  2. E2: =COUNTIFS($A$2:$A$33,A2,$C$2:$C$33,"LD")
  3. F2 формула: =IF(AND(COUNTIF($A$2:$A$21,A2)=1,E2=1),"Keep",IF(OR(AND(D2>0,E2>0),AND(D2>1,E2=0)),"Remove","Keep"))

Перетащите, а затем отфильтруйте «Удалить» и удалите видимые ячейки.

enter image description here

+0

Это сработало. Большое спасибо Скотту. Уже пробовал некоторые из формул, но не повезло. Твоя работа великолепна. –

0

Если вы хотите вариант VBA, то этот код будет сделать это:

Option Explicit 

Sub DeleteDupes() 

    Dim workingRow As Long 
    Dim workingItem As String 
    Dim i As Long 
    Dim occurances As Variant 

    'Skip past header row 
    workingRow = 1 

    Do Until Range("A" & workingRow + 1).value = "" 

     workingRow = workingRow + 1 
     workingItem = Range("A" & workingRow).value 

     If Len(Range("C" & workingRow)) = 0 Then 

      occurances = FncGetOccurances(workingRow, workingItem) 

      If IsArray(occurances) Then 

       FncDeleteRange (occurances) 
       workingRow = workingRow - UBound(occurances) 

      End If 

     End If 

    Loop 

End Sub 

Private Function FncDeleteRange(value As Variant) 

    Dim deleteRange As Range 
    Dim i As Long 

    For i = 1 To UBound(value) 

      If i = 1 Then 

       Set deleteRange = Range("A" & value(i), "C" & value(i)) 
       deleteRange.Select 

      Else 

       Union(deleteRange, Range("A" & value(i), "C" & value(i))).Select 

      End If 
    Next i 

    Selection.Delete Shift:=xlUp 

End Function 

Private Function FncGetOccurances(masterIndex As Long, value As String) As Variant 

    Dim rowsToReturn As Variant 
    Dim i As Long 
    Dim currentCell As Long 
    Dim itemCount As Long 

    i = 1 

    Do While Range("A" & i + 1).value <> "" 

     i = i + 1 
     currentCell = Range("A" & i).value 

     If currentCell = value And _ 
      i <> masterIndex And _ 
      Len(Range("C" & i)) <> 0 Then 

      itemCount = itemCount + 1 

      If itemCount = 1 Then 

       ReDim rowsToReturn(itemCount) 

      Else 

       ReDim Preserve rowsToReturn(itemCount) 

      End If 

      rowsToReturn(itemCount) = i 

     End If 

    Loop 

    FncGetOccurances = rowsToReturn 

End Function 
+0

Спасибо Дэви, но когда я запускаю макрос, он выдает ошибку «currentCell = Range (« A »& i) .value» –

+0

Какая ошибка? Вы просто говорите мне, что линия не удалась? У вас есть заголовки в листе Excel? Каково значение Range («A» & i) .value, когда он терпит неудачу (в «Immediate Windows» тип DEBUG.PRINT RANGE («A» & i) .VALUE –

+0

Ошибка «Ошибка времени выполнения» 6 ': Overflow ", и когда я его отлаживаю, он указывает мне на строку выше. У нее есть заголовки. –

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