Dicas de VBA – Contar Cores das Células

21 Comentários

Por Jorge Paulino para o Pplware!

Muitas vezes utilizam-se no Excel cores para identificar diferentes prioridades ou estados de determinados pontos/itens. Essas identificações são preciosas ajudas na visualização mas podem também ser quantificadas para uma melhor contabilização ou para uma visualização gráfica.


No entanto, esta possibilidade apenas pode ser conseguida como recurso a VBA (Visual Basic for Applications), uma vez que as fórmulas disponíveis no Excel não o permitem.

Para adicionarmos esta função a uma folha de Excel devemos fazer o seguinte:

1 – Menu Tools – Macros – Visual Basic Editor ou ALT+F11
2 – Adicionar um novo módulo clicando com o botão direito ou através do menu Insert (Figura 1)

(Figura 1)

 

3 – Colocar a seguinte função no módulo criado

‘ ————————————————————————-
‘ Função que irá retornar o número de cores encontrada numa área

‘  (deverá ser inserido a área e o código da cor)
‘ ————————————————————————-

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.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

4 – Fechar o Editor de VBA e na folha de cálculo utilizar a função criada. No exemplo (Figura 2) deverá ser inserido o seguinte:
Figura 2

Célula C12: =CountColors(C3:C10;4)
Célula C13: =CountColors(C3:C10;19)
Célula C14: =CountColors(C3:C10;46)

O índice de cores do Microsoft Excel (ColorIndex) é composto por 56 cores (1 – 56) e podem verificar os códigos e correspondência de cores na imagem seguinte (Figura 3)

Figura 3

Em alternativa ao método rg.Interior.ColorIndex pode-se utilizar o método Color (rg.Interior.Color), sendo necessário alterar o argumento do tipo Integer para Long. Depois, pode-se utilizar no código o número da cor, algumas constantes de sistema disponíveis (vbGreen, vbRed, vbBlue, etc) ou o código RGB.
É importante lembrar que a alteração da cor em uma célula não origina nenhum evento e por isso o contador não é actualizado. É necessário que exista alguma edição na área definida ou alguma actualização manual (botão, evento, etc) para que funcione a 100%.

Mesmo com esta limitação, é uma função muito interessante e que irá certamente ter aplicações práticas para os leitores.

Escrito por: Jorge Paulino
Homepage: Página Autor: Jorge Paulino

Comentários

21

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Miguel Goyanes
    Miguel Goyanes

    Muito bom

  2. Avatar de Marco Freitas
    Marco Freitas

    Era de valor que colocassem um tutorial como fazer um macro para o Outlook, de modo a que depois de lido um email na caixa de entrada esse fosse movido automaticamente para uma pasta especifica. Ficaria muito agradecido.

      1. Avatar de Marco Freitas
        Marco Freitas

        Não por acaso não é isso, o que isso faz é: move um email para uma pasta especifica quando recebes, ou seja, logo que recebes o email ele nem fica na caixa de entrada é logo movido para a pasta.
        O que eu necessito é que depois de eu ler o email não seja necessário me preocupar em move-lo para uma determinada pasta, eu gostaria que essa tarefa fosse executada automaticamente pelo Outlook. Eu tenho a necessidade de guardar muitos dos email que recebo no trabalho, mas queria que eles ficassem na caixa de entrada até ser lidos.

  3. Avatar de João Pinto

    Mais um bom artigo do meu amigo Jorge…

  4. Avatar de vitor moreira
    vitor moreira

    “É importante lembrar que a alteração da cor em uma célula não origina nenhum evento e por isso o contador não é actualizado. É necessário que exista alguma edição na área definida ou alguma actualização manual (botão, evento, etc) para que funcione a 100%.”

    Há algum tempo precisei fazer um ficheiro e esta dar-me-ía imenso jeito se a actualização fosse automática… na altura tb não encontrei nenhuma descrição para a tornar automática.

    Não há uma forma qualquer de a tornar automática?

    1. Avatar de Jorge Paulino

      Mas era algo semelhante usando a actualização cores/formatação ou o ficheiro é diferente?

      É que existem muitos eventos que podem utilizados, dependendo da situação.

      1. Avatar de vitor moreira
        vitor moreira

        Sim a formula exactamente como esta mas a actualizar no momento em que mudamos a cor da célula sem ser necessário actualizar a formula.

        1. Avatar de Jorge Paulino

          Pois, mas isso não dá (pelo menos que tenha conhecimento), quanto muito pode-se fazer isso quando se alterar a selecção da célula ou outro evento.

          Sempre melhora um pouco, mas não é uma solução a 100%

          1. Avatar de vitor moreira
            vitor moreira

            Ok obrigado. Tb não havia encontrado nada na pesquisa que fiz. Tive de optar por outro tipo de contagem.

  5. Avatar de Mariana
    Mariana

    Jorge, não estou conseguindo.
    Quando volto a planilha, coloco a função e seleciono as células, automaticamente volta ao MVisualBasic e mostra a seguinte mensagem: Erro de compilação: Era esperado: expressão.

    O que devo fazer?

  6. Avatar de ELC
    ELC

    Boa tarde,
    Já vi vários exemplos de contar cor, utilizando o VBA, mas uma duvida persiste, e que não consigo solucionar….
    Contar células coloridas acrescentando outra variável…
    teria de ser um ” ContarCor.SE ”
    Por exemplo contar células coloridas no intervalo A2;X2 se no intervalo A1;X1 estiver a letra C….

    Já agora, a mesma duvida mas contar fonte colorida…

    Um grande Obrigado por todas as dicas e tutoriais que têm vindo a nos fazer conhecer.

    1. Avatar de Jorge Paulino
      Jorge Paulino

      Olá,

      Basicamente é colocar na validação (if) algo como:

      If rg.Interior.ColorIndex = color and rg.value = “C” Then

      1. Avatar de ELC
        ELC

        Obrigado pela dica, Mas está me a falhar algo….
        Acrescentei isso….
        Public Function CountColors(rng As Range, color As Integer) As Integer
        Dim rg As Range
        Dim x As Integer
        CountColors = 0
        For Each rg In rng
        If rg.Interior.ColorIndex = color And rg.Value = “C” Then
        x = x + 1
        End If

        Next
        CountColors = x

        End Function

        Com a seguinte “formula” no excel: =CountColors(A3:E3;4;”C”;A2:E2) e nada 🙁

        O que me está a escapar??

      2. Avatar de ELC
        ELC

        Se calhar explico-me melhor com o exemplo…
        https://app.box.com/s/ogrtldtgkl2ku25qsc42xc6o4prifcsi

        Obrigado

  7. Avatar de Jorge Paulino
    Jorge Paulino

    Deverá ser algo como isto (não testado):

    Public Function CountColors(rng As Range, color As Integer, cellValue as String) As Integer
    Dim rg As Range
    Dim x As Integer
    CountColors = 0
    For Each rg In rng
    If rg.Interior.ColorIndex = color And rg.Value = cellValue Then
    x = x + 1
    End If
    Next
    CountColors = x

    End Function

    E depois na função:

    =CountColors(A3:E3;4;”C”)+CountColors(A2:E2;4;”C”)

    ou definir um named range (http://www.contextures.com/xlNames01.html) e utilizar:

    =CountColors(NomeDoRange;4;”C”)

    1. Avatar de ELC
      ELC

      Assim dá sempre erro na função 🙁 mesmo definindo o nome do range… (apesar de ser uma boa dica a de dar nome a “Range”)

      https://app.box.com/s/ogrtldtgkl2ku25qsc42xc6o4prifcsi O meu ficheiro da dor de cabeça 🙂

      Obrigado pela prontidão em ajudar.

  8. Avatar de Jorge Paulino
    Jorge Paulino

    Tenta assim:

    Function CountColor(r As Range, lColor As Long, shiftRange As Range, shift As String) As Integer
    Dim rCell As Range
    For Each rCell In r
    If rCell.Font.ColorIndex = lColor Then
    If shiftRange.Columns(rCell.Column) = shift Then
    CountColor = CountColor + 1
    End If
    End If
    Next rCell
    End Function

    e depois:

    =CountColor(A8:BD8;3;A5:BD5;”C”)

    1. Avatar de ELC
      ELC

      Boa, Grande obrigado….
      Funcionou para a cor de fonte… Para a cor de fundo, foi só acrescentar um novo modulo e alterar o “.Font.” para “.Interior.”

      Obrigado Jorge

    2. Avatar de Paulo Martins
      Paulo Martins

      Boa noite Jorge,
      aproveitando a dica anterior para um trabalho urgente que preciso, dá-me erro.
      Mas passo a explicar:
      tenho uma tabela( por exemplo) onde a coluna A corresponde aos colaboradores e a coluna B tenho os vários tipos de equipamentos definidos por cores VBA (Azul, Verde, Cinza, etc) e onde consigo saber a quantidade pelas cores. Até aqui tudo bem. No entanto, preciso de saber dentro de cada tipo de equipamento, entenda-se cores, o tamanho dos mesmos (S, M, L, XL, etc). Estou a utilizar o excel 2013. Cumprimentos