Excel VBA - Как автоматизировать проверку и выбрать дубликаты в нескольких списках на нескольких листах в одной книге? - PullRequest
1 голос
/ 16 марта 2019

Как автоматизировать проверить наличие дубликатов в несколько списков в несколько листов в одной книге?

Мне удалось заставить его работать полуавтоматически с помощью макроса для каждого сравнения, которое мне нужно. Это означает макрос для поиска повторяющихся значений между:

Worksheets("All").Range("Annie") and Worksheets("Annie").Range("A:A")
Worksheets("All").Range("Benny") and Worksheets("Benny").Range("A:A")

и т.д.. и т.д ..

Вот скриншот, который показывает, где я нахожусь, и, надеюсь, визуализирует то, что я пытаюсь сделать

(Энни была в Швеции и Кении - поэтому эти страны помечены красным на макросе) (Бенни был в России и Испании) (И пр.)

Было бы гораздо эффективнее создать только ОДИН код, который делает это для всех столбцов, значения которых указаны в Worksheets("All").. Мне нужно иметь как минимум 50 столбцов с именами (Энни, Бенни, Чарли, Дэнни, Эмма, Фабиан и т. Д. И т. Д.)

Возможно ли это?

Вот мой код, пока (для "Бенни"):

Sub findDuplicatesBenny()

Dim rng1, rng2, cell1, cell2 As Range

Set rng1 = Worksheets("All").Range("Benny")

Set rng2 = Worksheets("Benny").Range("A:A")

For Each cell1 In rng1
If IsEmpty(cell1.Value) Then Exit For

For Each cell2 In rng2
If IsEmpty(cell2.Value) Then Exit For
If cell1.Value = cell2.Value Then

cell1.Interior.ColorIndex = 22
cell1.Interior.Pattern = xlSolid
End If

Next cell2
Next cell1

End Sub

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 16 марта 2019

Чтобы сделать это с условным форматированием, вы можете использовать INDIRECT и имя (Энни, Бенни и т. Д.) В строке 1, чтобы создать ссылку на соответствующий лист каждого имени.Затем с помощью COUNTIF вы можете считать дубликаты.

  1. В разделе Условное форматирование , нажмите Используйте формулу, чтобы определить, какие ячейки форматировать .
  2. Введите следующую формулу: =COUNTIF(INDIRECT("'"&A$1&"'!A:A"),A1)

enter image description here

Нажмите Формат , чтобы применить желаемую раскраску. В окне Rules Manager измените ссылку на диапазон " Применимо к "при необходимости.

enter image description here


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

Просто, чтобы объяснить более подробно... Две основные части этой формулы:

  1. COUNTIF: используется для подсчета количества ячеек, соответствующих критерию.Игнорируя INDIRECT на данный момент и используя пример ячейки A2, приведенная выше формула эквивалентна =COUNTIF(Annie!A:A,A2), которая смотрит на столбец A на листе Annie и подсчитывает все экземпляры Sweden,Это вернуло бы 1.

enter image description here

И если вы перетащите эту формулу вниз, в A3 она вернет 1 для Kenya, вA4, 0 для США и т. Д.

В другом столбце вы можете создать аналогичную COUNTIF ссылку на Benny, с аналогичными результатами - 0 для Швеции, вплоть додо 1 для России и Испании.

enter image description here


INDIRECT: возвращает ссылку, указанную в текстовой строке.В приведенной выше формуле используется INDIRECT для придания динамической привязки листа и диапазона (Annie!A:A, Benny!A:A и т. Д.).

Сначала объясните текстовую строку: "'"&A$1&"'!A:A".Это приводит к 'Annie'!A:A и 'Benny'!A:A и так далее:

enter image description here

При использовании внутри INDIRECT эти текстовые ссылки становятся ссылками на диапазоны.Оборачивая INDIRECT в COUNTIF, формула фактически эквивалентна =COUNTIF(Annie!A:A,A2) выше - мы только что сделали Annie!A:A динамическим.Обратите внимание, что я включаю одинарную кавычку ' до и после - 'Annie'!A:A.Это необходимо, если в имени листа есть пробел, например, если это имя Annie Marie.


Что касается условного форматирования - форматирование применяется, если вход формулы оценивается как TRUE.Я использую небольшой трюк, что 0 в условном форматировании эквивалентно FALSE, а 1 или больше - TRUE.Таким образом, форматирование будет применено к любой ячейке, где COUNTIF возвращает 1 или более.Вот как дубликаты помечаются / заполняются.

...