Dicas de VBA – Contar Cores das Células
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)
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)
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
Este artigo tem mais de um ano
Muito bom
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.
Penso ser isto https://pplware.sapo.pt/truques-dicas/dica-aprenda-a-criar-regras-no-microsoft-outlook/
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.
Mais um bom artigo do meu amigo Jorge…
Obrigado João 😉
“É 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?
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.
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.
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%
Ok obrigado. Tb não havia encontrado nada na pesquisa que fiz. Tive de optar por outro tipo de contagem.
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?
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.
Olá,
Basicamente é colocar na validação (if) algo como:
If rg.Interior.ColorIndex = color and rg.value = “C” Then
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??
Se calhar explico-me melhor com o exemplo…
https://app.box.com/s/ogrtldtgkl2ku25qsc42xc6o4prifcsi
Obrigado
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”)
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.
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”)
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
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