Notifications
Clear all

Código deixa planilha lenta !

5 Posts
2 Usuários
0 Reactions
579 Visualizações
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Bom dia !

Recentemente postei uma necessidade de ocultar/exibir uma linha com uma fórmula em determinada coluna. Quando o resultado da operação fosse ZERO a linha deveria ser oculta. Quando o resultado fosse maior que ZERO, a linha voltaria a ser exibida.

O colega RLN postou a solução o que me ajudou bastante. Mas ao utilizar o código em mais de uma aba da planilha, o código deixou o processamento muito lento. Fiz os testes e quanto mais eu uzar o código em diferentes aba (com range diferentes), a planilha fica mais lenta.

Minha dúvida é, teria como aperfeiçoar o código de alguma forma a melhorar o processamento?. Talvez em outro evento da planilha.

Talvez o próprio RLN possa ter uma solução mais ágil.

Agradeço a todos.

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




Private Sub Worksheet_Calculate()
Application.ScreenUpdating = False
For Each cell In Range("N12:N121")
If cell.Value = 0 Then
cell.EntireRow.Hidden = True
Else
cell.EntireRow.Hidden = False
End If
Next
Application.ScreenUpdating = True
End Sub
 
Postado : 26/02/2015 6:37 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Você está lendo o objeto range, quanto mais vc coloca isso, pior vai ficar sim, a cada recalculada, é um risco grande.
Eu dei uma melhorada no desempenho do código, mas eu sugiro que vc não deixe esse código no calculate das planilhas, deveria deixar em algum evento menos disparado.
Enfim, fica aí o código novo, e testado!

Private Sub Worksheet_Calculate()
Dim rngEsconder As Excel.Range
Dim arrConteudo As Variant
Dim linConteudo As Long
Dim colConteudo As Long
    
    Application.ScreenUpdating = False
    With Range("BW12:BW111")
        arrConteudo = .Value
        .EntireRow.Hidden = False
    End With
    For linConteudo = LBound(arrConteudo, 1) To UBound(arrConteudo, 1)
    
        For colConteudo = LBound(arrConteudo, 2) To UBound(arrConteudo, 2)
            If arrConteudo(linConteudo, colConteudo) = 0 Then
            
                If Not rngEsconder Is Nothing Then
                    Set rngEsconder = Application.Union(rngEsconder, Cells(linConteudo, 1).EntireRow)
                Else
                    Set rngEsconder = Cells(linConteudo, 1).EntireRow
                End If
                
            End If
        Next colConteudo
        
    Next linConteudo
    If Not rngEsconder Is Nothing Then rngEsconder.EntireRow.Hidden = True

    Application.ScreenUpdating = True
End Sub


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

 
Postado : 26/02/2015 7:52 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Olá Fernando!

Bom dia.

Obrigado pela atenção. Ok, vou tentar adaptar o código ao evento "change" por exemplo.
A solução funciona, mas em parte. Como o código anterior estava no evento Worksheet_Calculate, no range "BW12:BW111" havia uma fórmula do tipo,

=soma(NC50:BQ50

Quando o resultado for ZERO, a linha era oculta. Mas quando o resultado era maior que ZERO, a linha retornava.
Essa parte do código leva em consideração essa situação ou apenas se tem algum conteúdo na célula ?

 Application.ScreenUpdating = False
    With Range("a1:a10")
        arrConteudo = .Value
        .EntireRow.Hidden = False

Testei o código e as linhas do range que não tinha conteúdo algum foram ocultadas e as linhas onde o resultado da fórmula era ZERO não foram.

da forma como está, nã funciona para a condição descrita acima.

Obrigado!

 
Postado : 26/02/2015 8:40 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

poste por favor a fórmula toda, que retorna ZERO ...

O código exibe todas as linhas depois passa escondendo somente as que tem zero.
Preciso testar pra ver como ele se comporta com linhas vazias, mas não deveria esconder linhas com BW vazia nao...

O objetivo é exibir tudo, e depois varrer tudo e então esconder os ZEROS.

p.s.: pq ZEROS em maiúsculo ?!

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

 
Postado : 26/02/2015 9:03 am
(@luizhcosta)
Posts: 420
Honorable Member
Topic starter
 

Hábito destacar palavras CHAVES em textos. Apenas isso!

 
Postado : 26/02/2015 10:25 am