Ir para conteúdo
Fórum Script Brasil
  • 0

Somar valores sem considerar os repetidos


Junioragp

Pergunta

Olá Pessoal,

Sou novo do forum estou começando a mexer com programação. E gostaria de ajuda sobre o fórmula abaixo:

Eu preciso somar quantos valores existem em uma coluna sendo que estes valores se repetem.

- A fómula no excel seria assim: {=SOMA(SE(CORRESP(A1:A110;A1:A110;0)=LIN(A1:A110);1;0))} o problema e que se for mais de 100 linha a formula da problema e a corresp não aceita filtro

- Fiz em VBA ficou assim:

Function Contarsrep(Coluna As Range)
    Dim cell As Range
    Dim contar As Integer
    contar = -1 'o -1 e por causa do título da coluna       
        
    Application.Volatile
    
    For Each cell In Coluna
       If cell.Rows.Hidden = False Then 'e para respeitar o filtro
            If cell <> "" Then
                If Application.WorksheetFunction.Match(cell, Coluna, 0) = cell.row = True Then
                contar = contar + 1
                End If
            End If
        End If
    Next
    
    Contarsrep = contar
    
End Function

Sendo que o Match não respeita o filtro. (igual ao corresp)

Explo:

Coluna 1 Coluna 2

Linha 1: Valor1 Numero1

Linha 2: Valor1 Numero2

Linha 3: Valor1 Numero1

Linha 4: Valor2 Numero2

Se eu filtrar na coluna 2 o "numero 2" vão aparecer 2 linhas "Linha 2 e 4" a formula esta para somar a coluna 1 e ela vai me retornar "1" (sendo que na linha 2 o "Valor1" e linha 4 "Valor2" a resposta teria que ser 2) porque o Match/Corresp vai me retornar uma linha oculta e comparar com uma linha "não oculta".

Espero que eu tenha conseguido explicar meu problema^^.

Agradeço desde já.

Editado por Junioragp
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Estou tentando com o "Find" mais não estou sabendo como fazer:

Function Contarsrep2(Coluna As Range)
Dim cell As Range
Dim contar As Integer
contar = 0

Area = Coluna.Rows.Hidden = False

    For Each cell In Area
        If cell <> "" Then
            Set Localizador = Cells.Find(What:=cell, After:=Area, LookIn:=xlValues).Activate
            Endereço = Localizador.row
            
                If Endereço = cell.row = True Then
                contar = contar + 1
                End If
        End If
        
    Next
    
   Contarsrep2 = contar
End Function

Editado por Junioragp
Link para o comentário
Compartilhar em outros sites

  • 0

Kuroi,

Bem eu acho que não à problema! Já que a condição tem que ser verdadeira. Mais o IF reconhece quando não tem o True ou False como True automaticamente! não e isso?

Vou deixar como você falou sem o True! mais ainda não esta funcionando o resultado está "#VALOR!"

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

a acho q o erro ta aqui ó:

Area = Coluna.Rows.Hidden = False
o q exatamente era pra fazer essa linha?? essa expressao não ta fazendo muito sentido. o primero igual da linha ele vai etender como atribuicao. já os proximos, ele entendera como comparacao o q não fara o menor sentido. ai aquela linha seria o mesmo q isso:
Area = (Coluna.Rows.Hidden = False)
e a expressao Coluna.Rows.Hidden = False deve retornar um valor true ou false. ou seja, a variavel Area, vai guardar dentro dela um valor boolean e não um range q imagino q seja o q você quer fazer. hum... o caso do if ate pudia mesmo funcionar daquele jeito. com uns parenteses assim, é mais garantido:
If (Endereço = cell.row) = True Then
isso se não me engano deve funcionar, mas o outro codigo q passei, alem de menor, deve realizar menos operacoes durante a execucao.
Mais o IF reconhece quando não tem o True ou False como True automaticamente! não e isso?
não é bem isso. imagine o if assim:
If Endereço = cell.row Then
a comparacao Endereço = cell.row retornara True ou False. se for true, o entra dentro do if, senao não. ou seja, você já tem o resultado da comparacao. é perda de tempo comparar de novo. então, imagine q isso aqui:
If Endereço = cell.row = True Then
seja isso:
If [True ou False] = True Then

se ele comparar True com True, retorna True. se comparar False com True, retorna False.

ou seja, você vai comparar de novo pra chegar num resultado q você já tinha. por isso é desnecessario.

agora, da uma olhada naquela linha da Area. você devia passar algum range pra ela, mas não sei exatamente o q você quer passar.

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0
agora, da uma olhada naquela linha da Area. você devia passar algum range pra ela, mas não sei exatamente o q você quer passar´

Eu gostaria que a formula não considerase as linhas ocultas. A primeira formula com corresp/macth funciona mais se filtrar o valor vem errado. Porque o Match vai voltar o numero de uma linha oculta e o if vai olhar uma linha "não oculta" ae sempre vai dar false.

Estou tentando "criar" um match que trabalhe com filtro. Para eu poder comparar, e eu achei o comando Find.

A ideia e procurar o 1º texto na coluna e comparar com as linhas se forem iguais ele vai dar verdadeiro e somar +1 e se for falso quer dizer que já passou outro valor igual e já foi somado assim não vai contar o mesmo texto novamente.

Como eu faço para a Area ser um range contendo somente as visiveis? e o find esta certo? Exeto a Area que esta errado!

Set Localizador = Cells.Find(What:=cell, After:=Area, LookIn:=xlValues).Activate

Editado por Junioragp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...