Согласно @BigBen, наиболее очевидная вещь, которую нужно исправить в вашем коде, - это способ конкатенации диапазона. В настоящее время вы использовали арифметическое сложение (+
), тогда как правильный синтаксис VBA был бы &
.
. При этом не стоит ссылаться на ActiveCell
. Поскольку вы никогда не активируете никакую другую ячейку, строка, на которую указывает ссылка, всегда будет оставаться прежней. В целом, согласно моему комментарию, ссылаться на что-то активное - это плохая практика . Вместо этого используйте Cell.Row
.
Еще одна полезная практика - использовать Long
переменные типа данных для полных целых чисел вместо типа данных Variant
. Одним из недостатков решения VBA о выборе типа данных является то, что использование Long
занимает 4 байта, в то время как вариант с использованием чисел занимает 22 * 1015 *. Итак, вы замедляете свой код. Фактически, вам это не понадобится само по себе.
Вы также можете вместо того, чтобы окрашивать ячейку за ячейкой, окрашивать диапазон сразу. Вы можете просто обратиться к большему диапазону.
Последнее замечание: вы никогда не указали полностью, по крайней мере, ссылочный лист для Source
, который в этом случае будет ссылаться на B1:B1000
сноваActiveSheet
. Я лично предпочитаю ссылаться на листы CodeName
.
В заключение, вы можете переписать свой код, например:
Sub Mark_Duplicates()
Dim Source1 As Range: Set Source1 = Sheet1.Range("B1:B1000") 'Use a worksheet's CodeName instead of sheet name (which can change)
Dim Source2 As Range: Set Source2 = Sheet2.Range("A1:A1000")
Dim cell As Range
For Each cell In Source1
If Application.CountIf(Source2, cell) > 1 Then
Sheet1.Range(Replace("B?:D?,F?", "?", cell.Row)).Interior.Color = RGB(255, 255, 0)
End If
Next
End Sub
Если ваш диапазон будет растиДля большего набора данных целесообразно больше не выполнять итерации по диапазону, а вместо этого переключаться на массив, что значительно ускоряет обработку.
Остается вопрос, нужен ли вам вообще VBA (согласно @BigBen),как вы могли бы сделать это с помощью условного форматирования (чем больше диапазон, тем медленнее ваш проект, поскольку CF является волатильным для определения)