Notifications
Clear all

VBA - para filtrar dados com condição

13 Posts
2 Usuários
0 Reactions
2,219 Visualizações
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

Boa tarde.

Tenho uma planilha com vários setores, com itens com valores (R$) positivos e negativos.
Preciso filtrar os 5 maiores itens (positivos) e os 5 maiores itens (negativo), de cada setor e colar em uma outra sheets.
Esse processo me ajudaria sendo executado via macro, pois são mais de 20000 itens e mais de 25 setores.
Anexei uma planilha como exemplo.

Desde já agradeço pela ajuda.

 
Postado : 17/01/2015 10:37 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Veja se é isso...

Baixe o arquivo em:
https://www.sendspace.com/file/c9ny92

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 17/01/2015 3:38 pm
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

Boa noite Alexandre.

Primeiramente muito grato.
É quase isso. Preciso que apareça os 5 maiores (Valores positivos) e os 5 maiores (valores negativos) de cada setor.
No arquivo ficaram apenas os 5 maiores no geral de todos os setores.

Uma outra dúvida: Tem como na macro na linha: ActiveSheet.Range("$A$1:$C$40").AutoFilter Field:=3, ser variável. Por que a cada vez que eu rodar a macro, será diferente a quantidade de setores e número de itens diferentes.

 
Postado : 17/01/2015 4:04 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Seria isso?
http://www.4shared.com/file/3omKJZRPba/ ... 14181.html

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/01/2015 5:36 pm
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

Boa noite.

Isso mesmo. Muito agradecido.

Apenas uma dúvida. A macro roda até a linha 40. Todas as vezes que eu precisar rodar a macro, nem sempre a última linha preenchida será a 40. Como corrigir?
Vi que a macro utiliza as colunas: D, E, e F.

Estou tentando editar a macro para a minha planilha original, mas não estou conseguindo..

 
Postado : 18/01/2015 7:04 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Se repara a linha

lr = Cells(Rows.Count, "A").End(xlUp).Row

o lr, seleciona a ultima linha povoada, caso tenha 40 100 ou 1000000.

Há alguma problema em usar as colunas D,E,F, caso sim podemos adaptar de outra forma.

Obs: Ao menos em consideração ao meu tempo gasto para te ajudar, por favor click na mãozinha!!!!!!!!!!

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/01/2015 7:12 pm
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

Eu Adicionei mais linhas povoadas. Executei a macro e ela rodou até a linha 40, não colando nas sheets "plan2" os novos setores que adicionei nas linhas abaixo da 40.

Sobre mudar a coluna, eu entendi com alterar.

Muito bom!!!

Acho que o problema do 40 está nestas linhas:

[D2].FormulaArray = "=IF(LARGE(($A$2:$A$40=$A2)*$C$2:$C$40,1)=$C2,1,IF(LARGE(($A$2:$A$40=$A2)*$C$2:$C$40,2)=$C2,2,IF(LARGE(($A$2:$A$40=$A2)*$C$2:$C$40,3)=$C2,3,IF(LARGE(($A$2:$A$40=$A2)*$C$2:$C$40,4)=$C2,4,IF(LARGE(($A$2:$A$40=$A2)*$C$2:$C$40,5)=$C2,5,"""")))))"
[E2].FormulaArray = "=IF(SMALL(($A$2:$A$40=$A2)*$C$2:$C$40,1)=$C2,1,IF(SMALL(($A$2:$A$40=$A2)*$C$2:$C$40,2)=$C2,2,IF(SMALL(($A$2:$A$40=$A2)*$C$2:$C$40,3)=$C2,3,IF(SMALL(($A$2:$A$40=$A2)*$C$2:$C$40,4)=$C2,4,IF(SMALL(($A$2:$A$40=$A2)*$C$2:$C$40,5)=$C2,5,"""")))))"

Estou correto?

Testei com mais de 1000 linhas e a macro vai para o depurar.

 
Postado : 18/01/2015 7:36 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Perdoe me eu esqueci do formula.

Veja esse novo modelo!

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 19/01/2015 5:26 am
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

Boa noite.

Achei interessante essa fórmula, que filtra os 5 maiores no total de cada setor. Muito bom. Apesar que não consigo ler / compreender as linhas, para depois editar para novas colunas ou aumentar a quantidade de itens para filtrar. (Desculpe a minha ignorância).

Caso, seja preciso filtrar os 5 maiores (positivos) + os 5 (negativos), totalizando 10 de cada setor. Como ficaria a fórmula?

 
Postado : 19/01/2015 4:15 pm
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

ALEXANDRE, BOM DIA.

SOCORRO... ..rs

Me ajuda nesta planilha: Preciso copiar para outra Sheets, os 20 itens de cada setor (coluna C), com maiores valores negativos (coluna AN).

Tentei fazer pelo que você fez, mas não consegui. :'(

Me ajuda por favor?

 
Postado : 31/01/2016 8:04 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

: Preciso copiar para outra Sheets

Essa parte eu não entendi, seu arquivo postado só tem uma guia.

Veja o resultado na guia AleVBA, seria algo assim?

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 22/02/2016 11:00 am
(@nilpeoli)
Posts: 16
Active Member
Topic starter
 

Boa tarde!!

: Preciso copiar para outra Sheets

Essa parte eu não entendi, seu arquivo postado só tem uma guia.

Veja o resultado na guia AleVBA, seria algo assim?

Att

BOM DIA.

Sim! Isso mesmo.
E vc fez em cinco linhas.

MUITO OBRIGADO!!!

Apenas mais uma dúvida: posso aplicar em qualquer planilha com as mesmas colunas com qtde de linhas diferentes, correto?

 
Postado : 22/02/2016 9:07 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Veja o código, tente entender o comentário, ai tente sua adaptação.

Sub AleVBA_14181()
Dim lrOrg As Long
Dim wsOrig As Worksheet
Dim wsDest As Worksheet
'Caso queira mudar as guias, altere o nome dentro do parenteses
Set wsOrig = ThisWorkbook.Worksheets("DA2801")          'Guia origem
Set wsDest = ThisWorkbook.Worksheets("AleVBA")          'Guia Destino

lrOrg = wsOrig.Cells(Rows.Count, "A").End(xlUp).Row     'Verifica ultima célula populada da guia Origem
    Application.ScreenUpdating = False
        wsDest.Range("A:F").Delete
        With wsOrig                                     'Aponta as ações abaixo para a guia DA2801
            .Range("CF:CF").Clear                       'Limpa a coluna CF
            .Range("CF2").Formula = "=SUMPRODUCT(($C$2:$C$10000=C2)*($AN$2:$AN$10000<AN2))+1"    'Inseri a formula
            .Range("CF2").AutoFill Destination:=.Range("CF2:CF" & lrOrg)                         'Arrasta a formula
            .Range("CF2:CF" & lrOrg).Value = .Range("CF2:CF" & lrOrg).Value                      'Cola valores
            [CF1].Value = "AleVBA"                                                               'Escreve AleVBA na célula CF1
            .AutoFilterMode = False                                                              'Limpa o Filtro
            .Range("CF1:CF" & .Cells(Rows.Count, 84).End(xlUp).Row).AutoFilter 1, "<21", xlWhole 'Filtra maior que 0 na coluna CF
            .Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, "AN")).SpecialCells(12).Copy wsDest.Range("A1") 'Cola os dados na guia destino
            .AutoFilterMode = False                                                              'Limpa o Filtro
        End With
    Application.ScreenUpdating = True
End Sub

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 23/02/2016 6:08 am