2016-07-29 4 views
0

В настоящее время я запускаю макрос, который идентифицирует дубликаты в рабочей книге, однако он идентифицирует первый набор индекса и не помещает первый набор, а затем, что привело к тому, что я установил оператор if чтобы передать это, что добавляет дубликат к первому экземпляру тоже. Это занимает много времени, чтобы сделать, однако, и хотел бы улучшить это, если это возможно. Любые предложения были бы очень признательны, я новичок в VBA, но изучал биты, поскольку я столкнулся с новыми проблемами!Усовершенствования цикла VBA-IF

'Declaring the lastRow variable as Long to store the last row value in the Column1 
Dim lastRow As Long 
'matchFoundIndex is to store the match index values of the given value 
Dim matchFoundIndex As Long 
'iCntr is to loop through all the records in the column 1 using For loop 
    Dim iCntr As Long 
    Dim first_dup As Long 
    Dim tagging As Long 
    Dim item_code As String 

'Finding the last row in the Column 1 
    lastRow = Range("B1000000").End(xlUp).Row 
' 
'looping through the column1 
    For iCntr = 2 To lastRow 

     'checking if the cell is having any item, skipping if it is blank. 
     If Cells(iCntr, 1) <> "" Then 
      'getting match index number for the value of the cell 

      matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0) 

      'if the match index is not equals to current row number, then it is a duplicate value 
      If iCntr <> matchFoundIndex Then 

       'Printing the label in the column B 
       Cells(iCntr, 4) = "Duplicate" 

      End If 
     End If 
    Next 


    For first_dup = 2 To lastRow 
     If Cells(first_dup, 5) = "Duplicate" Then 
      item_code = Cells(first_dup, 1) 
      For tagging = 2 To lastRow 
       If Cells(tagging, 1) = item_code Then 
        Cells(tagging, 5) = "Duplicate" 
       End If 
      Next 
     End If 
    Next 

Example data: 
item code 
1 
2 
3 
4 
1 duplicate 
2 duplicate 
3 duplicate 
4 duplicate 
1 duplicate 
2 duplicate 
3 duplicate 
4 duplicate 
+0

Итерирование по диапазону. Помочь будет массив массивов вместо использования отдельного диапазона/ячейки. Вы также можете получить тот же результат, используя формулу '= IF (MATCH ($ A2, $ A: $ A, 0) <> ROW ($ A2)," Duplicate "," ")'. –

ответ

0

Мое первое предложение не переусердствовать усложнять, попробуйте использовать повторяющиеся значения условного форматирования, чтобы увидеть, если это помогает:

enter image description here

В противном случае, если вы отчаялись найти ТОЛЬКО дубликаты, а не первое вхождение, вы можете использовать такую ​​формулу: (В ячейке B2, если ваши данные начинаются с A2, для нее потребуется строка заголовка, которая не соответствует, или ваша первая строка всегда будет соответствовать)

=IF(COUNTIF($A1:A$1,A2)>=1,"Duplicate","") 

Который при вставке вниз вашу строку данных может выглядеть следующим образом:

enter image description here

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

Edit: вы можете просто вставить приведенную выше формулу с помощью VBA, с нотации R1C1, например .:

Sub test() 
    Range("B2:B" & Range("A1").End(xlDown).Row).FormulaR1C1 = "=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")" 
End Sub 

Я разобью это вниз, так что вы знаете, что происходит.

Range("B2:B" & Range("A1").End(xlDown).Row) выбирает ячейки в столбце B между B2 и последней заполненной строкой в ​​колонке А, т.е. Range("A1").End(xlDown).Row (так что это не будет работать, если вы ожидаете заготовки в колонке А как часть ваших данных)

Затем его устанавливает формулу R1C1 ref для "=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")", где R1C1 означает первый ряд, первый столбец (т.е. $A$1) R[-1]C1 означает предыдущую строку, первую колонку. Например, Если вы находитесь в B5, это будет выбирать A4. Если вы находитесь в A2, это будет выбирать A1. Если вы находитесь в A1, это будет ошибкой, потому что вы не можете быть в строке раньше 1. И RC1 означает текущую строку, первый столбец.

Надеюсь, это поможет!

+0

Привет, Андрей, я отчаянно хочу найти все дубликаты, но нужно отметить всех их «дублирующимся» тегом, так как я делаю дальнейшую обработку, чтобы увидеть, в каких категориях лежат дубликаты. Это должно быть решение vba, как я выиграл Фактически, это будет продолжаться, а другие не будут знать, как найти дубликаты. Спасибо за ваши предложения по excel в первую очередь! Ged – Hinchy16

+0

Извините за задержку, см. Мои правки. –

+0

Привет, Эндрю, я просто попробовал свое предложение, хотя граф действительно занимает много времени, я думаю, что он будет работать лучше, чем циклы, которые я делал ранее. Я изначально разработал цикл, поскольку ничто не помечено всеми дубликатами, которые мне нужны. Я использую это далее по строке, чтобы найти, какие списки элементов перекрываются друг с другом. Спасибо за ваше предложение! – Hinchy16

0

Ответ был таким же, как и исходный код, который я представил, он занимает примерно 5 минут для 30000 предметов, поэтому не так уж плохо, что он делает.

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