2015-09-28 2 views
3

У меня есть два диапазона данных, с которыми я хочу сравнивать и форматировать, если они совпадают. Поэтому я хочу отформатировать ячейку диапазона 1, если какая-либо из этих данных соответствует данным в диапазоне 2. Это то, что у меня есть до сих пор - оно работает до тех пор, пока я не изменю данные до диапазона 2, но не обновит его:Условные диапазоны форматирования

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

Dim myRange As Range, cell As Range 
Set myRange = Range("a9:a12") 

For Each cell In myRange 
If cell.Value = ActiveCell.Value And Not IsEmpty(ActiveCell.Value) Then 
ActiveCell.Interior.ColorIndex = 3 

End If 
Next cell 
End Sub 

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

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim myRange1 As Range 
    Set myRange1 = Range("f9:f12") 

    If Not Intersect(Target, Range("f1:f6")) Is Nothing Then 
    If Application.WorksheetFunction.CountIf(myRange1, ActiveCell.Value) > 0 _ 
    Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.Color = xlNone 
    End If 
End Sub 

ответ

3

Это то, что вы пытаетесь?

If cell.Value = ActiveCell.Value And _ 
Not IsEmpty(ActiveCell.Value) Then 
    ActiveCell.Interior.ColorIndex = 3 
Else 
    ActiveCell.Interior.Color = xlNone 
End If 

EDIT

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim myRange As Range 

    Set myRange = Range("a9:a12") 

    If Application.WorksheetFunction.CountIf(myRange, ActiveCell.Value) > 0 _ 
    Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.Color = xlNone 
End Sub 

EDIT

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim myRange As Range 
    Set myRange = Range("f9:f12") 

    If Not Intersect(Target, myRange) Is Nothing Then 
     If Application.WorksheetFunction.CountIf(myRange, Target.Value) > 0 _ 
     Then Target.Interior.ColorIndex = 3 Else Target.Interior.Color = xlNone 
    End If 
End Sub 
+0

это uncoloring его, но мне нужно только это не UNCOLOR, если данные в диапазоне 2 диапазона данных больше не соответствует с любыми данными в первом. подумайте, что это похоже на выполнение vlookup, и если данные в первом диапазоне совпадают, он подсвечивается, если он не окрашен. Это то, что я пытаюсь выполнить - мой первый IF делает это, но как только я изменяю (обновляю) данные во 2-й строке, это не оспаривает его – exitleft

+0

См. Редактирование. Возможно, вам придется обновить страницу. Это то, что вы хотите? –

+0

Да, что работает отлично - спасибо! существует ли способ, которым эта процедура может выполняться как пользователь, вводящий в ячейку? – exitleft

0

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    'important for _SelectionChange event macros 
    'only process the cells to the extents of the data, not whole rows or columns 
    If Not Intersect(Target, Target.Parent.UsedRange) Is Nothing Then 
     Dim c As Range 
     For Each c In Intersect(Target, Target.Parent.UsedRange) 
      c.Interior.ColorIndex = 3 + _ 
       4145 * IsError(Application.Match(c.Value2, Range("A9:A12"), 0)) 
     Next c 
    End If 
End Sub 

Для макроса Worksheet_SelectionChange событий, то Target представляет собой один или несколько ячеек, что является в настоящее время Выбор. При циклическом перемещении по каждой ячейке текущего выбора вы можете выполнить это псевдо-условное форматирование в большем диапазоне. Цель или выбор может быть любым количеством ячеек до общего количества ячеек на листе, но ActiveCell property может быть только одной ячейкой.

Я уменьшил цвет включения/выключения цвета на одном листе MATCH function и немного математики. Это устраняет прохождение через ячейки критериев.

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

Worksheet_SelectionChange cell formatting

+0

спасибо за ответ, я дам это попробовать, я новичок в vbs, поэтому не знаю, что я делаю: P – exitleft

Смежные вопросы