Изменить фактический цвет шрифта на основе другого значения ячейки в строке

В настоящее время у меня есть рабочий лист, который просматривает столбец B и сопоставляет строку со строкой в ​​​​столбце Z, а затем меняет цвет соответствующей строки на font.color в столбце B. Проблема в том, что столбец B окрашен условным форматированием, поэтому код является непризнанным. Мне нужно иметь возможность изменить фактический цвет шрифта в столбце B, когда условие истинно. Кроме того, код необходимо увеличивать до тех пор, пока не будет достигнута последняя строка листа.

Вот текущие условные форматы, которые я настроил

Цитата

=ISNUMBER(SEARCH("Story",Template!D5))=TRUE 'format dark blue
=ISNUMBER(SEARCH("Requirement",Template!D5))=TRUE 'format green
=ISNUMBER(SEARCH("EPIC",Template!D5))=TRUE 'format red
=ISNUMBER(SEARCH("Test",Template!D5))=TRUE 'format teal
=ISNUMBER(SEARCH("New Feature",Template!D5))=TRUE 'format orange
=ISNUMBER(SEARCH("Theme",Template!D5))=TRUE 'format gray

Цитата

Sub Main()
  Call NoLinks
  Call SetCellWarning
  Call colortext
End Sub

Sub NoLinks()
ActiveSheet.Hyperlinks.Delete
End Sub

Sub SetCellWarning()
    Dim iLastRow As Long
    Dim cel As Range, rSetColumn As Range

    iLastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row

    Set rSetColumn = Range(Cells(5, 26), Cells(iLastRow, 26)) ' Column "Z"...

    For Each cel In rSetColumn
        If cel.Value = "" Then
            With cel
                cel.Value = "NOT MAPPED"
            End With
        End If
    Next cel

End Sub

***'The colortext runs but does not update unless the font color is manually updated***    
Sub colortext()
start_row = 5
key_col = 2
linked_col = 26
i = start_row 'start on row one
Do While Not IsEmpty(Cells(i, key_col)) 'Do until empty cell
    o = start_row 'start with row one for second column
    Do While Not IsEmpty(Cells(o, linked_col)) 'Do until empty cell
    If Not InStr(1, Cells(o, linked_col), Cells(i, key_col)) = 0 Then  'if cell    contents found in cell
        With Cells(o, linked_col).Characters(Start:=InStr(1, Cells(o, linked_col), Cells(i, key_col)), Length:=Len(Cells(i, key_col))).Font
            .Color = Cells(i, key_col).Font.Color  'change color of this part of the cell
        End With
    End If
    o = o + 1 'increment the cell in second column
    Loop
    i = i + 1 'increment the cell in the first column
Loop
End Sub

Цитата


person user2642587    schedule 06.08.2013    source источник
comment
Это немного сбивает с толку. Почему у вас есть условное форматирование в столбце B, если вы хотите контролировать цвет? Или вы хотите отключить условное форматирование для определенных ячеек, если выполняются определенные условия? Не могли бы вы уточнить?   -  person Floris    schedule 07.08.2013
comment
Это был урок, полученный на горьком опыте. Мне нужно избавиться от условного форматирования для столбца B и заставить VBA изменить фактические цвета на основе тех же условий. Например, если D5 = требование, то цвет шрифта B5 = зеленый, если D5 = EPIC, то цвет шрифта B5 = красный, D5 = история, затем B5 синий. После выполнения кода для B5 мне нужно сделать то же самое для остальных строк. Условное форматирование делает это, но фактически не меняет цвет шрифта.   -  person user2642587    schedule 07.08.2013
comment
Вы уверены, что ссылаетесь на правильный номер цвета в своем заявлении?   -  person David Van der Vieren    schedule 07.08.2013
comment
Условное форматирование делает это, но на самом деле не меняет цвет шрифта - проблема в том, что ваш код не работает, или в том, что условное форматирование не работает? В приведенной вами формуле условного форматирования ничто не ссылается на значение в столбце B и не выполняет поиск в столбце Z... Итак, вам действительно нужен работающий код VBA или вам нужна помощь в исправлении условного форматирования?   -  person Floris    schedule 07.08.2013


Ответы (3)


На всякий случай, если вы просто хотите, чтобы «решение, которое вы пробовали раньше», работало, вот как вы можете заставить работать условное форматирование:

  1. Выберите ячейки (в столбце B), к которым вы хотите применить условное форматирование.
  2. Нажмите на кнопку «условное форматирование». Удалите все правила, которые вам больше не нужны, затем создайте «новое правило», основанное на «верности уравнения».
  3. Введите следующее уравнение: =ISNUMBER(SEARCH(B1, "EPIC"))
  4. Выберите формат, который вы хотите для ячеек с текстом «EPIC» в них (обратите внимание: при таком порядке «ПОИСК» мы ищем текст в ячейке B1, который будет содержаться во фразе «EPIC», поэтому «E» будет соответствовать, как и "IC". Если вы хотите, чтобы сопоставлялись только ячейки с "Это было EPIC", вам нужно изменить порядок аргументов на противоположный.
  5. Добавьте больше правил для других слов, которые вы хотите сопоставить, и цвет, который вам нужен.

Вот как выглядит диалоговое окно, когда вы только что создали одно правило:

введите здесь описание изображения

А вот так выглядит диалог «условного форматирования» после выполнения второго правила (в моем примере я применил эти правила к 8 ячейкам):

введите здесь описание изображения

На данный момент электронная таблица выглядит следующим образом:

введите здесь описание изображения

Кажется, это то, о чем вы просили... если это не так, то, пожалуйста, уточните в комментариях!

person Floris    schedule 06.08.2013
comment
Спасибо, Флорис. В настоящее время у меня есть условное форматирование, которое вы предоставили. Проблема в том, что форматирование не меняет фактический цвет шрифта, а только внешний вид в ячейке. - person user2642587; 07.08.2013
comment
Я не уверен, что понимаю, что вы говорите. Как вы определяете разницу между фактическим цветом шрифта и внешним видом — и почему вас волнует эта разница? Я думаю, что если я пойму ответ на этот вопрос, я смогу дать вам лучшее решение. - person Floris; 07.08.2013
comment
Если вы добавите условный формат для изменения цвета текста в ячейке, а затем откроете экран формата ячейки (щелкните правой кнопкой мыши по ячейке > форматировать cels...), вы заметите, что фактический цвет не обновляется. Таким образом, мой код, соответствующий цвету ячейки, распознает только цвет в формате ячейки, а не в условном формате. - person user2642587; 07.08.2013
comment
Ах... вы используете цвет шрифта как тег для чего-то другого - и, поскольку свойство цвета шрифта не изменилось, вы не видите, что условное форматирование что-то сделало. Это оно? - person Floris; 07.08.2013
comment
В яблочко. Я пытаюсь исправить это с помощью оператора Case, но, похоже, он тоже работает правильно. - person user2642587; 07.08.2013

Избавиться от условного форматирования легко:

If (Cells(i, key_col).FormatConditions.Count > 0) Then
    Cells(i, key_col).FormatConditions.Delete 
End If
.Color = Cells(i, key_col).Font.Color  'change color of this part of the cell

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

person varocarbas    schedule 06.08.2013
comment
Я не слишком уверен, что это сработает. У меня есть настройка условного форматирования для изменения цвета на основе текста для столбцов B и D. В столбце B условие проверяет столбец D, ту же строку, и если текст найден, изменяет цвет. Оба сценария не меняют фактический цвет шрифта, что делает мой код бесполезным. Теперь мне нужно выделить каждый цвет на основе текста. Таким образом, 7 разных текстовых записей будут соответствовать разным цветам. Если одна из текстовых записей найдена в строке, вторая ячейка этой строки изменится на соответствующий цвет. - person user2642587; 07.08.2013
comment
@user2642587 user2642587 в одной из предыдущих версий вашего вопроса (теперь я думаю, что этого бита больше нет) я прочитал, что вы искали способ избежать применения условного форматирования к определенным ячейкам; вот почему я опубликовал этот ответ. Я не анализировал ваши точные требования подробно (честно говоря, я даже не уверен, почему у вас есть условное форматирование, которое вы не хотите применять). Я более подробно рассмотрю вашу конкретную проблему и вернусь к вам по этому поводу. - person varocarbas; 07.08.2013
comment
@user2642587 user2642587, прочитав условия/комментарии немного лучше, я еще больше запутался: вы говорите, что условия, предложенные Флорисом, не работают в вашей электронной таблице? Кроме того, я не совсем понимаю то, что вы хотите сделать в своем комментарии: предлагаемый код гарантирует, что цвет в данной ячейке является тем, который вы хотите, независимо от того, имеете ли вы условное форматирование в этой ячейке или нет. - person varocarbas; 07.08.2013
comment
Если вы посмотрите на подпрограмму colortext, она ищет строку в Z для соответствия строке в B, а затем изменяет цвет строки в Z. Поскольку условное форматирование не меняет фактический цвет шрифта, ничего не меняется, потому что по умолчанию все цвета автоматические (черные). Поэтому я удалил условное форматирование для столбца B (все черное). Теперь мне нужно несколько текстовых значений, найденных в D$, чтобы они соответствовали цвету шрифта. Затем на основе строки, если найдено одно из этих текстовых значений, измените цвет номера проблемы. Это будет продолжаться до тех пор, пока не будет достигнута пустая ячейка в B. - person user2642587; 07.08.2013

Вот выигрышное решение:

Sub colorkey()

start_row = 5
key_col = 2
flag_col = 4

i = start_row 'start on row one

Do While Not IsEmpty(Cells(i, key_col)) 'Do until empty cell

Tval = Cells(i, flag_col).Value
Select Case Tval
Case "Requirement"
    'cval = green
    cVal = 10
Case "New Feature"
    'cval = orange
    cVal = 46
Case "Test"
    'cval = lt blue
    cVal = 28
Case "Epic"
    'cval = red
    cVal = 3
Case "Story"
    'cval = dk blue
    cVal = 49
Case "Theme"
    'cval = grey
    cVal = 48
Case "NOT MAPPED"
    'cval = Maroon
    cVal = 53
End Select
Cells(i, key_col).Font.ColorIndex = cVal

i = i + 1 'increment the row
Loop

End Sub
person user2642587    schedule 08.08.2013