Notifications
Clear all

Macro para ocultar linha com requesitos

10 Posts
2 Usuários
0 Reactions
1,760 Visualizações
(@apache81)
Posts: 0
New Member
Topic starter
 

Boas,
Tenho uma planilha em que a a coluna "B" contém uma fórmula para ir buscar valores a outras sheets. O que pretendo é uma macro em que caso as células da coluna "B" tenham o mesmo valor (numeros), a mesma oculte a linha cujos valores na coluna "F" sejam menores. Deverá efetuar o solicitado até 300 células na coluna "B" e "F".
Abaixo o Exemplo:

1 3333 Frutaria Alface Embalagem 20,00
2 1111 Padaria Pão Unidade 15,00
3 2222 Padaria Broa Unidade 12,00
4 3333 Frutaria Alface Embalagem 30,00

Neste caso, o que pretendo é que apenas apareça a linha "4 3333 Frutaria Alface Embalagem 30,00", ocultando a linha "1 3333 Frutaria Alface Embalagem 20,00"

Agradeço desde já a ajuda!
Abraço!

 
Postado : 29/07/2018 12:20 am
(@wzxnet7)
Posts: 0
New Member
 

Bom dia.
Veja se te ajuda.

 
Postado : 30/07/2018 6:28 am
(@apache81)
Posts: 0
New Member
Topic starter
 

Boa noite,
Na sua planilha, funciona de acordo com o pretendido, mas quando passo a macro para a minha planilha, dá erro " Compile Error - User-Defined type not defined"
Sabe o porquê?

 
Postado : 30/07/2018 6:43 pm
(@wzxnet7)
Posts: 0
New Member
 

Verifique se o codename está de acordo.
Se não estiver, mude a instanciação da variável "w" para o codename certo.
No meu código, a planilha instanciada é a planilha1 (não é o nome da worksheet que está entre parênteses... é o mais à esquerda.

 
Postado : 30/07/2018 6:53 pm
(@apache81)
Posts: 0
New Member
Topic starter
 

Continua a dar o mesmo erro...
tentei anexar a planilha completa para ser mais fácil, mas é demasiado grande...
Pode enviar-me o seu mail, para eu enviar por lá?

 
Postado : 30/07/2018 8:06 pm
(@wzxnet7)
Posts: 0
New Member
 

Bom dia.
Na janela do VBA (no alto) clique em " ferramentas" -> "Referências" e procure na lista de bibliotecas a seguinte:
"MICROSOFT SCRIPTING RUNTIME e selecione a caixinha correspondente (feito isso essa biblioteca vai subir e ficar junto com as primeiras que já estavam marcadas).
Depois disso rode o código.
Se ainda persistir o erro ( eu duvido ) suba sua planilha pro google drive (ou similar) e poste o link aqui no fórum.

 
Postado : 31/07/2018 1:44 am
(@apache81)
Posts: 0
New Member
Topic starter
 

Já consegui :)
Reparei é que as ceculas da coluna "B" a zero não ficam ocultas...
Dá para acrescentar ao código?
De resto funciona impecável!
Obrigado

 
Postado : 31/07/2018 4:11 am
(@wzxnet7)
Posts: 0
New Member
 

Não entendi.

 
Postado : 31/07/2018 9:44 am
(@apache81)
Posts: 0
New Member
Topic starter
 

As células que se encontram na coluna "B", caso estejam em branco ou a zeros, também devem ficar ocultas...

Já vi que foi erro meu, não coloquei essa info no pedido...

Caso possa rectificar, fico agradecido.
Desculpe o transtorno...

 
Postado : 31/07/2018 1:55 pm
(@wzxnet7)
Posts: 0
New Member
 

Veja agora.
*Quando quiser agradecer, clique na "mãozinha"

Sub main()
    On Error GoTo errMain
    Dim w As Worksheet
    Dim i As Long, j As Long
    Dim dic As Dictionary
    Dim list As Dictionary
    Dim m() As Variant
    Dim sValor As String
    Dim mprincipal As Variant
    Dim maior As String
    Dim chave As String
    
    
    Set dic = New Scripting.Dictionary
    Set list = New Scripting.Dictionary
    Set w = Planilha1
    
        If w.ProtectContents Then
        
            MsgBox "Desproteja a planilha antes de executar !"
            Exit Sub
        End If
    
        Application.ScreenUpdating = False
    
        If w.AutoFilterMode Then w.AutoFilterMode = False
    
    w.Rows("1:300").EntireRow.Hidden = False
    mprincipal = w.Range("a1:f300").Value
    
    
        For i = 1 To 300
        
            sValor = VBA.UCase$(mprincipal(i, 2))
            
            If Not dic.Exists(sValor) Then dic.Add sValor, sValor
        
        Next i
    
    
        For i = 0 To dic.Count - 1
        ReDim m(1 To 300)
        
            For j = LBound(mprincipal, 1) To UBound(mprincipal, 1)
            
                If VBA.UCase$(mprincipal(j, 2)) = dic.Items(i) Then
                
                    m(j) = mprincipal(j, 6)
                   
                
                End If
            
            
            Next j
        
        maior = WorksheetFunction.Max(m)
        
        
        list.Add dic.Items(i), maior
        
        
        Next i
    
    
     For i = 1 To 300
     chave = VBA.UCase$(w.Cells(i, 2))
     
     maior = list.Item(chave)
     
        If w.Cells(i, 6) <> maior Or w.Cells(i, 2) = "" Or w.Cells(i, 2) = 0 Then
        
            w.Rows(i).EntireRow.Hidden = True
        
        
        End If
    
     Next i
    
    
    
    Set list = Nothing
    Set dic = Nothing
    Set w = Nothing
    
    Erase m
    Erase mprincipal
    Application.ScreenUpdating = True
    Exit Sub
    
errMain:
    Application.ScreenUpdating = True
    MsgBox "Um erro ocorreu, verifique !"


End Sub
 
Postado : 01/08/2018 2:54 am