Notifications
Clear all

Function VBA Cont.ses Valores Exclusivos e Visíveis

22 Posts
2 Usuários
0 Reactions
4,087 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
 

Bom dia!!

Você precisara aninhar a função =SUBTOTAL(3;SOMARPRODUTO(

Use a pesquisa.
viewtopic.php?p=26404
viewtopic.php?p=23525
viewtopic.php?p=6373

Att

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

Bom dia!!

Ou tente assim

=SOMA(SE(FREQÜÊNCIA(SE(SUBTOTAL(3;DESLOC(C2;LIN(C2:C16)-LIN(C2);0;1));CORRESP(C2:C16;C2:C16;0));LIN(C2:C16)-LIN(C2)+1)>0;1))

è uma função Matricial, finalize com Ctrl+Shift+Enter

 
Postado : 04/02/2014 7:50 am
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Alexandre,
Desculpa mas, não consegui aninhar estas funções, e pelo que percebi nos posts trata-se de uma fórmula matriz, o qual gostaria de evitar...

Utilizei a seguinte combinação de fórmulas: (SE((SOMARPRODUTO(SUBTOTAL(103;DESLOC($E$20:$E21;LIN($E$20:$E21)-LIN($E$20);0;1));--($E$20:$E21=$E21)))=1;1;0)), mas como trata-se de uma grande planilha de dados, ela se tornou muito pesada para atualização.

Por isso, pensei em uma função em VBA que realizasse este cálculo.

Se tiveres mais alguma sugestão, agradeceria.

Abç

 
Postado : 04/02/2014 8:00 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Testou minha formula do terceiro post (o meu segundo), caso contrário poste seu arquivo modelo compactado.

=SOMA(SE(FREQÜÊNCIA(SE(SUBTOTAL(3;DESLOC(C2;LIN(C2:C16)-LIN(C2);0;1));CORRESP(C2:C16;C2:C16;0));LIN(C2:C16)-LIN(C2)+1)>0;1))

Att

 
Postado : 04/02/2014 8:58 am
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Boa tarde, Alexandre.
Não, retornou erro "#VALOR!".
Obrigada pela ajuda de qualquer forma.

Se tiveres alguma sugestão de um subtotal com condições, pois preciso contar quantos pedidos, encontram-se no status SIM, com quantidade diferente ou maior que 0, na etapa do processo LIBERADO, em uma planilha filtrada por região. Não consegui anexar a planilha, mas coloquei um exemplo mais detalhado abaixo para vc ter uma ideia mais precisa do meu cenário e da minha necessidade. (os pedidos se repetem, pois o relatório é aberto por itens do pedido.)

ETAPAS DO PEDIDO
PEDIDO STATUS UF QTD_NECESSECIDADE QTD_LIBERADO QTD_RESERVADA QTD_SEPARADO QTD_ENTREGUE
316192 NÃO MG 5 0 0 2 2
316192 NÃO MG 2 0 0 2 2
316193 SIM SC 2 0 0 2 2
316193 SIM SC 1 0 0 1 1
316193 SIM SC 3 0 0 3 3
316194 SIM RS 1 0 0 0 0
316194 SIM RS 1 0 0 1 1
316194 SIM RS 1 0 0 1 1
316194 SIM RS 1 0 0 1 1
316194 SIM RS 1 0 0 1 1
316194 SIM RS 2 0 0 2 2
316194 SIM RS 1 0 0 1 1
316194 SIM RS 1 0 0 1 1
316195 SIM GO 1 0 0 1 1
316195 SIM GO 3 0 0 3 3
316201 SIM MG 4 4 0 0 0
316204 SIM RS 1 1 0 0 0
316204 SIM RS 8 8 0 0 0
316204 SIM RS 2 2 0 0 0
316205 SIM BA 4 4 0 0 0
316205 SIM BA 1 1 0 0 0
316205 SIM BA 2 2 0 0 0
316205 SIM BA 1 1 0 0 0
316207 SIM RS 1 1 0 0 0
316207 SIM RS 1 1 0 0 0
316207 SIM RS 1 1 0 0 0

Abç

 
Postado : 04/02/2014 2:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

lizi, não sei se entendi corretamente, então fiz um modelo onde temos 3 colunas baseado em seu primeiro post :

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

Fiquei em duvida na qde diferente ou maior que 0, qq numero tanto positivo ou negativo será diferente de 0.

De qualquer forma de uma analisada e veja se estamos no caminho certo, não tenho certeza se ficará mais rápido, mas é mais uma Opção.
Neste modelo a rotina aplica o Filtro pelo Criterio "SIM" e depois conta as linhas com valores maiores que 0, apesar de estarmos utilizando o Filtro a formula utilizada pode ser usada sem aplicar a filtragem.

Anexo atualizado em 10/09/2015
Filtrar e Contar Valores com Criterios

Qualquer duvida retorne.

Fontes:
As adaptações efetuadas na Rotina foram tiradas dos links abaixo :
AutoFilter return correct result, but when SpecialCells(xlCellTypeVisible).value , excel only return half of the record
http://stackoverflow.com/questions/1952 ... ible-value

sumproduct Formula array in VBA
http://stackoverflow.com/questions/1692 ... ray-in-vba

 
Postado : 04/02/2014 4:48 pm
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Ótimo, Mauro.
Acredito que estamos no caminho certo!

Primeiramente, a regra aplicada a fórmula poder ser diferente de zero ou maior que zero, especifiquei para dar mais detalhes, o importante é que não conte os pedidos com informação zero na coluna de QTDE. :)

- Tiramos a execução da filtragem;
- Colocamos esta regra de contagem em uma function no vba ao invés de uma macro que dependerá de uma execução;

Consegui a seguinte Function que executa a contagem de valores exclusivos, somente em dados visíveis, porém não consegui adaptá-la para executar a contagem com condições. Talvez possa auxiliar.

Function PedidosExclusivos(rng As Range) As Long
'conta pedidos exclusivos

Dim mycell As Range, UniqueVals As New Collection

Application.Volatile

On Error Resume Next

For Each mycell In rng

If Not mycell.EntireRow.Hidden Then
UniqueVals.Add mycell.Value, CStr(mycell.Value)

End If

Next mycell

On Error GoTo 0

PedidosExclusivos = UniqueVals.Count

End Function

Obrigada,
Abç

 
Postado : 04/02/2014 5:56 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

lizi, o ideal seria anexar um modelo simplificado, compactado e com dados fictícios se for o caso, ficará mais fácil a adaptação.

Quanto a Function, como disse anteriormente que não queria formulas devido ao tempo de calculo, me atentei a este detalhe, você chegou a testar a rotina que enviei em seu modelo para ver o tempo de resultado ?

Agora estou de saida, depois dou uma analisada nesta sua function e retorno, mas de inicio, por esta linha "For Each mycell In rng" significa que se você tiver 300 linhas entrara em um loop de 300 vezes, imagine se for 2000 linhas ?

[]s

 
Postado : 04/02/2014 6:18 pm
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Sim, testei o seu código, e executou perfeitamente.
Podemos somente tirar a filtragem, e aplicar em células visíveis?

Obrigada pela ajuda.
Abç

 
Postado : 04/02/2014 6:27 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite lizi

Dica:

Quando a resposta for útil, para agradecer clique na mãozinha que fica do lado da ferramenta Citar.

Quando a dúvida for sanada clique no V verde que fica depois do X e antes do ! (Ponto de exclamação), um pouco antes do Citar.

At.te

 
Postado : 04/02/2014 6:58 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Sim, testei o seu código, e executou perfeitamente.
Podemos somente tirar a filtragem, e aplicar em células visíveis?

Obrigada pela ajuda.
Abç

lizi, no post anterior você comentou que tiraram a execução da filtragem, então o que quer dizer em "aplicar em celulas visiveis" ?

Como eu já comentei, a formula na rotina pode ser utilizada sem a opção de filtragem, fiz esta adaptação na rotina abaixo, veja se é isto :

Sub ContarComCriterio()
    Dim formula As String
    Dim rng As Range
    Dim sEndereco1 As String
    Dim sEndereco2 As String
    Dim lRow As Long
    
    Dim sWsh As Worksheet
    Set sWsh = ThisWorkbook.Sheets("Plan1")

    Dim UltimaLinha As Long
    'Verificamos a Ultima linha e armazenamos
    UltimaLinha = sWsh.Cells(Cells.Rows.Count, 1).End(xlUp).Row

    'Armazenamos nas Variáveis
    'ignorando as linhas ocultas
    sEndereco1 = Range("C1:C" & UltimaLinha).Address(0, 0)
    sEndereco2 = Range("B1:B" & UltimaLinha).Address(0, 0)
    
    Set rng = Range("C1:C" & UltimaLinha)

    'Total de Linhas Visiveis
    MsgBox rng.Columns(3). _
       SpecialCells(xlCellTypeVisible).Count - 1 & " - linhas Visiveis de " & rng.Rows.Count - 1 & " com Dados"
       
    'Contamos somente as Linhas Maiores que ZERO e Igual a "SIM"
    formula = "SUMPRODUCT((" & sEndereco1 & ">0) " & "* (" & sEndereco2 & "=""SIM""))"
    
    'Resultado para verificação
    MsgBox "Temos - " & Application.Evaluate(formula) & " pedidos com status SIM - maiores que 0"
    
    'é só definir onde quer o resultado e transferi-lo para a planilha
    'Ficando assim
    Range("G1").Value = Application.Evaluate(formula)

End Sub

[]s

 
Postado : 04/02/2014 7:41 pm
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

Bom dia, Mauro.
Sua macro, funcionou perfeitamente, está muito próximo do que preciso.
Tem como faze-la calcular os pedidos exclusivos?
No seu modelo o resultado foi 7 pedidos com os critérios aplicados, porém seriam 2 pedidos exclusivamente.

Pedi para retirar o filtro do status, pq a filtragem será aplicada pelo usuário conforme a necessidade, por região, ou por outra informação que acompanha o relatório original... Mas, vc entendeu e conseguiu construir um código bem próximo que necessito. Obrigada.

Consegui anexar um arquivo modelo da minha planilha, desculpa a minha inexperiência com as ferramentas do fórum.
Coloquei algumas informações adicionais, para entenderem a necessidade.
Muito Obrigada.

Lizi, apesar de inexperiência com as ferramentas do Forum, como Moderador tenho de pedir que leia as Regras do Forum, alias isto serve para qualquer Forum que participe, elas não ensinam como lidar com determinadas ferramentas, mas instruem sobre algumas regras que devemos seguir, e uma delas é quanto aos anexos, o mesmo devem ser compactados com (WinZip, WinRar, 7Zip..).
Desta vez compactei seu modelo e Upei novamente, mas fica o alerta que nos proximos se não forem compactados os mesmos serão excluidos. Grato pela compreensão.

Abçs

 
Postado : 05/02/2014 6:11 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lizi, para podermos continuar, o que quer dizer com :
Tem como faze-la calcular os pedidos exclusivos?
Quais são os Exclusivos ?

No seu modelo o resultado foi 7 pedidos com os critérios aplicados, porém seriam 2 pedidos exclusivamente.
Procurando entender, olhando o meu exemplo, apos a filtragem e contagem os unicos pedidos que não se repetem são 02 com valores "Zero", seriam estes os exclusivos ?

[]s

 
Postado : 05/02/2014 7:07 am
 lizi
(@lizi)
Posts: 14
Active Member
Topic starter
 

São os únicos, os que não se repetem. No seu exemplo o resultado final seriam 2 pedidos, com os critérios aplicados.

Att.

 
Postado : 05/02/2014 7:31 am
Página 1 / 2