предложения для макроса, чтобы найти дубликаты в одном столбце - PullRequest
4 голосов
/ 27 февраля 2012

нашел много вопросов, связанных с поиском дубликатов в двух столбцах:

т.е. MS Excel, как создать макрос, чтобы найти дубликаты и выделить их? и Excel отмечают дубликаты значений

Однако я пытаюсь адаптировать код для поиска дубликатов в одном столбце.Например, вот набор данных:

Столбец 1

Foo
Bar
23
23
12
foo
Bar
Барт

Это то, что я сейчас использую:

Function warnDupes()

Dim lastRow As Long
Dim dict As Object

' Let Col be the column which warnDupes operates on.
Dim Col As String

Col = "A"

Set dict = CreateObject("scripting.dictionary")

lastRow = range(Col & Rows.Count).End(xlUp).Row

On Error Resume Next
For i = lastRow To 1 Step -1
    If dict.Exists(range(Col & i).value) = True Then

    'range("Y" & i).EntireRow.Delete

    MsgBox ("Hmm...Seems to be a duplicate of " & range(Col & i).value & _
    " in Cell " & Col & i)

End If
dict.Add range(Col & i).value, 1
Next

End Function

Пока у меня есть код, который выполняет 90% работы.23 и 23 совпадают.Бар и Бар подобраны.и т. д. Таким образом, код соответствует как Strings и Ints.Но я бы хотел, чтобы макрос мог совпадать с Foo и foo как с дубликатом.Как заставить Excel игнорировать регистр?

Этот вопрос ( Функция для обнаружения дубликатов в листе Excel ) кажется полезным, но у меня возникают проблемы с адаптацией кода или пониманием того, что сделал автор.Любые улучшения в коде, объяснения или предложения будут очень благодарны.

Спасибо.

ОБНОВЛЕНИЕ:

Только что заметил что-то действительно странное.

Данные:

IB6061
IC6071

совпадают, использую ли я свой макрос или инструмент условного форматирования в Excel.Есть причина почему?

Ответы [ 7 ]

6 голосов
/ 27 февраля 2012

Franklin

Почему не формула Excel?

Если значения указаны в столбце A, введите его в ячейку B1 и скопируйте вниз?

=IF(COUNTIF(A:A,A1)>1,"It is a duplicate","It is not a duplicate")

Это также будет работать для таких случаев, как "Foo" и "Foo"

Затем можно также использовать условное форматирование, используя приведенную выше формулу, чтобы выделить дубликаты?

Followup

Данные:

IB6061

IC6071

совпадают, использую ли я свой макрос или инструмент условного форматирования в Excel.

Есть причина почему?

Какую формулу вы используете?

Это работает для меня. Выделите Col A, а затем используйте эту формулу

=COUNTIF(A:A,A1)>1

См. Снимок

enter image description here Sid

3 голосов
/ 27 февраля 2012

В строках Exists () и .Add () задайте оба значения в одном и том же регистре:

If dict.Exists(UCase$(Range(Col & i).Value)) Then

и

dict.Add UCase$(Range(Col & i).Value), 1

Таким образом,дубликаты всегда будут добавляться в словарь в верхнем регистре, поэтому регистр никогда не будет иметь значения.

2 голосов
/ 27 февраля 2012

Это работает для меня

Excel 2007

Sub removeDuplicate(rg As Range, col as Integer)
    rg.RemoveDuplicates Columns:=col, Header:=xlYes
End Sub

Excel 2003

' Excel 2003
Option Explicit

Sub DeleteDups(range as String) 

    Dim x               As Long 
    Dim LastRow         As Long 

    ' Range "A65536" 
    LastRow = Range(range).End(xlUp).Row 
    For x = LastRow To 1 Step -1 
        If Application.WorksheetFunction.CountIf(Range("A1:A" & x), Range("A" & x).Text) > 1 Then 
            Range("A" & x).EntireRow.Delete 
        End If 
    Next x 

End Sub
2 голосов
/ 27 февраля 2012

Вы можете поместить все ключи в нижний регистр, например:

Dim myKey as String

For i = lastRow To 1 Step -1
    myKey = UCase(range(Col & i).value)
    If dict.Exists(myKey) = True Then

    'range("Y" & i).EntireRow.Delete

    MsgBox ("Hmm...Seems to be a duplicate of " & range(Col & i).value & _
    " in Cell " & Col & i)

    Else
        dict.Add myKey, 1
    End If
Next i
0 голосов
/ 24 августа 2016

Для функции, возвращающей логическое значение, попробуйте ...

Option Explicit
Public Function DUPLICATE_VALUE(rngMyRange As Range, rngMyCell As Range) As Boolean

If WorksheetFunction.CountIf(rngMyRange, rngMyCell.Value) > 1 Then
    DUPLICATE_VALUE = True
Else:
    DUPLICATE_VALUE = False
End If

End Function
0 голосов
/ 30 мая 2012

Основываясь на ответе Сиддхарта, если вы хотите выделить все экземпляры дубликатов, кроме первого (чтобы упростить выбор всех обнаруженных и исключить их), вы можете использовать эту модификацию его строки:

=IF(COUNTIF(A$1:A2,A2)>1,"D","S").

Для условного форматирования это будет похоже на

=COUNTIF(A$1:A2,A2)>1.

При этом проверяются только строки над текущей ячейкой, поэтому первый экземпляр дубликата не будет выделен (так как над ним не будет дубликатов).

0 голосов
/ 28 февраля 2012

Вы можете добавить

Option Compare Text

В ОЧЕНЬ ТОП модуля, теперь весь код этого модуля будет сравнивать текст без учета регистра.

CAT cat CaT cAt

... будет соответствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...