Как покрасить другие ячейки на основе другой ячейки в VBA - PullRequest
0 голосов
/ 28 октября 2019

Мои знания по VBA ограничены, поэтому я борюсь даже с этой простой задачей. Я хочу проверить каждую ячейку в столбце B, если это значение ячейки дублируется в столбце A другой рабочей таблицы. Затем, если в этом диапазоне есть повторяющиеся значения, она окрашивает ячейку в желтый. У меня есть эта часть работает. Следующее, что я хочу сделать, это покрасить ячейки в той же строке в столбцах C, D и F. Эта часть не работает для меня, она дает мне ошибку несоответствия типов. Любая помощь в этом будет оценена.

Sub Mark_Duplicates()

    Dim Cell As Variant
    Dim Source As Range
    Dim Source2 As Range
    Dim rownumber As Variant

    Set Source = Range("B1:B1000")
    Set Source2 = Worksheets("Chain").Range("A1:A1000")

    For Each Cell In Source

        If Application.WorksheetFunction.CountIf(Source2, Cell) > 1 Then

            rownumber = ActiveCell.Row
            Cell.Interior.Color = RGB(255, 255, 0)
            Range("C" & rownumber).Interior.Color = RGB(255, 255, 0)
            Range("D" & rownumber).Interior.Color = RGB(255, 255, 0)
            Range("F" & rownumber).Interior.Color = RGB(255, 255, 0)

        End If

    Next

End Sub

1 Ответ

1 голос
/ 28 октября 2019

Согласно @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 является волатильным для определения)

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