VBA - определить, соответствует ли значение ячейки (строка) значению (строке) в именованном диапазоне

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

Я пробовал несколько методов, хотя ни один из них не работает для меня, любая помощь от гуру vba будет очень признательна.

по сути, у меня есть список значений на листе 1 (создать) G2: G5000, который мне нужно знать, когда они не совпадают со значением на листе 2 (списки) S2: S64 ‹ - это именованный диапазон Make.

см. копию моего текущего кода ниже


Sub testMake()

    Dim MkData As Range, MkVal As Range
    Dim MKArray As Variant

    Set MkData = Worksheets("Create").Range("G2:G5000")
    Set MkVal = Worksheets("Lists").Range("Make")

    For Each MyCell In MkData
        If MyCell.Value <> Range("MkVal") Then
            MyCell.Interior.ColorIndex = 6
        Else
            MyCell.Interior.ColorIndex = xlNone
        End If

    Next


End Sub

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


person Jb86    schedule 24.05.2016    source источник
comment
Почему бы не использовать для этого условное форматирование (не vba)?   -  person brettdj    schedule 24.05.2016


Ответы (2)


Вы можете использовать функцию рабочего листа Vlookup для сравнения двух диапазонов:

Sub testMake()

Dim MkData As Range, MkVal As Range
Dim MKArray As Variant
Dim result  As Variant

Set MkData = Worksheets("Create").Range("G2:G5000")
Set MkVal = Worksheets("Lists").Range("Make")

For Each MyCell In MkData
    On Error Resume Next
    result = Application.WorksheetFunction.VLookup(MyCell, MkVal, 1, False)

    If Err <> 0 Then
        result = CVErr(xlErrNA)
    End If

    If Not IsError(result) Then
        MyCell.Interior.ColorIndex = xlNone
    Else
        MyCell.Interior.ColorIndex = 6
    End If
Next

End Sub
person Shai Rado    schedule 24.05.2016
comment
YAY, это работает отлично, у меня есть еще один вопрос, если я могу, если я хочу, чтобы имя именованного диапазона (в настоящее время установлено значение Make) зависело от значения ячейки в столбце слева (та же строка), я предполагаю это будет сделано с помощью функции смещения, хотя я не могу заставить ее работать. Я думал что-то вроде Dim MkData As range, MkVal As range Dim MKArray As Variant Dim result As Variant Dim nrange As Variant Set MkData = Worksheets(Create).range(G2:G5000) Let nrange = MkData.Offset(0, 1) .Value Set MkVal = Рабочие листы (списки).range (nrange) - person Jb86; 25.05.2016

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

Sub testMake()

Dim MkData As Range
Dim MkVal As Range
Dim MKArray As Variant
Dim lngRow As Long
Dim rng1 As Range
Dim rng2 As Range


MKArray = Worksheets("Create").Range("G2:G5000").Value2
Set rng1 = Worksheets("Create").Range("G2")

Set MkVal = Range("Make")

For lngRow = 1 To UBound(MKArray)
    If IsError(Application.Match(MKArray(lngRow, 1), MkVal, 0)) Then
        If Not rng2 Is Nothing Then
            Set rng2 = Union(rng2, rng1.Offset(lngRow - 1, 0))
            Else
            Set rng2 = rng1.Offset(lngRow - 1, 0)
        End If
    End If
Next

If Not rng2 Is Nothing Then rng2.Interior.ColorIndex = 6

End Sub
person brettdj    schedule 24.05.2016