Olá pessoal.

Eu já havia escrito um artigo semelhante ao que vocês lerão agora, contudo, muitas pessoas vêm me pedindo uma melhoria nele para atender às células que tem seus backgrounds definidos dinamicamente via Formatação condicional.

Então. Hoje vou mostrar como fazer isso. Para quem não leu a matéria anterior sobre este assunto, leia para entender melhor este artigo.

Vou transcrever aqui, o comentário do leitor Alex que solicitou esta dica recentemente no dia 26 de junho de 2010.

Muito boa essa ajuda. Contudo se a celula por formatada condicionalmente esse aplicativo não funcional. Ex.: Formato a celula condicionalmente para amarelo se o valor for igual a 5. Coloco esse valor em na celula e ela muda de cor automatica pelo sistema. Só que essa formula nao reconhece a celular como amarelo. Apenas como branca. Mesmo ela estando amarela. Tem como resolver isso?

Bem, caros leitores, existe sim a possibilidade de fazer uma contagem de células que são “coloridas” pela formatação condicional. Seguindo a mesma metodologia da versão desenvolvida anteriormente, essa fórmula será chamada através da seguinte fórmula personalizada, digitada diretamente na célula onde se quer exibir a contagem.

Exemplo:

=ContaCelulaColoridaFormatCond(D6;$A$2:$A$30)

Onde em D6 está uma célula “colorida” com a cor que deseja exibir a contagem.

No final deste artigo, está disponível um arquivo de exemplo para você baixar e entender melhor o funcionamento.

Abaixo, vou descrever o código que executará toda esta tarefa. Lembre-se, este código deverá ser colocado em um módulo global no ambiente de desenvolvimento VBA. Para abrir o editor VBA, tecle ALT+F11.

No módulo.

Option Explicit

Public Function ContaCelulaColoridaFormatCond(rngColorInfo As Range, Intervalo As Range) As Long
Dim rConta As Range

    For Each rConta In Intervalo.Cells
        If RetornaCorDeFundoCondicional(rConta) = rngColorInfo.Interior.ColorIndex Then
            ContaCelulaColoridaFormatCond = ContaCelulaColoridaFormatCond + 1
        End If
    Next

End Function

Public Function RetornaCorDeFundoCondicional(ByVal rngCelula As Range) As Long
Dim FormatCondition As FormatCondition

    RetornaCorDeFundoCondicional = -1

    For Each FormatCondition In rngCelula.FormatConditions
        If StatusDoFormatoCondicional(FormatCondition) Then
            If Not IsNull(FormatCondition.Interior.ColorIndex) Then
                RetornaCorDeFundoCondicional = FormatCondition.Interior.ColorIndex
            End If
            Exit For
        End If
    Next FormatCondition

End Function

Public Function StatusDoFormatoCondicional(ByVal FormatCondition As FormatCondition) As Boolean
Dim FormulaTransformada As String
Dim Operator As Long
Dim Formula1 As String
Dim Formula2 As String
Dim Cell As Range
Dim CellValue As String

FormulaTransformada = FormatCondition.Formula1
Set Cell = FormatCondition.Parent

On Error Resume Next
Operator = FormatCondition.Operator
On Error GoTo 0

   If Operator > 0 Then
      Formula1 = FormatCondition.Formula1
      On Error Resume Next
      If Left(Formula1, 1) = "=" Then Formula1 = Mid(Formula1, 2)
      Formula2 = FormatCondition.Formula2
      On Error GoTo 0
      If Left(Formula2, 1) = "=" Then Formula2 = Mid(Formula2, 2)
      If VarType(Cell.Value) = vbString Then
         CellValue = """" & Cell.Value & """"
      Else
         CellValue = CDbl(Cell.Value)
      End If
      Select Case Operator
         Case xlBetween:      FormulaTransformada = "AND(" & Formula1 & "<=" & CellValue & "," & CellValue & "<=" & Formula2 & ")"          Case xlNotBetween:   FormulaTransformada = "OR(" & Formula1 & ">" & CellValue & "," & CellValue & ">" & Formula2 & ")"
         Case xlEqual:        FormulaTransformada = CellValue & "=" & Formula1
         Case xlNotEqual:     FormulaTransformada = CellValue & "<>" & Formula1
         Case xlGreater:      FormulaTransformada = CellValue & ">" & Formula1
         Case xlLess:         FormulaTransformada = CellValue & "<" & Formula1          Case xlGreaterEqual: FormulaTransformada = CellValue & ">=" & Formula1
         Case xlLessEqual:    FormulaTransformada = CellValue & "<=" & Formula1
      End Select
   Else
      FormulaTransformada = FormatCondition.Formula1
      If Application.Version < 12 Then
         If Application.ReferenceStyle = xlA1 Then
            FormulaTransformada = Application.ConvertFormula(FormulaTransformada, xlA1, xlR1C1, , ActiveCell)
            FormulaTransformada = Application.ConvertFormula(FormulaTransformada, xlR1C1, xlA1, xlAbsolute, Cell)
         End If
      End If
   End If
   StatusDoFormatoCondicional = Application.Evaluate(FormulaTransformada)

End Function

É isso!

Espero que tenham gostado. Abraços.