Color Coding Texto superpuesto con Macro

Para ahorrar un poco de tiempo en el proceso de Asistencia, pensé que sería una buena idea reunir VBA para codificación de colores texto específico dentro de las células basadas en qué tipo de hojas se utiliza. Estaba intentando modificar un código que había encontrado pero lo más cercano que he venido era esto.

Private Sub AutoColor(Optional ByVal Target As Range)
    If Intersect(Target, Range("B11:O500")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    On Error GoTo ErrHandler
    
    Select Case Right(Target.Cells.Value, 1)
    Case "A"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Green
    Case "D"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Green
    
    Case "S"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Red
    Case "E"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Red
    Case "Y"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Red
    Case "Q"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Red
    
    Case "L"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Orange
    Case "I"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Orange
    
    Case "W"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Blue
    Case "C"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Blue
    Case "EX"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Blue
    Case "HW"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Blue
    
    Case "OT"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Purple
    Case "P"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Purple
    Case "G"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Purple
    Case "B"
     Target.Cells.Characters(Start:=Len(Target.Cells.Value), Length:=1).Font.Color = Purple
     
     End Select
     
 Application.EnableEvents = True
 Exit Sub
ErrHandler:
 Application.EnableEvents = True

End Sub

El Intersecto es evitar cualquier posibilidad de recolorar cualquier cosa fuera de los días actuales, ellos mismos, pero que arroja un error de procedimiento inválido; ese no es el problema principal, sin embargo. El problema principal es que puede haber casos de múltiples tipos de licencias que se utilizan (un ejemplo siendo la célula que muestra como 4A 0700-1100 4S 1100-1530). Este código colorearía toda la célula basada en el primer valor elegible y necesito que coloreen cadenas superpuestas. En el ejemplo que di, 4A 0700-1100 tendría que ser verde mientras que 4S 1100-1530 tendría que ser rojo. Aquí hay un ejemplo de cómo se formatean las células

enter image description here

Pregunta hecha hace 3 años, 5 meses, 0 días - Por devgeek


2 Respuestas:

  • Para abordar tu problema de que el código actual solo colorea toda la célula basada en el primer valor elegible y necesitas que coloree cadenas superpuestas, puedes modificar la lógica del código para recorrer cada palabra o subcadena dentro de la celda y aplicar el color correspondiente según las reglas definidas.

    Aquí te dejo una sugerencia de cómo podrías modificar tu macro para lograr este comportamiento:

    vba
    Private Sub AutoColor(Optional ByVal Target As Range)
        If Intersect(Target, Range("B11:O500")) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        On Error GoTo ErrHandler
    
        Dim cellValue As String
        Dim words() As String
        Dim word As Variant
    
        cellValue = Target.Cells.Value
    
        words = Split(cellValue, " ")
    
        For Each word In words
            Select Case Right(word, 1)
                Case "A", "D"
                    Target.Characters(Start:=InStr(cellValue, word), Length:=Len(word)).Font.Color = RGB(0, 176, 80) ' Verde
                Case "S", "E", "Y", "Q"
                    Target.Characters(Start:=InStr(cellValue, word), Length:=Len(word)).Font.Color = RGB(255, 0, 0) ' Rojo
                Case "L", "I"
                    Target.Characters(Start:=InStr(cellValue, word), Length:=Len(word)).Font.Color = RGB(255, 165, 0) ' Naranja
                Case "W", "C", "EX", "HW"
                    Target.Characters(Start:=InStr(cellValue, word), Length:=Len(word)).Font.Color = RGB(0, 0, 255) ' Azul
                Case "OT", "P", "G", "B"
                    Target.Characters(Start:=InStr(cellValue, word), Length:=Len(word)).Font.Color = RGB(128, 0, 128) ' Púrpura
            End Select
        Next word
    
        Application.EnableEvents = True
        Exit Sub
    
    ErrHandler:
        Application.EnableEvents = True
    End Sub
    

    En este código, se divide el contenido de la celda en palabras y se recorre cada una de ellas para aplicar el color correspondiente según las reglas establecidas. Cada palabra se coloreará individualmente en función de su último carácter, lo que debería permitir que las cadenas superpuestas se coloreen correctamente.

    Es importante ajustar los valores RGB de los colores según tus preferencias. Además, debes asegurarte de que las palabras clave utilizadas en el código coincidan exactamente con las que esperas en tus celdas.

    Espero que esta modificación te ayude a lograr el resultado deseado. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 16:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    Necesitas un código VBA que coloree con diferentes colores el texto superpuesto en celdas específicas, según el último carácter del valor de la celda.

    Código modificado:

    El siguiente código modificado resuelve el problema permitiendo colorear cadenas superpuestas con diferentes colores:

    vba
    Private Sub AutoColor(Optional ByVal Target As Range)
        If Intersect(Target, Range("B11:O500")) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        On Error GoTo ErrHandler
    
        Dim CellValue As String
        Dim StartPos As Long
        Dim EndPos As Long
    
        CellValue = Target.Cells.Value
    
        For i = Len(CellValue) To 1 Step -1
            Select Case Right(Mid(CellValue, i, 1), 1)
            Case "A"
                StartPos = i
                EndPos = i
                Exit For
            Case "D"
                StartPos = i
                EndPos = i
                Exit For
            Case "S"
                StartPos = i
                EndPos = i
                Exit For
            Case "E"
                StartPos = i
                EndPos = i
                Exit For
            Case "Y"
                StartPos = i
                EndPos = i
                Exit For
            Case "Q"
                StartPos = i
                EndPos = i
                Exit For
            Case "L"
                StartPos = i
                EndPos = i
                Exit For
            Case "I"
                StartPos = i
                EndPos = i
                Exit For
            Case "W"
                StartPos = i
                EndPos = i
                Exit For
            Case "C"
                StartPos = i
                EndPos = i
                Exit For
            Case "EX"
                StartPos = i
                EndPos = i
                Exit For
            Case "HW"
                StartPos = i
                EndPos = i
                Exit For
            Case "OT"
                StartPos = i
                EndPos = i
                Exit For
            Case "P"
                StartPos = i
                EndPos = i
                Exit For
            Case "G"
                StartPos = i
                EndPos = i
                Exit For
            Case "B"
                StartPos = i
                EndPos = i
                Exit For
            End Select
        Next i
    
        If StartPos > 0 Then
            Target.Cells.Characters(Start:=StartPos, Length:=EndPos - StartPos + 1).Font.Color = RGB(255, 0, 0) 'Rojo
        End If
    
        Application.EnableEvents = True
        Exit Sub
    ErrHandler:
        Application.EnableEvents = True
    
    End Sub
    

    Explicación:

    Este código recorre el valor de la celda desde el último carácter hasta el primero. Comprueba el último carácter de cada subcadena y asigna un color según el carácter. Si se encuentra un carácter que coincide con un tipo de licencia, almacena la posición inicial y final de la subcadena. Una vez que se encuentra la subcadena que coincide, aplica el color correspondiente a los caracteres de la subcadena.

    Uso:

    Coloca este código en un módulo de VBA en tu libro de Excel. Asigna este código al evento Worksheet_Change para que se ejecute cada vez que se modifique una celda en el rango B11:O500.

    Respondida el Dec 18, 2020 a las 17:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0