Notifications
Clear all

Function VBA Cont.ses Valores Exclusivos e Visíveis

22 Posts
2 Usuários
0 Reactions
4,088 Visualizações
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Olá, necessito uma fórmula que execute cont.ses para valores exclusivos e visíveis, em uma planilha filtrada.
Ex: Pedido Status Qtde
320 NÃO 0
325 SIM 2
325 SIM 2
330 NÃO 5

Resultado para quantos pedidos em status SIM, com qtde diferente ou maior que 0, (considerando que já existam alguns dados filtrados na planilha). => 1

Não localizei nenhuma solução em minhas buscas, e não gostaria de utilizar uma fórmula matriz, devido ao tempo de execução elevado.
Penso em uma function em vba para resolver esta questão, onde poderia usá-la de forma volátil.

Agradeço antecipadamente, por qualquer ajuda.
Obrigada.

 
Postado : 04/02/2014 7:07 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

lizi,

Sem macro. Só fórmulas. Faça os filtros e veja a geração de uma nova base de dados, que alimenta a Tabela Dinâmica (não esqueça de atualizar a cada nova filtragem).

Me avise.

Abs,

 
Postado : 05/02/2014 11:58 pm
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Mandrix,
Testei sua sugestão das fórmulas, e por se tratar de uma planilha que chegará a umas 5.000 linhas e 50 colunas, com atualizações diárias e acumulativas dos pedidos, se tornará inviável sua aplicação, devido ao peso atribuído das fórmulas e a demora na conclusão do cálculo...

De qualquer forma, fiz vários testes, com a fórmula sugerida, tentei combinar com uma fórmula matricial ou subtotal, mas não tive êxito...

Consegui um código em VBA de uma função personalizada, que retorna valores únicos, com critérios baseados em outra coluna, porém não consegui integrar com a função subtotal, nem com o comando "EntireRow.Hidden", e quando utilizo algum filtro ela continua buscando todo o intervalo e não apenas os filtrados.

O argumento é:
=CountUniqueItems(I16;F21:F222;E21:E222)

Function UniqueItems(critString As String, RangeCrit As Range, RangeIn As Range) _
As Variant
Dim Unique() As Variant 'Matriz que contém os itens exclusivos
Dim Element As Range
Dim NumUnique As Integer
Dim i As Integer, j As Integer
Dim FoundMatch As Boolean
Dim SearchArray() As Variant

'Contar para o número de elementos únicos
NumUnique = 0
j = 0
For i = 1 To RangeCrit.cells.Count
If RangeCrit.cells(i).Value = critString Then
j = j + 1
ReDim Preserve SearchArray(j)
SearchArray(j) = i
End If
Next i

'Loop através da searcharray
For i = 1 To UBound(SearchArray)
FoundMatch = False

'Tem artigo foi adicionado ainda?
For j = 1 To NumUnique
If RangeIn.cells(SearchArray(i)).Value = Unique(j) Then
FoundMatch = True
GoTo AddItem '(Exit For-Next loop)
End If
Next j

AddItem:
'Se não estiver em lista, adicionar o item à lista única
If Not FoundMatch Then
NumUnique = NumUnique + 1
ReDim Preserve Unique(NumUnique)
Unique(NumUnique) = RangeIn.cells(SearchArray(i)).Value
End If

Next i
UniqueItems = Unique
End Function


Function CountUniqueItems(critString As String, RangeCrit As Range, RangeIn As Range) _
As Integer
CountUniqueItems = UBound(UniqueItems(critString, RangeCrit, RangeIn))
End Function

Talvez, possam me ajudar.
Muito obrigada.
Att.,

 
Postado : 06/02/2014 9:08 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

De qualquer forma, fiz vários testes, com a fórmula sugerida, tentei combinar com uma fórmula matricial ou subtotal, mas não tive êxito...

Difícil de entender porque aqui funciona e aí não...

Abs,

 
Postado : 06/02/2014 10:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não entendi, a proposta do Mandrix funcionou bem aqui também. Sempre que possível e quando envolver muitos usuários, é preferível utilizar formulas no lugar do VBA, pois a constante troca de equipamento requer que estejam habilitadas as seguranças de macros, eventualmente alguma ocx/dll etcc...
Convenhamos também que 5000x50 registros não é muito, para essa "tornará inviável sua aplicação"; mas parece-me que a sua direção e por macro.
Apesar disso segue proposta utilizando subtotal + ses (Coluna S e T) e uma alteração na UDF que voçe localizou (em U15).

Espero que lhe auxilie

 
Postado : 06/02/2014 10:48 am
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Olá, Reinaldo.

Já havia testado sua sugestão, ela retorna o resultado desejado, porém teria que incluir mais uma coluna de fórmulas para cada etapa do processo do pedido, acarretando mais peso a planilha... Por isso quanto mais prático o levantamento desta informação melhor, sem depender de muitas fórmulas de suporte vinculadas, e realmente a função via VBA é a que mais me parece influenciar menos no peso da planilha e tempo de resposta do cálculo... (a planilha original suporta a base de pedidos, mais gráficos estatísticos dinâmicos, que se movimentarão conforme a consulta do analista. Várias pessoas utilizarão, e será atualizada diretamente pelo nosso sistema, então já agrega muito peso e tempo na atualização, por isso quanto mais "simples" melhor...)

Suas sugestões são ótimas e muito lógicas!!!
Já utilizei várias ideias e métodos sugeridos em outras situações que estou desenvolvendo nesta planilha, estão me ajudando muito!

Abços

 
Postado : 06/02/2014 11:15 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

E a alteração na rotina que (VBA) que postou anteriormente atende?

 
Postado : 06/02/2014 12:27 pm
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Sim!

 
Postado : 06/02/2014 12:33 pm
Página 2 / 2