Notifications
Clear all

Filtrar coluna pelo maior valor

13 Posts
2 Usuários
0 Reactions
1,356 Visualizações
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Bom dia a todos!

Há algum tempo atrás fui atendido aqui no fórum em uma dúvida com relação a ocultar/exibir as linhas que contiam o número zero.
Agora preciso da ajuda de vocês para alterar o código de forma que, ao ivés de ocultar as células com o valor zero, filtre pelo maior valor da célula.

Por exemplo:

As células da coluna H possue uma fórmula que soma outras 5 colunas. O resultado pode variar, digamos que alguns resultados sejam 10, outros 30, outros 70, outros 120, outros 100. Nesses casos ficariam visíveis as linhas com o maior valor dentre todos os resultados, no caso todas as linhas com o resultado 120.
Esse código será inserido em um botão

Resumindo: deixar visíveis todas as linhas com o maior valor.

Abaixo o código com a condição do valor "zero"

Private Sub Worksheet_Calculate()
For Each cell In Range("U10:U3801")
If cell.Value = 0 Then 
cell.EntireRow.Hidden = True
Else
cell.EntireRow.Hidden = False
End If
Next
End Sub

Obrigado!

 
Postado : 07/05/2015 6:32 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Eu não entendi muito bem...

Sub ExpliqueMelhor()
    Range("H1", Range("H65536").End(xlUp)).AutoFilter 1, ">119"
End Sub

Att

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

 
Postado : 07/05/2015 6:57 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Seguinte:

Situação 1
1-Imagine o intervalo "U10:U3801"
2-Considere os valores 10, 25, 50, 80, 120, 32, 100, 250 nas células
3-Oculte todas as linhas do intervalo cujo valor seja menor que 250. Ficam visíveis todas as linhas cujo valor seja 250 (filtro MAIOR VALOR)
4-Fim

Situação 2
1-Imagine o intervalo "U10:U3801"
2-Considere 10, 25, 50, 80, 120, 32, 100 nas células
3-oculte todas as linhas do intervalo cujo valor seja menor que 120. Ficam visíveis todas as linhas cujo valor seja 120 (filtro MAIOR VALOR).

É isso!

 
Postado : 07/05/2015 7:26 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

luiz, se analisar as rotinas em seu topico anterior referente a valores Maior ou Menro, seria o caso de ajustar uma das rotinas que passei juntamente com uma de filtrar por Campo (Field) que no inicio disse se tratar da coluna "H" e agora colocou coluna "U", mas seja qual for é só ajustar as letras na rotina abaixo.

Veja se é isto :

Sub Filtra_Maior_Col_H()
    Dim ultLin As Long
    Dim vlrMaximo As Double
    Dim rng As Range

    ultLin = Cells(Rows.Count, "H").End(xlUp).Row
    
    Set rng = Range("A1:H" & ultLin)
    
    vlrMaximo = WorksheetFunction.Max(Range("H1:H" & ultLin))

    rng.AutoFilter Field:=8, Criteria1:="=" & vlrMaximo & ""

End Sub

[]s

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

 
Postado : 07/05/2015 7:57 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Mauro

Realmente existe uma semelhnaça.

Ajustei o código para:

Sub Filtra_Maior_Col_U()
    Dim ultLin As Long
    Dim vlrMaximo As Double
    Dim rng As Range

    ultLin = Cells(Rows.Count, "U").End(xlUp).Row
    
    Set rng = Range("U10:U" & ultLin)
    
    vlrMaximo = WorksheetFunction.Max(Range("U1:U" & ultLin))

    rng.AutoFilter Field:=21, Criteria1:="=" & vlrMaximo & ""

End Sub

Mas dá o erro 400:

 
Postado : 07/05/2015 8:15 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Vou postar aqui um código que faz exatamente o que quero. A diferença é que ele oculta as colunas. O que preciso é que o faça pelas linhas.
O código varre o intervalo das colunas D até FF e oculta todos as colunas cujo valor seja diferente do maior valor encontrado no intervalo.
O que preciso é buscar o maior valor no intervalo "U10:U3801" e ocultar todas as linhas cujo valor seja diferente do maior valor encontrado.

Private Sub Worksheet_Change(ByVal Target As Range)
dim MAIOR as integer 'Aqui acrescentei uma variável pra receber o maior valor encontrado no range
MAIOR = WorksheetFunction.Max(Range("d182:ff182")) 'Aqui a variavel recebe o maior valor encontrado no seu range (você pode alterar as colunas, aqui ele vai procurar da "D" até a "FF"
Application.ScreenUpdating = False
For j = 4 To 120
If Cells(182, j) <> MAIOR Then 'Aqui só alterei pra ele verificar se é igual ao maior valor exist5ente. Se for diferente, ele oculta a coluna.
Columns(j).Hidden = True
Else
Columns(j).Hidden = False
End If
Next j
End Sub
 
Postado : 07/05/2015 8:32 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

luiz, só para a sua compreensão :

ultLin = Cells(Rows.Count, "H").End(xlUp).Row - Aqui capturamos a última linha preenchida na Coluna "H", supomos que é a 20
Set rng = Range("A1:H" & ultLin) - Definimos o Range como sendo de "A1 até H20
vlrMaximo = WorksheetFunction.Max(Range("H1:H" & ultLin)) - Pegamos o Valor Máximo nesta Coluna "H1:H20"

Aqui vem a questão, como definimos o Range "A1:H20", a coluna "H" é a oitava coluna contando de A até H, então o "Field" - campo é 8
rng.AutoFilter Field:=8, Criteria1:="=" & vlrMaximo & ""

Pela sua adaptação :
ultLin = Cells(Rows.Count, "U").End(xlUp).Row- Aqui capturamos a última linha preenchida na Coluna "U", supomos que é a 20
Set rng = Range("U10:U" & ultLin) -Foi Definido o Range como sendo de "U10 até U20"
vlrMaximo = WorksheetFunction.Max(Range("U1:U" & ultLin)) - Pegamos o Valor Máximo nesta Coluna "U1:U20" dependendo do que tem acima de U10 poderá dar erro, então ajuste "U1" para "U10"

Nesta linha, como o Range definido foi somente uma Coluna, a "U" - o "Field" - campo tem de ser 1, uma vez que temos somente um campo
rng.AutoFilter Field:=1, Criteria1:="=" & vlrMaximo & ""

Faça os ajustes e veja se da certo agora.

[]s

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

 
Postado : 07/05/2015 8:52 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Ok.

Agradeço pelos esclarecimentos. Foi possível entender todo o código. Mas depois de alterar ainda ocorreu algo inesperado, até linhas que não deveriam ser ocultadas foram...então percebi que, ao buscar a ultima linha do intervalo (U:U), é preciso iniciar a busca a partir de uma determinada célula, no caso a célula U10.
Lembra que o intervalo a ser percorrido inicia-se na célula U10?

Então é preciso alterar a linha:
ultLin = Cells(Rows.Count, "U").End(xlUp).Row
para iniciar na célula U10.

pode ser ?

 
Postado : 07/05/2015 10:07 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Mauro,

O intervalo U1:U9 está sendo ocultado também, e não deveria. Segue uma imagem!

 
Postado : 07/05/2015 10:32 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

luiz, não tenho como ver o seu arquivo, mas pelo que expôs, não tem nada a ver com :
ultLin = Cells(Rows.Count, "U").End(xlUp).Row - aqui só verificamos qual a ultima linha.

Set rng = Range("U10:U" & ultLin) - Esta instrução define o Range Iniciando em U10 até a ultima linha

rng.AutoFilter Field:=1, Criteria1:="=" & vlrMaximo & "" - e aqui é realizado o filtro.

Se está ocultando linhas acima reveja estes numeros, não posso afirmar o que seria por não poder ver seu modelo no momento. Alias, o que tem acima da linha 10 ? Os Rotulos estão nesta Linha ?

[]s

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

 
Postado : 07/05/2015 10:47 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

O que tem nos intervalos:

U1:U8 = Vazio
U9 = Títulos das Colunas
U10:U3801 = valores resultantes de soma das colunas V, W, X, Y e Z. Aqui estão os valores a serem comparados

Apenas isso.

Ou seja, aqui "ultLin = Cells(Rows.Count, "U").End(xlUp).Row", imaginando se tratar de U1:U10 vai contar células preenchidas ou não preenchidas ? Uma vez que é para detarminar o range a ser pesquisado o maior valor?, acho que o erro está aqui.

 
Postado : 07/05/2015 10:55 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

luiz, a instrução:
ultLin = Cells(Rows.Count, "U").End(xlUp).Row - irá verificar qual a ultima linha preenchida na coluna "U" independente se as que estão acima estejam vazias.

Agora, como informou:
U1:U8 = Vazio
U9 = Títulos das Colunas - então em vez de "U10" temos de colocar "U9"

Veja como fica a rotina baseado na informação que postou :

Sub Filtra_Maior_Col_U()
    Dim ultLin As Long
    Dim vlrMaximo As Double
    Dim rng As Range
    
    ultLin = Cells(Rows.Count, "U").End(xlUp).Row
    
    Set rng = Range("U9:U" & ultLin)
    
    vlrMaximo = WorksheetFunction.Max(Range("U9:U" & ultLin))
    
    rng.AutoFilter Field:=1, Criteria1:="=" & vlrMaximo & ""

End Sub

Fiz um modelo baseado em suas informações, de uma olhada.
Filtro Valor Maximo Coluna U

Acho que agora resolvemos a questão, se não, tem alguma coisa de diferente em seu modelo.
[]s

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

 
Postado : 07/05/2015 12:23 pm
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

MAURO

Muito obrigado pela ajuda. Consegui resolver com uma adaptação. Está funcionando !

Valeu mesmo.

 
Postado : 07/05/2015 1:13 pm