Página 1 de 1

Contar Cores na Formatação condicional

Enviado: 21 Jan 2016 às 14:24
por ritacruz113
Boa tarde,

necessito de ajuda no seguinte, tenho uma folha de excel onde estou a aplicar a formatação condicional:
Imagem

em que se por ex =E(A1 =1; B=1) a célula B1 fica vermelha (envio foto em anexo)

posteriormente queria contar as células que aparecem a vermelho utilizando a fórmula Countcolors

Public Function CountColors(rng As Range, color As Integer) As Integer
Dim rg As Range
Dim x As Integer

' Valor inicial
CountColors = 0

' Ciclo que irá percorrer todas as células definidas
For Each rg In rng

' Caso a cor interior (background) seja a escolhida
If rg.DisplayFormat.Interior.ColorIndex = color Then

' Incrementa o contador
x = x + 1

End If

Next

' Define que a função (valor a retornar) tem o valor de x
CountColors = x

End Function

quando faço =countcolors((A1:B1);3) dá erro #VALOR!

Já pesquisei na internet e esta fórmula só dá se na formatação condicional escolher a regra "formatar apenas células que contenham", a regra que quero é "utilizar uma fórmula para determinar as células a serem formatadas".

Podem ajudar?
Obrigado

Contar Cores na Formatação condicional

Enviado: 21 Jan 2016 às 15:34
por laennder
Veja se isso lhe atende. Tem duas funções, uma para somar e outra pra contar. Em ambas, o primeiro parâmetro é o intervalo, e o segundo é o ColorIndex que deseja contar/somar.

Código original: http://www.xldynamic.com/source/xld.CFC ... l#specific

Fiz apenas uma pequena mudança, pois não estava funcionando com fórmulas relativas.
Código: Selecionar todos
Option Explicit

Public Function CFColorindex(rng As Range)
Dim oFC As FormatCondition
Dim sF1 As String
Dim iRow As Long
Dim iColumn As Long

   If rng.FormatConditions.Count > 0 Then
      For Each oFC In rng.FormatConditions
         If oFC.Type = xlCellValue Then
            Select Case oFC.Operator
               Case xlEqual
                  CFColorindex = rng.Value = oFC.Formula1
               Case xlNotEqual
                  CFColorindex = rng.Value <> oFC.Formula1
               Case xlGreater
                  CFColorindex = rng.Value > oFC.Formula1
               Case xlGreaterEqual
                  CFColorindex = rng.Value >= oFC.Formula1
               Case xlLess
                  CFColorindex = rng.Value < oFC.Formula1
               Case xlLessEqual
                  CFColorindex = rng.Value <= oFC.Formula1
               Case xlBetween
                  CFColorindex = (rng.Value >= oFC.Formula1 And _
                             rng.Value <= oFC.Formula2)
               Case xlNotBetween
                  CFColorindex = (rng.Value < oFC.Formula1 Or _
                             rng.Value > oFC.Formula2)
            End Select
         Else
            With Application
               iRow = rng.Row
               iColumn = rng.Column
               sF1 = .Substitute(oFC.Formula1, "LIN()", iRow)
               sF1 = .Substitute(sF1, "COL()", iColumn)
               sF1 = .ConvertFormula(sF1, xlA1, xlR1C1, , oFC.AppliesTo.Cells(1))
               sF1 = .ConvertFormula(sF1, xlR1C1, xlA1, , rng)
            End With
            CFColorindex = rng.Parent.Evaluate(sF1)
         End If
         If CFColorindex Then
            If Not IsNull(oFC.Interior.ColorIndex) Then
               CFColorindex = oFC.Interior.ColorIndex
               Exit Function
            End If
         End If
     Next oFC
   End If

End Function

Function SumByCFColorIndex(rng As Range, CI As Integer) As Double
    Dim R As Range
    Dim Total As Double
    For Each R In rng.Cells
        If CFColorindex(R) = CI Then
            Total = Total + R.Value
        End If
    Next R
    SumByCFColorIndex = Total
End Function

Function CountByCFColorIndex(rng As Range, CI As Integer) As Double
    Dim R As Range
    Dim Total As Long
    For Each R In rng.Cells
        If CFColorindex(R) = CI Then
            Total = Total + 1
        End If
    Next R
    CountByCFColorIndex = Total
End Function

Re: Contar Cores na Formatação condicional

Enviado: 21 Jan 2016 às 16:01
por Vaz
Mesmo sabendo que aqui é Macros e VBA, uma outra maneira seria utilizando três métodos diferentes desse tópico:

1 - Filtro de cores e SUBTOTAL, aplicado ao intervalo
2 - Intervalo formatado como tabela e habilitar linha de totais com a função CONTAR
3 - SUBTOTAL posicionado em célula separada, aplicado ao intervalo

Em ambas as opções é preciso utilizar o filtro para filtrar por cores, fazendo com que as funções executem.

Usei o mesmo modelo do Laennder para propor as opções.

Contar Cores na Formatação condicional

Enviado: 21 Jan 2016 às 16:10
por laennder
Olá Vaz, boas sugestões...

Re: Contar Cores na Formatação condicional

Enviado: 21 Jan 2016 às 17:05
por Vaz
OUYEAH! :P

Re: Contar Cores na Formatação condicional

Enviado: 18 Ago 2016 às 17:55
por phdamo
laennder, boa noite.

Sou novo no fórum, agradeço desde já pelo apoio e parabéns.

Não consegui adaptar seu código em minha planilha.
Tenho vários parâmetros que definem várias formatações condicionais.
O código que chegou mais perto da minha necessidade foi:

Ele funciona muito bem, único erro está em valores quebrados, exemplo, se o valor for 0,2 ele retorna #value!

Alguma sugestão.

ps.: Não consegui anexar o exemplo
Código: Selecionar todos
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

Application.Volatile
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
      'Caso a formatação condicional seja uma fórmula
      FormulaTransformada = FormatCondition.Formula1
      FormulaTransformada = Replace(FormulaTransformada, ";", ",")
      
      'Traduzindo a função SE para o inglês
      FormulaTransformada = Replace(FormulaTransformada, "SE(", "IF(")
      
      'Adicione traduções para as funções que você usar
      'Exemplos:
      'FormulaTransformada = Replace(FormulaTransformada, "MÉDIA(", "AVERAGE(")
      'FormulaTransformada = Replace(FormulaTransformada, "SOMA(", "SUM(")
      'FormulaTransformada = Replace(FormulaTransformada, "SOMASE(", "SUMIF(")
      
      FormulaTransformada = Application.ConvertFormula(FormulaTransformada, xlA1, xlR1C1, xlRelative, FormatCondition.AppliesTo.Resize(1, 1))
      FormulaTransformada = Application.ConvertFormula(FormulaTransformada, xlR1C1, xlA1, xlRelative, Cell)
   End If
   StatusDoFormatoCondicional = Application.Evaluate(FormulaTransformada)

End Function


Contar Cores na Formatação condicional

Enviado: 18 Ago 2016 às 18:50
por DJunqueira
Muitas vezes é possível contar as condições q levam a formatação condicional com uso de funções.
Frequentemente é mais prático.

Re: Contar Cores na Formatação condicional

Enviado: 18 Ago 2016 às 20:49
por phdamo
DJunqueira, boa noite.

Obrigado pela ajuda.
Então, estava fazendo exatamente assim, porém como são muitas informações diferentes com parâmetros de formatação diferente acaba levando muito tempo. E depois para ajustar da trabalho.

Abraços

Re: Contar Cores na Formatação condicional

Enviado: 19 Ago 2016 às 21:12
por DJunqueira
Veja se uma das funções da planilha anexa serve p/ vc contar por cor.