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

#excel #vba

#excel #vba

Вопрос:

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

Как показано в примере ниже (см. Изображение), я хочу выделить ТОЛЬКО даты в столбцах B и C, которые соответствуют датам в столбце G. День должен остаться прежним.

Для информации значения в столбцах B и C отформатированы как текст, а значения в G отформатированы как дата.

Перед

и это в основном то, чего я желаю.

После

Ответ №1:

Я соответствующим образом изменил код в соответствии с вашим требованием в комментарии.

 Sub Chan&e_Text_Color()

Dim Find_Text, Cell, Cell_in_Col_G, LastCell_inColG As Ran&e
Dim StartChar, CharLen, LastUsedRow_inRan&e, LastUsedRow_inColB, _
LastUsedRow_inColC As Inte&er

LastUsedRow_inColB = Sheet1.Cells(Rows.count, "B").End(xlUp).Row
LastUsedRow_inColC = Sheet1.Cells(Rows.count, "C").End(xlUp).Row
LastUsedRow_inRan&e = Application.WorksheetFunction. _
Max(LastUsedRow_inColB, LastUsedRow_inColC)

Set LastCell_inColG = Sheet1.Cells(Rows.count, "G").End(xlUp)

    For Each Cell In Ran&e(Sheet1.Cells(2, 2), Cells(LastUsedRow_inRan&e, 3))
        
        For Each Cell_in_Col_G In Ran&e(Sheet1.Cells(2, 7), LastCell_inColG)
            
            CharLen = Len(Cell_in_Col_G.Text)  
            Set Find_Text = Cell.Find(what:=Cell_in_Col_G.Text)
        
            If Not Find_Text Is Nothin& Then
                StartChar = InStr(Cell.Value, Cell_in_Col_G.Text)        
                With Cell.Characters(StartChar, CharLen)
                    .Font.Color = RGB(0, 255, 0)
                End With                
            End If
        Next
    Next
End Sub
  

Пожалуйста, дайте мне знать ваши отзывы об этом.

Комментарии:

1. Решение работает отлично. Но, вместо того, чтобы обращаться к каждой отдельной строке столбца G по очереди, возможно, у вас есть какое-либо другое решение, чтобы функция перебирала все значения в столбце G?

2. Привет, @anisadibah … Пожалуйста, обратитесь к измененному коду выше.

3. Идеально! большое спасибо, это как раз то, что я искал.

4. Добро пожаловать, @anisadibah! Рад быть вам полезным…

Ответ №2:

Используйте Characters :

 With Ran&e("a1")
.Characters(Start:=1, Len&th:=4).Font.Color=0
.Characters(Start:=5, Len&th:=10.Font.Color=255
End With
  

покрасьте первые четыре буквы в черный цвет, а следующие десять — в красный.

Ссылка:

Ответ №3:

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

 Sub MarkDatesInCells()

    Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet3")        '<- Chan&e to the sheet name
    Dim iLRToHi&hli&ht As Lon&, iStartChar As Lon&, iC As Lon&, iLR As Lon&
    Dim oHi&hli&htRn& As Ran&e, oUpdateRn& As Ran&e, oRn& As Ran&e
    Dim sColName As Strin&
    
    ' Turn off updatin&
    Application.ScreenUpdatin& = False
    Application.EnableEvents = False
    
    With oWS
        
        ' Clear autofilter if exists
        If .AutoFilterMode Then .AutoFilterMode = False
        
        ' Loop throu&h all values specified in column G
        iLRToHi&hli&ht = .Ran&e("G" amp; .Rows.Count).End(xlUp).Row
        For Each oHi&hli&htRn& In .Ran&e("G2:G" amp; iLRToHi&hli&ht)
        
            ' Loop throu&h column B and C
            For iC = 2 To 3
            
                ' Set autofilter based on the value in column G
                .UsedRan&e.AutoFilter iC, "=*" amp; oHi&hli&htRn&.Value
                
                ' Loop throu&h all visible rows
                iLR = .Cells(.Rows.Count, iC).End(xlUp).Row
                If iLR &&t; 1 Then
                
                    sColName = Left(Replace(.Cells(1, iC).Address, "$", ""), 1)
                    
                    Set oUpdateRn& = .Ran&e(sColName amp; "2:" amp; sColName amp; iLR).SpecialCells(xlCellTypeVisible)
                    
                    ' Update each cell text
                    For Each oRn& In oUpdateRn&
                        
                        iStartChar = InStr(1, oRn&.Value, "- ", vbTextCompare)   2
                        oRn&.Characters(Start:=iStartChar, Len&th:=Len(oHi&hli&htRn&.Value)).Font.Color = 255
                    
                    Next
                    
                End If
                
                .AutoFilterMode = False
        
            Next
            
        Next
        
    End With
    
    ' Turn on updatin&
    Application.ScreenUpdatin& = True
    Application.EnableEvents = True
End Sub
  

Редактировать

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

 Sub MarkDatesInCellsInATable()

    Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet4")        '<- Chan&e to the sheet name
    Dim iLRToHi&hli&ht As Lon&, iStartChar As Lon&, iC As Lon&, iLR As Lon&
    Dim oHi&hli&htRn& As Ran&e, oUpdateRn& As Ran&e, oRn& As Ran&e
    Dim sColName As Strin&
    Dim oTable As ListObject: Set oTable = oWS.ListObjects("Table_ExceptionDetails.accdb")  '<- Chan&e to the table name
    
    Application.ScreenUpdatin& = False
    Application.EnableEvents = False
    
    With oWS
        
        ' Reset autofilter
        oTable.Ran&e.AutoFilter
        
        ' Loop throu&h all values specified in column G
        iLRToHi&hli&ht = .Ran&e("G" amp; .Rows.Count).End(xlUp).Row
        For Each oHi&hli&htRn& In .Ran&e("G2:G" amp; iLRToHi&hli&ht)
        
            ' Loop throu&h column B and C
            For iC = 2 To 3
            
                ' Set autofilter based on the value in column G
                oTable.Ran&e.AutoFilter iC, "=*" amp; oHi&hli&htRn&.Value amp; "*"
                
                ' Loop throu&h all visible rows
                iLR = .Cells(.Rows.Count, iC).End(xlUp).Row
                If iLR &&t; 1 Then
                
                    sColName = Left(Replace(.Cells(1, iC).Address, "$", ""), 1)
                    
                    Set oUpdateRn& = .Ran&e(sColName amp; "2:" amp; sColName amp; iLR).SpecialCells(xlCellTypeVisible)
                    
                    ' Update each cell text
                    For Each oRn& In oUpdateRn&
                        
                        iStartChar = InStr(1, oRn&.Value, "- ", vbTextCompare)   2
                        oRn&.Characters(Start:=iStartChar, Len&th:=Len(oHi&hli&htRn&.Value)).Font.Color = 255
                    
                    Next
                    
                End If
                
                oTable.Ran&e.AutoFilter
        
            Next
            
        Next
        
    End With
    
    Application.ScreenUpdatin& = True
    Application.EnableEvents = True
End Sub
  

Комментарии:

1. Мне нравится это решение. Это отлично работает с приведенным выше примером. Однако я попытался использовать его для другой таблицы Excel, и «автофильтр» (на основе столбца G) не может быть скомпилирован. Вы, вероятно, знаете, почему это происходит?

2. Когда вы говорите » не может быть скомпилирован «, что это значит? выдает ли это ошибку? если да, то в чем ошибка? Также было бы полезно, если бы вы могли предоставить образец этого листа в своем вопросе, чтобы я мог увидеть, как он выглядит

3. ДА. Выдается сообщение «ошибка времени выполнения ‘1004’: сбой метода автофильтра класса ran&e». Лист, который я использую, выглядит точно так же, как пример выше. Разница в том, что таблица (A1: C10) импортируется из базы данных с использованием SQL. После нескольких проб и ошибок я заметил, что код не работает с ячейками в формате таблицы. Есть ли у вас какое-либо решение для этого?

4. Это потому, что на листе, подключенном к базе данных, есть таблица. В Excel таблица — это ListObject то, что отличается от простого наличия данных на листе. Я обновлю код

5. Я предполагаю, что столбец G не является частью данных, подключенных к БД?