Prezados, bom dia!
Alguém sabe como resolver isso?
o código que está gerando o erro, é esse:
Sub LIMPARVAZIOS() Dim wsheet As Worksheet Dim CountLin, i, l As Integer Dim linha, qtplan As Integer qtplan = Worksheets.Count - 2 Application.ScreenUpdating = False 'Application.Visible = True For Each wsheet In Worksheets wsheet.Select CountLin = wsheet.Range("A1048576").End(xlUp).Row If wsheet.Name <> "Planilha1" And wsheet.Name <> "Planilha2" Then wsheet.Range("E2").Select For i = 2 To CountLin Cells(i, 5).Select If Cells(i, 5).Value = "0" Then linha = ActiveCell.Row Rows(linha).Delete linha = Empty i = i - 1 End If Next i End If Next Application.ScreenUpdating = True Set wsheet = Nothing CountLin = Empty i = Empty l = Empty linha = Empty qtplan = Empty pctCompl_4 = Empty pctCompl_5 = Empty MsgBox "PROCESSO CONCLUÍDO" End Sub
É um código simples, utilizado para percorrer as linhas das Worksheets presentes no Workbook, e apagá-las, segundo critério.
Será que é alocação de memória? como resolver?
Vlw pessoal!
Acredito que não disponibilizou a rotina inteira, assim como acredito que o erro nada tem em relação a rotina.
Experimente altera-la conforme abaixo e veja como se comporta:
Sub LIMPARVAZIOS() Dim wsheet As Worksheet Dim CountLin As Integer, i As Integer Application.ScreenUpdating = False For Each wsheet In Worksheets wsheet.Select If wsheet.Name <> "Planilha1" And wsheet.Name <> "Planilha2" Then wsheet.Range("E2").Select CountLin = wsheet.Range("E1048576").End(xlUp).Row For i = CountLin To 2 Step -1 Cells(i, 5).Select If Cells(i, 5).Value = "0" Then Selection.EntireRow.Delete End If Next i End If Next End Sub
Reinaldo
Bom dia, meu bom!
Disponibilizei sim.
Eu tenho uma workbook com 180 workseets.
Em cada uma dessas worksheets existem em média 4mil linhas com informações relacionadas a mercadorias. Quer seja tributação, valores, quantidade, preço, etc.
Dentre essas mercadorias, existem algumas que não possuem saldos em estoque e estou excluindo-as. Aí uso esse código.
Ele funciona normalmente quando faço com um número reduzido worksheets (com umas 10 +/-). Mas trava quando uso todas.
Queria ver se dava pra contornar esse erro de memória, para que eu não tenha que ficar executando a rotina picada, sacou?
Vou testar sua sugestão aqui e te falo. Muito Obrigado!
Acredito que não disponibilizou a rotina inteira, assim como acredito que o erro nada tem em relação a rotina.
Experimente altera-la conforme abaixo e veja como se comporta:Sub LIMPARVAZIOS() Dim wsheet As Worksheet Dim CountLin As Integer, i As Integer Application.ScreenUpdating = False For Each wsheet In Worksheets wsheet.Select If wsheet.Name <> "Planilha1" And wsheet.Name <> "Planilha2" Then wsheet.Range("E2").Select CountLin = wsheet.Range("E1048576").End(xlUp).Row For i = CountLin To 2 Step -1 Cells(i, 5).Select If Cells(i, 5).Value = "0" Then Selection.EntireRow.Delete End If Next i End If Next End Sub
Infelizmente o código também está retornando erro de memória.
Caraca, não é possível que não há algo a se fazer. rs
leomsx3, você chegou a testar em outros computadores ? pra ver se tem o mesmo erro ?
O ideal seria voce disponibilizar o seu modelo com dados ficticios se for preciso.
Eu já passei por isso e depois de muitas tentativas, como meu modelo tinha varios formulários e rotinas, e algumas instruções que não utilizava, tipo um lixo no meio do projeto, eu fiz uma limpeza minuciosa, pesquisei por todas as variaveis se realmente estava limpando ela apos armazenar em memória, e por ultimo salvei com outro nome e resolveu, outra situação tambem que chaguei a fazer fopi criar um novo projeto e copiar os formulários e rotinas para esse, o qual parou tambem de dar o erro.
Então, de inicio, faça uma varredura em todo seu projeto, verifique todas as variáveis, chamadas de abertura de Formulários, elimine toda rotina que não utiliza e procure diminuir os modulos, deixando a aplicação mais enxuta.
Por hora é o que posso dizer, ajuda mais precisa, só vendo o seu modelo e se chegar a ocorrer o erro.
[]s
Mauro Coutinho
Meu amigo, boa tarde
obrigado pela resposta.
Já tentei tudo isso que voce mencionou, mas sem sucesso. Revisei tudo, zerei as variáveis, simplifiquei o código e até limpei o cache. E o foda é que a planilha é muito grande. Tem mais de 200MB.
Mas de qualquer forma, depois de tanto pesquisar, me aventurando por algumas pesquisas com os gringos, acho encontrei algo que talvez resolva o meu problema.
Em uma postagem, encontrei um cara falando que depois de cada estrutura "For", incluir o comando "ThisWorkbook.Save". Ele não soube explicar o porque, e eu também não sei, mas fiz o acompanhamento através do Gerenciador de Tarefas e milagrosamente o uso da memória reinicia a cada salvamento da planilha.
Obviamente isso deixa o código um pouco mais lento, mas se conseguir concluir o processo sem erros de memória, já estou muito satisfeito. Aqui, por exemplo, já passou do % em que costumava travar. Vamos ver se termina. Vou atualizando vocês.
Obrigado pelas contribuições.