Bem,
fernando fernandes
Então, essas variáveis que você precisa em outras rotinas, você não as deve destruir até não precisar mais delas.
Mas acostume-se a sempre destruir aquelas que não são mais necessárias.
'--------------------------------------------------------------------------------------- ' Modulo : xlApplication / Módulo ' Rotina : RemoveObjectsFromMemory() / Sub ' Autor : Jefferson Dantas (jefferdantas@gmail.com) ' Data : 07/11/2012 - 16:42 ' Revisão : Fernando Fernandes (fernando.fernandes@outlook.com.br) ' Data : 07/01/2013 (mdy) ' Proposta : Remove crap from memory '--------------------------------------------------------------------------------------- Public Sub RemoveObjectsFromMemory(ParamArray Objects() As Variant) On Error Resume Next 'Resume next necessario em caso de erro Dim Counter As Integer For Counter = 0 To UBound(Objects) Step 1 Select Case TypeName(Objects(Counter)) Case "Boolean" Objects(Counter) = False Case "Variant" If VBA.IsArray(Objects(Counter)) Then Erase Objects(Counter) Objects(Counter) = Empty Case "String" Objects(Counter) = vbNullString Case "Worksheet" Set Objects(Counter) = Nothing Case "Workbook" Objects(Counter).Close SaveChanges:=False Set Objects(Counter) = Nothing Case "Database", "Recordset2", "Recordset" Objects(Counter).Close Set Objects(Counter) = Nothing Case Else Set Objects(Counter) = Nothing 'Suggestion: If VBA.IsObject(Objects(Counter)) Then Set Objects(Counter) = Nothing Else Objects(Counter) = Empty End If End Select Next Counter On Error GoTo 0 End Sub
Mas como foi dito a macro fecha a planilha, então não pude usar.
Como estou na base do projeto, tenho que definir o rumo.
Olhei o uso de memoria que começou com 100m e quando vi estava em 700m no excel.
Como já tinha feito varias coisas, e aberto varias planilha não sei oq chegou a inchar a memoria usada.
Estou tentando definir como e oq liberar da memoria enquanto faço testes das novas macros.
= Nothing
= Empty
deram mensagem de erro
Então fiz testes de definição.
Public ColunO() As Variant Public ColunD() As Variant Sub mnmemoria()'usa Arrays publicas ColunO = Range("A1:FF16000") ColunD = ColunO ColunO = ColunD ColunD = Range("A1:FF16000") MsgBox "olhe o gerenciador de tarefas novamente" ColunD = Range("A1:F10") ColunO = Range("A1:F10") 'ReDim ColunO(1) 'ReDim ColunD(1) End Sub
Observando o gerenciador de tarefas
Com essa macro,
Ao trocar as seleções, pude perceber que Redim Libera a memoria usada.
A Redefinição de conteúdo tbm libera a memoria usada.
Na minha planilha o uso foi
De 77m para 199m, e depois voltou para 77m novamente.
Então em questão de "Arrays publicas "
Como a quantidade é limitada, e sempre vai existir Redefinição de Conteúdo e Tamanho, não creio ter muitos problemas "acho"
Ao final de processos grandes se pode usar Redim nomeArray(1)
Com variáveis definidas dentro das macros...
Sub arratest() Dim arr(),arr2() arr = Range("A1:FF16000") arr2=arr MsgBox "olhe o gerenciador de tarefas novamente" End Sub
Essa macro tbm liberou a memoria no final do processo.
Mas...
Depois de alguns testes, e alguns sobe e desce de uso de memoria,
"SEM FAZER NADA NO Excel"
de 77m o uso de memoria do excel já estava 82M
Ao final do processo, o uso de memoria cai para o nível que estava antes,
mas pouco tempo depois sobe um pouquinho .
Levando a crer que se a planilha ficar aberta horas seguidas com testes e mais testes, ou no uso normal.
Mesmo a memoria sendo liberada das variáveis o uso de memoria vai inchar.
Então, O que infla a memoria usada?
e oq fazer para isso não ocorrer?
tem que fechar e reabrir o excel para liberar memoria?
att
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.
"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
Na minha planilha o uso foi
De 77m para 199m, e depois voltou para 77m novamente.
Exatamente. Matrizes inflam o uso da memória.
Então em questão de "Arrays publicas "
Como a quantidade é limitada
Pq vc tá insistindo nisso? Uma matriz até tem limite (como já falei), mas não por serem públicas... Sim pelo tamanho da tóra de dados que vc tenta enfiar nela...
, e sempre vai existir Redefinição de Conteúdo e Tamanho, não creio ter muitos problemas "acho"
"RE"definir é "RE"trabalho. Pense sempre se precisa mesmo redefinir algo ou se podia ter passado como parâmetro antes.
Ao final de processos grandes se pode usar Redim nomeArray(1)
O jeito certo de matar uma matriz inteira é:
Erase Matriz
Ela volta ser uma variável do tipo Variant sem conteúdo.
Se for usar meu código, chame-o assim:
Call RemoveObjectsFromMemory(Matriz)
Ele já faz isso pra vc. (O ReDim e o Redim Preserve usam mais processamento e por isso são mais lentos que simplesmente usar "Erase Matriz" ou ainda "Matriz = Empty".
Essa macro tbm liberou a memoria no final do processo.
Depois de alguns testes, e alguns sobe e desce de uso de memoria,
"SEM FAZER NADA NO Excel"
de 77m o uso de memoria do excel já estava 82M
Sim, conforme os Excéis ficam melhores e os Windows tb, eles estão gerenciando isso melhor. Mas como nunca sabemos aonde o usuário está rodando a macro, pode ser Excel antigo, pode ser Windows XP, o ideal é sempre fazermos o que podemos para deixar o "ambiente" igual ou melhor do que estava quando o encontramos (minha mãe me ensinou isso, qto a gotas de xixi na privada).
Como não podemos melhorá-lo, devemos eliminar tudo que enfiamos na memória.
Se você matar a matriz como eu to dizendo, sua chance de sucesso para voltar ao ponto de partida será melhor...
Então, O que infla a memoria usada?
e oq fazer para isso não ocorrer?
tem que fechar e reabrir o excel para liberar memoria?
Ótimas perguntas:
1) O que infla, é seu uso. O que você põe lá e não tira. Os arquivos que você abre e não fecha. As variáveis que você acha que não precisa limpar. E claro, sempre pode ter algo mais que eu não listei aqui. O ideal é vc desfazer SEMPRE o que você fez. Se o uso da memória ficar mais alto, paciência. Você terá feito sua parte. Entendeu ?
2) Fechar e reabrir o Excel certamente vai retornar seu uso de memória para o estado inicial.
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
eu tentei usar
Call RemoveObjectsFromMemory(Matriz)
mas não diminuiu a memoria usada
e como falei não tinha feito mais nada no excel apenas rodado essas macros de teste
e elas não alteram a planilha apenas pegam valores
bem estou tentando entender os procedimentos
ColunO = Empty gerou erro
Matriz = Empty nao limpou a memoria
estou usando variaveis publicas para usa-las em cascata
sempre são redefinidas ao inicio de um procedimento
eu defino procedimento como conjuntos de macros rodando um depois da outra pra gerar o efeito planejado
Ex.
vou pegar o Setor1 da aba plan2 , inverter os lados "Espelhar", e colar no setor2 da plan ativa
o procedimento ficaria assim
Call inicio call SetorN(1,"plan2") ColunO = sheets("plan2").Range(Ti & Li, Cf & Lf).Value2 Call Espelhar(ColunO, 1) Cqo=Cq Call SetorN(2) call ColunasN(Cqo) 'ajusta quantidade de colunas do Setor2 para caber os dados que vai receber Range(Ti & Li, Cf & Lf).Value2=ColunO Call Final FIM do Procedimento
no meu desenvolvimento fica ainda menor
call inicio call Copia_SetorO(1,"plan2") Call Espelhar(ColunO, 1) call Colar_Setor(2,Coluno) call final FIM do Procedimento
Praticamente eu já fazia assim antes, mas não sabia usar Byref
No final disso tudo eu poderia matar "ColunO" que é uma array publica
Ed escreveu:Então em questão de "Arrays publicas "
Como a quantidade é limitadaPq vc tá insistindo nisso? Uma matriz até tem limite (como já falei), mas não por serem públicas
Falei limites na quantidade que se vai usar, e não no tamanho delas. (Não vão ser "Muitas" variaveis publicas)
Ed escreveu:, e sempre vai existir Redefinição de Conteúdo e Tamanho, não creio ter muitos problemas "acho"
"RE"definir é "RE"trabalho. Pense sempre se precisa mesmo redefinir algo ou se podia ter passado como parâmetro antes.
ainda estou me acostumando com ByRef, e tentando definir o uso em cascatas de procedimentos, que é o modo que vou usar.
Apenas mexo nessa planilha, quando comecei não sabia nem que existia variaveis publicas, e agora...
sei que meu desenvolvimento é lento, mas eu tento né...
Att.
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.
"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
Vamos lá:
Falei limites na quantidade que se vai usar, e não no tamanho delas. (Não vão ser "Muitas" variaveis publicas)
Eu em mais de 10 anos de carreira nisso (que não é muito) nunca alcancei esse limite a que vc se refere, de qtd de variáveis públicas. Isso pra mim é, desculpe o termo, uma regra cagada. Pode haver, mas eu não o vi ainda. E acredite, eu vi muuuuuitos limites no Excel, mas esse definitivamente não é um deles.
ainda estou me acostumando com ByRef, e tentando definir o uso em cascatas de procedimentos, que é o modo que vou usar.
Isso é bom, acostume-se. Leve o tempo que for necessário.
Apenas mexo nessa planilha, quando comecei não sabia nem que existia variaveis publicas, e agora...
sei que meu desenvolvimento é lento, mas eu tento né...
Eu fico feliz com as discussões e com o seu desenvolvimento e sua evolução. Espero poder ajudar sempre.
Um abraço.
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Falei limites na quantidade que se vai usar, e não no tamanho delas. (Não vão ser "Muitas" variaveis publicas)
Eu em mais de 10 anos de carreira nisso (que não é muito) nunca alcancei esse limite a que vc se refere,
, não quis dizer que existe limites no uso,
E sim que o numero de variáveis que o programador vai precisar definir como publicas vão ser muito poucas.
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.
"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
E sim que o numero de variáveis que o programador vai precisar definir como publicas vão ser muito poucas.
EXATO, agora estamos chegando num consenso. Sim, muito poucas e cada vez menos, até serem ou eliminadas por completo, ou restritas a um número mínimo devido a necessidade bem justificada !
Valeu Ed, essa última msg me deixou muito contente !
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Ola
No meus teste percebi que o Vba trata variáveis e de nomes iguais com escopo diferente como variáveis diferentes
Public ColunO() As Variant Sub test1() ColunO = Range("A1:ff20000")'uso de memoria sobe" claro né" End Sub Sub test2() Dim ColunO(1) As Variant MsgBox UBound(ColunO, 1)' o valor é 1 End Sub Sub test3() MsgBox UBound(ColunO, 1)' o valor é 20000 End Sub
talvez isso seja para evitar conflitos entre nomes de variáveis.
Teve até um teste estranho que dependendo da posição das macro no modulo o resultado mudava,
Tipo:
Se o Teste3 estivesse antes do Teste2 apresentava um resultado, se estivesse abaixo, apresentava outro.
Ps. Só consegui usar o Redim para limpar a memoria da Arrays, talvez pq elas sejam publicas.
Ps4. o Excel continuou a aumentar o consumo de memoria sem fazer nada, enquanto eu tirava um cochilo subiu de 82m para 101m
Será que é por causa do salvamento automático ?
Att.
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.
"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
Quando coisas estranhas acontecem e eu consigo replicar, e eu tiver com um humor animal, eu monto vários esquemas para medição e tirar conclusões. Assim acabo conhecendo ainda melhor a ferramenta e ensino mta coisa interessante.
Monte esquemas que possamos testar também, assim aumenta sua amostragem com os nossos resultados, ou ainda, podemos corrigir e/ou dar nossos pitacos...
Fica a dica!
Marque o tópico como resolvido se achar que já está, ok?
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Desculpe,
tinha até esquecido desse tópico
Fernando,
sobre limpar a memoria das arrays eu não consegui usar suas dicas, então no final de conjuntos de macros que passam as arrays umas paras as outras eu uso o Redim.
sobre escopo de variáveis nas macros pensei que já era de conhecimento comum
só achei estranho sopre o comportamento diferente dependendo da posição da macro no modulo,
mas isso parou de acontecer depois de trocar a posição 2 vezes para teste
att
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.
"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
Se o comportamento em memória muda, monte um modelo específico e poste aqui, quem sabe trabalharemos juntos para resolver o problema!
*crie novo tópico...
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Está tudo bem,
São apenas considerações de fatos que eu desconhecia
a minha planilha está funcionando normal e bem rápida
as macros quando acionadas nem dá para piscar e já executaram
att
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.
"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"