Página 1 de 1

Function ContarDistinct

Enviado: 17 Mar 2017 às 14:40
por LeandroAndrade
Boa tarde,

estou com dificuldade para inserir um critério nesta função.
o que eu preciso .
uma função que conte todos valores, porem somente os distintos em uma coluna cheia de valores duplicados, porem preciso de um critério em outra coluna que seria contar todos valores distintos se a data for igual a do critério.

tenho este codigo que só conta sem critério.

Public Function ContarDistinct(intervalo As Range) As Long

Dim celula, valores As New Collection, valor As Variant, achou As Boolean

For Each celula In intervalo

If Trim(celula) <> "" Then

achou = False

For Each valor In valores

If valor = celula Then

achou = True

Exit For

End If

Next

If Not achou Then valores.Add celula.Value

End If

Next

ContarDistinct = valores.Count

Set valores = Nothing

End Function


muito obrigado

Re: Function ContarDistinct

Enviado: 17 Mar 2017 às 19:01
por osvaldomp
Substitua esta linha
Código: Selecionar todos
If Not achou Then valores.Add celula.Value
por esta
Código: Selecionar todos
If Not achou And celula.Offset(, -1).Value = [I3] Then valores.Add celula.Value

solução via fórmula matricial
Código: Selecionar todos
=SOMA(SE(FREQUÊNCIA(C2:C1415;C2:C1415)>0;SE(B2:B1415=I3;1)))

Function ContarDistinct

Enviado: 18 Mar 2017 às 08:05
por LeandroAndrade
Bom dia, Osvaldo e todos do forum

muito obrigado amigo, utilizei a formula matricial ficou show


valew

Function ContarDistinct

Enviado: 18 Mar 2017 às 10:29
por LeandroAndrade
Osvaldo

Só tenho um problema minha base da dados tem mais de 10000 linhas não vou poder utilizar a matricial

e a função criada não esta com critério da data

consegue me auxiliar novamente?

muito obrigado

Function ContarDistinct

Enviado: 18 Mar 2017 às 10:32
por LeandroAndrade
Tenho esta outra função que em outra ocasião o abdallas me ajudou

esta função ela escreve todos valores distintos separados por / e exclui repetido

no caso em ves de escrever quero que ela me traga a contagem destes valores

Function Lookup_concat(Search_string As String, _
Search_in_col As Range, Return_val_col As Range)

Dim i As Long
Dim result As String
Dim unico As New Collection

If Search_string = vbNullString Then
result = ""
Lookup_concat = Trim(result)
End
End If

On Error Resume Next
For i = 1 To Search_in_col.Count
If Search_in_col.Cells(i, 1) = Search_string Then
unico.Add Return_val_col.Cells(i, 1).Value, Return_val_col.Cells(i, 1).Value & "a"
End If
Next
On Error GoTo 0

For i = 1 To unico.Count
result = result & "/" & unico.Item(i)
Next

result = Right(result, Len(result) - 1)
Lookup_concat = Trim(result)

End Function

Re: Function ContarDistinct

Enviado: 18 Mar 2017 às 10:51
por osvaldomp
LeandroAndrade escreveu:Osvaldo

... não vou poder utilizar a matricial
Por quais motivos ?

e a função criada não esta com critério da data
A linha que eu sugeri inclui o critério data

Function ContarDistinct

Enviado: 18 Mar 2017 às 10:56
por LeandroAndrade
" A matricial Não posso utilizar pois tenho mais de 10000 linhas na base que vou usar o código
a função troquei a linha e testei mas não deu Certo continua sem critério.

Public Function ContarDistinct(intervalo As Range) As Long

Dim celula, valores As New Collection, valor As Variant, achou As Boolean

For Each celula In intervalo

If Trim(celula) <> "" Then

achou = False

For Each valor In valores

If valor = celula Then

achou = True

Exit For

End If

Next

If Not achou And celula.Offset(, -1).Value = [I3] Then valores.Add celula.Value

End If

Next

ContarDistinct = valores.Count

Set valores = Nothing

End Function

Re: Function ContarDistinct

Enviado: 18 Mar 2017 às 11:03
por osvaldomp
Sugiro que você disponibilize o seu arquivo completo com a fórmula e com a função que você está tentando utilizar.

Re: Function ContarDistinct

Enviado: 18 Mar 2017 às 11:19
por LeandroAndrade
estou postando ele mais resumido devido ser muito pesado

agradeço a atenção

att

Re: Function ContarDistinct

Enviado: 20 Mar 2017 às 15:54
por osvaldomp
Olá, Leandro.

Experimente esta UDF no lugar da sua.

Código: Selecionar todos
Function ContDist()
 Dim r As Range, cont As Long
  Application.Volatile
  For Each r In Sheets("zf2s_12").Range("G2:G" & Sheets("zf2s_12").Cells(Rows.Count, 7).End(3).Row)
   If Application.CountIf(Sheets("zf2s_12").Range("G2:G" & r.Row), r.Value) = 1 And r.Offset(, -3).Value = Range("C2").Value Then cont = cont + 1
  Next r
  ContDist = cont: cont = 0
End Function
Na célula 'C9' coloque =ContDist()

obs.
1. não é preciso colocar o intervalo como argumento da Função, como na sua UDF.
2. ao alterar a data em 'C2' a função atualiza automaticamente (na sua amostra em aprox. 3 seg)