Notifications
Clear all

MACRO DEMORANDO MUITO TEMPO

8 Posts
3 Usuários
0 Reactions
2,365 Visualizações
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

Pessoal, boa noite!

Gostaria de uma ajuda. Tenho um relatório que preciso deletar linhas de acordo com alguns critérios. Como o relatório tem mais de 18 mil linhas, a rotina que escrevi está muito lenta e trava no final. Alguém pode me ajudar a melhorar o desempenho, de repente com uma outra estrutura?
Agradeço desde já.

Abaixo a macro que escrevi:

Sub LimparRelatorio()
  Dim Lin       As Long
  Dim uLin      As Long
  Dim Wks       As Worksheet
  
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Application.Calculation = xlCalculationManual
  Application.EnableEvents = False
  
  Set Wks = ActiveSheet
  uLin = Wks.Cells(Rows.Count, 1).End(xlUp).Row
  
  For Lin = uLin To 2 Step -1
    Select Case Cells(Lin, 9).Value
      Case Is = 1000, 1010: Rows(Lin).Delete
    End Select
    Select Case Cells(Lin, 12).Value
      Case Is = 0: Rows(Lin).Delete
    End Select
  Next Lin

  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
  Application.Calculation = xlCalculationAutomatic
  Application.EnableEvents = True

End Sub
 
Postado : 23/11/2019 10:01 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Qual a possibilidade de na "geração" do relatório omitir essas linhas.
Aparentemente a "demora"(18000 linhas não é muito;) deve-se ao calculo da planilha; ja que depois de excluir as linhas desejadas (ou indesejadas) e "religado" o calculation

Reinaldo

 
Postado : 24/11/2019 7:41 am
(@mprudencio)
Posts: 2749
Famed Member
 

Se disponibilizar a planilha fica mais facil.

Pesquise sobre arrays, pode te ajudar

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 24/11/2019 8:36 am
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

rlm
Neste caso não consigo uma vez que o relatório vem de uma ERP. Então por default ele traz todas os dados desta tabela, o que inclui todos os campos. Por isso que tenho que tratar manualmente ou com VBa, o que está demorando muito tempo. Por isso pensei numa estrutura com processamento (performance) mais rápido, sendo essa minha dificuldade.

Mprudencio
Pesquisei por Arrays também mas como o objetivo é a exclusão de dados específicos, não sei como fazer.
Tentei enviar o anexo mas parece que a ferramenta está desabilitada. Tem como enviar por e-mail ou, de repente, enviar um link onde a planilha está armazenada na nuvem?

 
Postado : 24/11/2019 12:45 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Disponibilize seu modelo/exemplo em algum site de compartilhamento tipo Sendspace/Mega/dropbox/google drive.. e informe o link de download aqui no fórum.
Por curiosidade, qual o tempo aproximado de processamento

Reinaldo

 
Postado : 24/11/2019 2:23 pm
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

Reinaldo,

Obrigado pela colaboração. Retificando: O total de linhas é de 180.000 ao 18.000.
O tempo decorrido de processamento está girando em torno de 06:30 minutos.
Segue o link do arquivo via Onedrive.
Obrigado pela ajuda.

https://1drv.ms/u/s!AtN5peOJcG4lhpkMqVe ... A?e=0hvSqC

 
Postado : 24/11/2019 3:43 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Segue uma possibilidade, utilizando Sql e salvando dados em nova sheet; nos testes rapidos em meu velho note rodou em menos de 1 minuto
Execute a rotina "BuscaRegistros"
Experimente e veja se atende https://www.sendspace.com/file/8f7whq

Reinaldo

 
Postado : 25/11/2019 10:00 am
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

Reinaldo,
Realmente a performance melhorou muito com SQL.
Vou checar o resultado.
Muito obrigado por sua colaboração.

 
Postado : 25/11/2019 7:57 pm