Notifications
Clear all

Erro de Memória

6 Posts
3 Usuários
0 Reactions
1,686 Visualizações
(@leomsx3)
Posts: 4
New Member
Topic starter
 

Prezados, bom dia!

Alguém sabe como resolver isso?

https://ibb.co/hYtKBJb

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!

 
Postado : 12/11/2019 6:29 am
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

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

 
Postado : 12/11/2019 8:23 am
(@leomsx3)
Posts: 4
New Member
Topic starter
 

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!

 
Postado : 12/11/2019 8:57 am
(@leomsx3)
Posts: 4
New Member
Topic starter
 

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

 
Postado : 12/11/2019 12:55 pm
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

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

 
Postado : 12/11/2019 1:21 pm
(@leomsx3)
Posts: 4
New Member
Topic starter
 

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.

 
Postado : 12/11/2019 2:59 pm