Jump to content

Criar função contar celulas coloridas e devolver quantidade dessas celulas e ...


susanajm
 Share

Recommended Posts

Olá a todos,

Gostaria de saber se alguém me consegue ajudar aqui com uma função.

Queria criar uma função que contasse as células coloridas ou texto colorido de uma determinada lista, e depois devolvesse a quantidade dessas células com uma determinada cor da célula ou do texto, e ao mesmo tempo também devolvesse o conteúdo dessas determinadas células.

Já tenho uma função me dá a quantidade de células coloridas, só falta a parte da função devolver o conteúdo das células em questão.

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

Desde já agradeço a ajuda.

Link to comment
Share on other sites

Confesso que nem olhei para o teu código...

Fui apenas a um ficheiro que já tinha guardado com link para esse código...

Acho que pode ajudar:

http://vbtuga.blogspot.com/2008/04/excel-contar-cores-das-clula.html

Tenho também estes e aqui deixo:

http://www.cpearson.com/excel/CFColors.htm

http://vbtuga.blogspot.com/2008/03/formatao-condicional-expandida-em-excel.html

Link to comment
Share on other sites

Tens várias soluções possiveis. Um forma agradável e simples será usar ou um vector ou uma collection. O vector é como em qualquer outra linguagem. As collections funcionam de forma parecida a uma arraylist em .NET mas muito mais básico. Ambas as formas permitem-te ficar a saber não só o que lá estava escrito, mas contar e até saber em que parte da contagem está cada uma.

Irei dar o exemplo com uma collection, pois acho que se torna mais simples e natural:

Public Function CountColors(rng As Range, color As Integer) As Collection
Dim rg As Range 
Dim x As New Collection
' Valor inicial 

    ' 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
           ' Adiciona novo valor à colecção 
           x.Add (rg.Value)
      End If
    Next

    set CountColors = x
End Function
Como podes ver eu passo a collection toda. Porquê? Bem porque o numero de valores adicionados dá-me a quantidade e a collection até tem um método para isso. x.count. Ou se usares noutra parte do código basta chamares a tua função CountColors.count (se calhar ficava melhor com outro nome que assim fica esquisito B))

Espero que te ajude

Link to comment
Share on other sites

Bons dias MetalFatigue,

Obrigado pela ajuda.

Sou nova nestas andanças, por isso não sei o que é uma collection, nem como funcionam. Copiei a função que me postaste, mas não a consegui por a funcionar. Podes dar-me mais uma ajuda.

Se me puderes dar um exemplo num ficheiro ainda era melhor.

Muito obrigado pela a ajuda.

Link to comment
Share on other sites

Bons dias jtiagodias,

Obrigado pela ajuda.

Mas já tinha uma função que me conta as células coloridas.

Os links que postaste não ajudaram muito, pois são só sobre funções que contam as células coloridas. Se calhar até estava lá mais alguma info, só que como sou nova nestas andanças ainda não conheço muito de VB.

O que eu preciso é de uma função que alem de contar as células coloridas devolva a informação contida nelas se forem de uma determinada cor. Do tipo se a célula for amarela, então devolve-me o conteúdo dessa célula, mas queria que a função fizesse-se isso para uma tabela. Do estilo tenho uma tabela com varias células de diferentes cores, e queria que a função conta-se a quantidade de células com uma determinada cor, e coloca-se essa quantidade, e a seguir o conteúdo dessas células. Exemplo: 2, conteúdo da célula, conteúdo da célula.

Desde já agradeço a tua ajuda.

Link to comment
Share on other sites

Em 12/18/2009 às 10:41, susanajm disse:

Bons dias MetalFatigue,

Obrigado pela ajuda.

Sou nova nestas andanças, por isso não sei o que é uma collection, nem como funcionam. Copiei a função que me postaste, mas não a consegui por a funcionar. Podes dar-me mais uma ajuda.

Se me puderes dar um exemplo num ficheiro ainda era melhor.

Muito obrigado pela a ajuda.

E sê bem-vinda as estas andanças 😛

Vou tentar detalhar melhor. Mas primeiro uma breve explicação do que é uma collection. Uma collection é um objecto tal como, por exemplo, o range. Os objectos podem ter várias funcionalidades, propriedades e valores armazenados. Pensa como se fosse um objecto real. Por exemplo um carro. tem vários componentes e várias funcionalidades que fazem dele um carro. Mas não precisas de saber como funciona um motor para o colocar a trabalhar sabes simplesmente que basta dar à chave. Tal como chamo o método x.count. Não sei como ele conta os objectos, simplesmente sei que ele me devolve o resultado. Por outro lado eu sei também que o carro tem valores armazenados, por exemplo o conta KMs, tal como no caso dos objectos range têm rg.value. etc.

Mas já me chega de alongar neste assunto. É sempre bom entender um objecto em programação uma vez que é um conceito que abrange quase todas as linguagens modernas de programação. Se tiveres curiosidade e quiseres entender melhor faz pesquisas no google por Programação Orientada a Objectos.

Para terminar a collection é um objecto que consegue armazenar seja o que for. Incluindo valores e até outros objectos. Podes pensar como um objecto abstracto. Por exemplo poderia ser uma colecção de carros. Nessa colecção poderias logo ver quantos carros tinhas e depois se quisesses poderias ver ao detalhe cada um dos carros.

Indo à tua questão...

http://img684.imageshack.us/i/semttuloeb.jpg/

De forma a exemplificar te cria um novo livro com layout semelhante a este.

Depois usas este código e vê como funciona:

Sub Main()
    'Criar uma colecção de valores de todas as celulas com cor preta que estão na àrea A1:A20
    Dim cores As Collection
    Set cores = CountColors(Range("A1:A20"), 1)
    
    'Quantas celulas foram encontradas
    MsgBox ("Foram encontradas " & CStr(cores.Count) & " celulas pretas")
    
    'devolve todos os valores na colecção
    'variant é um tipo de dados que pode ser de qualquer tipo
    'ou seja pode ser tanto uma string como um integer
    Dim i As Variant
    For Each i In cores
        MsgBox ("Valor encontrado na colecção usando For Each: " & vbCrLf & vbCrLf & CStr(i))
    Next
    
    'Faz o mesmo que o anterior sem usar variant e for each
    Dim idx As Integer
    For idx = 1 To cores.Count
        MsgBox ("Valor encontrado na colecção usando For ""simples"": " & vbCrLf & vbCrLf & CStr(cores.Item(idx)))
    Next
    
    'Para saber que valor se encontra na 2ªx encontrada a cor especificada:
    MsgBox ("Valor encontrado pela 2ª vez: " & vbCrLf & vbCrLf & cores.Item(2))
End Sub

Public Function CountColors(rng As Range, color As Integer) As Collection
    Dim rg As Range
    Dim x As New Collection
    ' Valor inicial

    ' 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
           ' Adiciona novo valor à colecção
           x.Add (rg.Value)
      End If
    Next

    Set CountColors = x
End Function
Link to comment
Share on other sites

OLÁ PESSOAL,

IMPRESSIONANTE ESTA FUNÇÃO DE CONTAR CORES.

O MEU PROBLEMA É QUE PRECISO CONTAR CÉLULAS VERDES DE UM INTERVALO. PORÉM PRECISO SABER APENAS QUANTAS CÉLULAS VERDES DESSE INTERVALO  TEM VALORES MAIORES OU IGUAIS  AO VALOR DA CÉLULA  A1  E MENORES OU IGUAIS AO VALOR DA CÉLULA A34.

OBRIGADO,

RANGEL

Link to comment
Share on other sites

Antes de mais, Bem-vindo ao Fórum.

Em segundo lugar é regra de etiqueta da Internet não se escrever as frases em maiúsculas, pois dá a entender que estás a gritar. O que é desnecessário e irrita a leitura das pessoas.

Em relação à tua questão basta fazeres uma pequena alteração no código acima. Mais precisamente no If que se encontra dentro da função CountColors. Basta colocares o If assim:

If (rg.Interior.ColorIndex = color And rg.Value >= Range("A1").Value _
        And rg.Value <= Range("A34").Value) Then

Assim devolve-te só as células pintadas da cor que escolheste (no meu exemplo está para preto, 1, penso que o teu verde deverá ser o 43 mas tens de ver) e se o valor da celula estiver entre os valores estabelecidos.

Link to comment
Share on other sites

Boa noite, eu gostaria de adaptar para minha planilha, mas não sei por onde começar, será que pode me dar um HELP.

É o seguinte tenho uma planilha contendo vários nomes (se precisa do anexo me passa o e-mail que envio) em vez de número dentro dessas células (C4:AG29) correto, existem alguns nomes que estao com cores (amarela e/ou verde e/ou vermelho) em células diferentes mas a fonte/letra permanece todas com cor normal em preto. Portanto eu gostaria de contar quantas vezes por exemplo o nome de TIAO aparece na planilha com as células preenchida tanto nas cores por (verde/amarelo e vermelho)e assim para os outros nomes também. Mas isso sem SER NA FORMATAÇÃO CONDICIONAL. Fico grato.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.