Página 1 de 1

VBA - Formatação Condicional

Enviado: 15 Jun 2020 às 20:49
por SandroLima
Boa noite, pessoal

Utilizo esse código para colorir as células de uma coluna caso alguma célula das demais colunas da mesma linha estejam vazias:
Código: Selecionar todos
With Tabela.ListColumns("Registro").DataBodyRange.FormatConditions
        .Delete
        .Add Type:=xlExpression, Formula1:="=CONT.VALORES($C12:$AL12)<1"
        With .Item(.Count)
            .Interior.Color = RGB(255, 235, 156)
            .Font.Color = RGB(156, 101, 0)
        End With
Até então resolvia muito bem minha necessidade...
Hoje, porém, preciso de uma modificação nela... preciso que o código seja modificado de modo que se alguma célula das demais colunas da mesma linha apresentarem preenchimento interior de coloração (de qualquer, ou seja, diferente de incolor) que as células dessa coluna recebam preenchimento de coloração conforme estava no código acima.

Seria algo do tipo:
Se as células das colunas de "C" à "AL" tiverem cor de preenchimento (qualquer cor de preenchimento) as células da Coluna [Registro] da tabela recebem preenchimento de coloração RGB(156, 101, 0).

Poderiam me ajudar com isso? Segue planilha anexa para testes.
Desde já muito obrigado.

Re: VBA - Formatação Condicional

Enviado: 16 Jun 2020 às 13:48
por babdallas
Essas cores diferentes são provenientes de formação condicional ou são escolhidas manualmente?

Re: VBA - Formatação Condicional

Enviado: 16 Jun 2020 às 15:24
por SandroLima
São cores RGB colocadas no restante do código da macro:
Código: Selecionar todos
With Tabela.ListColumns("Data").DataBodyRange.FormatConditions
        .Delete
        .Add Type:=xlExpression, Formula1:= _
        "=E($I12<=HOJE();OU($J12="""";$J12=""Aguardando pagamento""))"
        With .Item(.Count)
            .Interior.Color = RGB(255, 199, 206) 'Preenchimento vermelho
            .Font.Color = RGB(140, 0, 10) 'Cor da fonte: vermelha
        End With
        .Add Type:=xlExpression, Formula1:= _
        "=E($I12=HOJE()+1;OU($J12="""";$J12=""Aguardando pagamento""))"
        With .Item(.Count)
            .Interior.Color = RGB(248, 203, 173) 'Preenchimento laranja-escuro
            .Font.Color = RGB(140, 0, 10) 'Cor da fonte: vermelha
        End With
        .Add Type:=xlExpression, Formula1:= _
        "=E($I12=HOJE()+2;OU($J12="""";$J12=""Aguardando pagamento""))"
        With .Item(.Count)
            .Interior.Color = RGB(250, 215, 195) 'Preenchimento laranja-médio
            .Font.Color = RGB(140, 0, 10) 'Cor da fonte: vermelha
        End With
        .Add Type:=xlExpression, Formula1:= _
        "=E($I12=HOJE()+3;OU($J12="""";$J12=""Aguardando pagamento""))"
        With .Item(.Count)
            .Interior.Color = RGB(252, 228, 214) 'Preenchimento laranja-claro
            .Font.Color = RGB(140, 0, 10) 'Cor da fonte: vermelha
        End With
        .Add Type:=xlExpression, Formula1:= _
        "=E($I12>=HOJE()+4;OU($J12="""";$J12=""Aguardando pagamento""))"
        With .Item(.Count)
            .Interior.Color = RGB(198, 239, 206) 'Preenchimento Verde
            .Font.Color = RGB(0, 97, 0) 'Cor da fonte: Verde
        End With
End With

A cor da fonte não me importa para que a célula da coluna Registro receba preenchimento de cor... apenas quando as células das demais colunas receberem cor de preenchimento (independente da cor da fonte).

Re: VBA - Formatação Condicional

Enviado: 18 Jun 2020 às 09:55
por SandroLima
Bom dia.

Alguém sabe como deveria proceder?

Re: VBA - Formatação Condicional

Enviado: 18 Jun 2020 às 10:07
por babdallas
Deixa ver se entendi. Se da coluna C até a coluna AL nenhuma das formatações condicionais anteriores estiver ativada, então eu pinto a coluna Registro. É isso?
Se for isso, não vejo necessidade alguma de código VBA. Basta colocar esta como última condição, sendo que ela vai ser sempre verdadeira. Porém, na penúltima formatação condicional, você diz para ele parar se verdadeiro. OU seja, só irá ativar esta formatação condicional se nenhuma das anteriores for ativada.
Se não for, então explica com mais detalhes, pois estou achando desnecessário código VBA para isso.

Re: VBA - Formatação Condicional

Enviado: 18 Jun 2020 às 12:45
por SandroLima
Deixa ver se entendi. Se da coluna C até a coluna AL nenhuma das formatações condicionais anteriores estiver ativada, então eu pinto a coluna Registro. É isso?
É o contrário... se em qualquer uma das colunas de C atá a coluna AL houver formatação ativada então na Coluna [Registro] (Coluna B) a formatação deve também ser ativada.
Cada uma dessas colunas (C a AL) tem suas regras de formatação próprias (e são muitas) por isso precisava que para a coluna [Registro] a regra de formatação fosse:
- se qualquer uma das colunas C a AL recebesse cor de preenchimento (qualquer cor) que então a formatação da coluna [Registro (Coluna B) fosse ativada.
E preciso que seja em VBA pois tenho uma macro que adiciona linhas no topo dessa tabela e cada vez que uma nova linha é adicionada ela perde a formatação condicional na nova linha adicionada ficando somente a partir das linhas inferiores ou criando uma nova regra.
Assim sendo rodo a macro de formatação condicional ao inserir uma nova linha ou quando a planilha for salva e fechada.

Re: VBA - Formatação Condicional

Enviado: 20 Jun 2020 às 17:19
por SandroLima
Boa tarde...

Alguma solução para isso?

Re: VBA - Formatação Condicional

Enviado: 21 Jun 2020 às 17:42
por babdallas
Veja se é isso.
Código: Selecionar todos
Option Explicit

Public Function iColor(rng As Range, Optional formatType As String) As Variant
'Função que peguei em
'https://stackoverflow.com/questions/45122782/how-to-get-the-background-color-from-a-conditional-formatting-in-excel-using-vba
'formatType: Hex for #RRGGBB, RGB for (R, G, B) and IDX for VBA Color Index
    Dim colorVal As Variant
    colorVal = rng.DisplayFormat.Interior.Color
    Select Case UCase(formatType)
        Case "HEX"
            iColor = "#" & Format(Hex(colorVal Mod 256), "00") & _
                           Format(Hex((colorVal \ 256) Mod 256), "00") & _
                           Format(Hex((colorVal \ 65536)), "00")
        Case "RGB"
            iColor = "(" & Format((colorVal Mod 256), "00") & "," & _
                     Format(((colorVal \ 256) Mod 256), "00") & "," & _
                     Format((colorVal \ 65536), "00") & ")"
        Case "IDX"
            iColor = rng.Interior.ColorIndex
        Case Else
            iColor = colorVal
    End Select
End Function

Sub Teste()
    VBA.MsgBox iColor(Tabela.DataBodyRange.Cells(2, 1), "RGB")
End Sub

Sub Formata_AtivDiarias()
    
    Dim Tabela      As ListObject
    Dim lngLin      As Long
    Dim lngCol      As Long
    Dim lngCor      As Long
    Dim strRGB      As String
    
    Set Tabela = wsh_AtivDiarias.ListObjects("TB_AtivDiarias")
    
    Tabela.ListColumns("Registro").DataBodyRange.ClearFormats
    
    With Tabela.DataBodyRange
        For lngLin = 1 To .Rows.Count
            lngCor = 0
            For lngCol = 1 To .Columns.Count
                strRGB = iColor(.Cells(lngLin, lngCol), "RGB")
                If strRGB <> "(255,255,255)" And strRGB <> "(217,225,242)" Then
                        lngCor = lngCor + 1
                End If
            Next lngCol
            If lngCor > 0 Then
                .Cells(lngLin, 1).Interior.Color = VBA.RGB(255, 235, 156)
                .Cells(lngLin, 1).Font.Color = VBA.RGB(156, 101, 0)
            End If
        Next lngLin
    End With
    
    Set Tabela = Nothing
End Sub

Re: VBA - Formatação Condicional

Enviado: 23 Jun 2020 às 19:55
por SandroLima
Boa noite, babdallas.

Funcionou perfeitamente... muito obrigado.

Na continuidade do raciocínio dessa macro e para eu finalizar minha demanda veja se pode ajudar com isso... caso contrário eu abrirei um novo tópico.

Após a formatação é executada uma macro que uso para organizar/ordenar a tabela:
Código: Selecionar todos
Sub Ordena_AtivDiarias()
    
    Set Plan = Sheets("ATIVIDADES DIÁRIAS")
    Set Tabela = Plan.ListObjects("TB_AtivDiarias")
    Set Aqui = ActiveCell
    
    TotalLin = Tabela.DataBodyRange.Rows.Count
    TotalCol = Tabela.DataBodyRange.Columns.Count
    IniLin = Tabela.DataBodyRange.Range("A1").Row
    IniCol = Tabela.DataBodyRange.Range("A1").Column
    UltLin = IniLin + TotalLin - 1
    UltCol = IniCol + TotalCol - 1
    ColReg = Tabela.ListColumns("Registro").DataBodyRange.Column
    ColData = Tabela.ListColumns("Data").DataBodyRange.Column
    ColVcto = Tabela.ListColumns("Pgto / Vencimento").DataBodyRange.Column
    ColStatus = Tabela.ListColumns("Status Pgto").DataBodyRange.Column
    
    LinCorte = Evaluate("CountIf(TB_AtivDiarias[[#All],[Status Pgto]],""Aguardando pagamento"") + " & _
                        "CountIf(TB_AtivDiarias[[#All],[Status Pgto]],""Valor retido"") + IniLin - 1
...
End Sub
Onde o valor da variável LinCorte é dado por Contagem das células da Coluna [Status Pgto] que atendem as condições "Aguardando pagamento" e "Valor retido".

Com a alteração da macro o valor da LinCorte passa a ser dado pela contagem das células da Coluna [Registro] que apresenta preenchimento.

Como eu poderia alterar essa parte do código:
Código: Selecionar todos
LinCorte = Evaluate("CountIf(TB_AtivDiarias[[#All],[Status Pgto]],""Aguardando pagamento"") + " & _
                        "CountIf(TB_AtivDiarias[[#All],[Status Pgto]],""Valor retido"") + IniLin - 1
para que retorne o valor de LinCorte = ao número de células que apresentam cor de preenchimento? (No caso qualquer cor... o resultado da contagem das células coloridas)

E mais uma vez obrigado.

Re: VBA - Formatação Condicional

Enviado: 24 Jun 2020 às 09:45
por babdallas
LinCorte tem que ser o número de linhas com cor de preenchimento na coluna [Status Pgto] ?

Re: VBA - Formatação Condicional

Enviado: 24 Jun 2020 às 16:50
por SandroLima
Boa tarde.
LinCorte tem que ser o número de linhas com cor de preenchimento na coluna [Status Pgto] ?
Antes era sim.
Agora com a nova parte da Macro que vc criou no caso será da coluna [Registro]. E só reforçando... qualquer cor de preenchimento.

E mais uma vez obrigado.