Есть ли способ проверить наличие дублирующихся значений в Excel БЕЗ использования функции CountIf? - PullRequest
5 голосов
/ 09 марта 2012

Многие решения здесь на SO включают использование CountIf для поиска дубликатов.Однако, когда у меня есть список из 100 000+ значений, для поиска дубликатов CountIf часто требуются минуты.

Существует ли более быстрый способ поиска дубликатов в столбце Excel БЕЗ используя CountIf?

Спасибо!

РЕДАКТИРОВАТЬ # 1:
После прочтения комментариев и ответов я понимаю, что мне нужно углубиться в детали.Давайте представим, что я наблюдатель за птицами, и после того, как я вернусь из поездки для наблюдения за птицами, я внесу от 1 до 25 или 50 новых птиц, которых я видел во время этой поездки, в свой «Основной список увиденных птиц».Это действительно динамически растущий список, и при каждом добавлении я хочу убедиться, что я не дублирую то, что уже существует в моем списке.

Итак, в столбце А моего файла указаны имена птиц.,Столбец BM может содержать другие атрибуты птиц.Я хочу знать, есть ли птица, которую я только что добавил в столбец A после моего последнего наблюдения за птицами, УЖЕ существует где-то еще в моем списке.И, если это произойдет, я бы вручную объединил данные из двух записей и выбросил некоторые, а некоторые оставил после тщательного анализа.Я явно не хочу иметь дубликаты записей одной и той же птицы в моей базе данных.

Итак, в конечном итоге я хочу получить какое-то указание на то, что дубликат есть или нет где-то еще, и если есть дубликат, скажите, пожалуйста, в какой строке искать (или выделите или закрасьте оба дубликата).

Ответы [ 8 ]

10 голосов
/ 09 марта 2012

Самый быстрый способ, который я знаю (если вы используете Excel 2007/2010/2011), это использовать Данные (на ленте) |Удалите дубликаты , чтобы найти общее количество дубликатов, ИЛИ удалите дубликаты.Возможно, вы захотите переместить данные на временную таблицу перед тестированием.

2-й самый быстрый способ - использовать Countif.Теперь Countif можно использовать для поиска дубликатов.Вот два основных способа.

1) Вставка нового столбца рядом с данными, размещение формулы и простое копирование.

2) Использование Countif в условном форматировании для выделения ячеек, которыедубликаты.Для получения более подробной информации, пожалуйста, перейдите по этой ссылке.

предложения для макроса для поиска дубликатов в ОДНОМ столбце

РЕДАКТИРОВАНИЕ:

Мои извинения:)

Countif - 3-й самый быстрый способ!

2-й самый быстрый способ - это использование сводных таблиц;)

Какова ваша главная цель нахождениядубликаты?Вы хотите удалить их?Или вы хотите выделить их?Или что-то еще?

FOLLOWUP

Похоже, я сделал опечатку в формуле.Да, для большого количества строк CountIf занимает минуты, как вы и предлагали.

Дайте мне посмотреть, смогу ли я придумать код VBA, соответствующий вашим точным потребностям.

Sid

9 голосов
/ 09 марта 2012

Вы можете использовать VBA - следующая функция возвращает список уникальных записей в списке 100 000 менее чем за секунду.Использование: выберите диапазон, введите формулу (= getUniqueListFromRange (YourRange)) и подтвердите нажатием CTRL + SHIFT + ENTER.

Public Function getUniqueListFromRange(parRange As Range) As Variant
' Returns a (1 to n,1 to 1) array with all the values without duplicates

  Dim i As Long
  Dim j As Long
  Dim locKey As Variant
  Dim locData As Variant
  Dim locUniqueDict As Variant
  Dim locUniqueList As Variant

  On Error GoTo error_handler
  locData = Intersect(parRange.Parent.UsedRange, parRange)

  Set locUniqueDict = CreateObject("Scripting.Dictionary")

  On Error Resume Next
  For i = 1 To UBound(locData, 1)
    For j = 1 To UBound(locData, 2)
      locKey = UCase(locData(i, j))
      If locKey <> "" Then locUniqueDict.Add locKey, locData(i, j)
    Next j
  Next i

  If locUniqueDict.Count > 0 Then
    ReDim locUniqueList(1 To locUniqueDict.Count, 1 To 1) As Variant
    i = 1
    For Each locKey In locUniqueDict
      locUniqueList(i, 1) = locUniqueDict(locKey)
      i = i + 1
    Next
    getUniqueListFromRange = locUniqueList
  End If

error_handler:         'Empty range

End Function
4 голосов
/ 10 марта 2012

Если вы используете Excel 2007 или более позднюю версию (что вероятно из 100 000+ значений), вы можете выбрать:

Домашняя вкладка | Условное форматирование> Выделить правила ячеек> Дублирующиеся значения ...

Щелкните правой кнопкой мыши по выделенной ячейке и отфильтруйте по выбранному цвету ячейки, чтобы показать только дубликаты (учтите, однако, что это может быть медленным с условным форматированием).

Либо запустите этот код и отфильтруйте по цветным ячейкам, что занимает 10000 ячеек за секунду:

Sub HighlightDupes()

Dim i As Long, dic As Variant, v As Variant

Application.ScreenUpdating = False
Set dic = CreateObject("Scripting.Dictionary")

i = 1
For Each v In Selection.Value2
    If dic.exists(v) Then dic(v) = "" Else dic.Add v, i
    i = i + 1
Next v

Selection.Font.Color = 255
For Each v In dic
    If dic(v) <> "" Then Selection(dic(v)).Font.Color = 0
Next v

End Sub

Добавление

Чтобы выбрать только повторяющиеся значения без кода или формул, я нашел этот метод полезным:

Вкладка данных | Расширенный фильтр ... Фильтр на месте, только уникальные записи, ОК.

Теперь выберите диапазон уникальных значений и нажмите Alt +; (Goto Special ... Только видимые ячейки). С этим выбором очистите фильтр, и вы увидите, что все невыбранные ячейки являются дубликатами, затем вы можете нажать Ctrl + 9 (Hide Rows), чтобы показать только дубликаты. Эти строки могут быть скопированы на другой лист, если это необходимо, или помечены знаком «X».

2 голосов
/ 11 июля 2013

Я удивлен, что никто не упомянул метод RemoveDuplicates.

ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1

Это просто удалит все дубликаты записей на активном листе в столбце A. Для запуска требуется миллисекунды (протестировано с 200k строк).Имейте в виду, это будет строго удалить все дубликаты записей.Хотя первоначальный вопрос был сформулирован не так, я считаю, что это по-прежнему служит вашей цели.

2 голосов
/ 10 марта 2012

Предотвращение дубликатов с проверкой данных
Вы можете использовать проверку данных, чтобы запретить ввод повторяющихся названий птиц. См. Сайт Дебры Далгелиш здесь

Обработка существующих дубликатов
Мой бесплатный Duplicate Master addin позволит вам

  • Выбрать
  • Цвет
  • Список
  • Удалить

дубликатов.

Но что более важно, это позволит вам выполнить более сложное сопоставление, чем точные строки, например

  • Поиск без учета регистра / с учетом регистра (пример ниже)
  • Обрезать / очистить данные
  • Удалить все пробелы (включая CHAR (160)) см. Примеры "mapgie" и "magpie" ниже
  • Запуск регулярного выражениясовпадения (, например, приведенный ниже пример заменяет s$ на "" для удаления множественного числа)
  • Совпадение по любой комбинации столбцов (т. е. столбец A, все столбцы, столбцы A и B и т. д.)

enter image description here

2 голосов
/ 09 марта 2012

Вы не упоминаете, что хотите делать, когда находите их. Если вы просто хотите увидеть, где они ...

Sub HighLightCells()
   ActiveSheet.UsedRange.Cells.FormatConditions.Delete
   ActiveSheet.UsedRange.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual,  Formula1:=ActiveCell
   ActiveSheet.UsedRange.Cells.FormatConditions(1).Interior.ColorIndex = 4
End Sub
0 голосов
/ 06 декабря 2014

Сортировка диапазона и в следующем столбце укажите `= if (a2 = a1; 1; if (a2 = a3; 1; 0))

Для дубликатов будет отображаться «1».

0 голосов
/ 11 марта 2012

Один простой способ найти уникальные значения - использовать предварительный фильтр и фильтр только для уникальных значений, а также скопировать и вставить их на другой лист, так как после удаления сводки вы получите все данные с дубликатом в них.

...