Notifications
Clear all

Forma de acelerar o processamento

12 Posts
3 Usuários
0 Reactions
2,086 Visualizações
(@bellizzi)
Posts: 33
Eminent Member
Topic starter
 

Amigos, boa tarde.

Normalmente utilizo o código application.screenupdating para deixar minhas macros mais limpas e um pouco mais ágeis. Mas fiquei na dúvida se existe alguma forma de deixar ainda mais rápido meu código para serem processados ou se existe algum que acelere o processamento.

Caso alguém saiba me responder, fico grato.

abraço,

Leandro

 
Postado : 18/03/2015 9:22 am
(@edcronos)
Posts: 1006
Noble Member
 

a melhor maneira é otimizando todo o codigo e planilha

se mover grandes quantidades de dados em uma planilha cheia de formulas torna o processo lento mesmo com
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

isso pq o excel checa celulas dependentes
então ou se usa array ou uma aba auxiliar ou até os dois para colar os dados todos de uma vez

tipo, para adicionar uma quantidade de formulas na planilha e essa já tem varias formulas
em vez se ser um loop por celula
pode colocar as formulas em um array e colar todas de uma vez na planilha

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"

 
Postado : 18/03/2015 6:31 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Para podermos sugerir como acelerar seu código, o ideal é você postar seu código ou partes dele, para mexermos em cada pedaço...

A sugestão do Edcronos é válida, trabalhar com matrizes é bem melhor em todos os sentidos, mas pra direcionarmos como vc pode trabalhar com elas, vc precisa abrir o seu código pra nós . .

Há também formas de trabalhar com dicionários, expressões regulares, manipulação de massas de dados em memória é tudo de bom no quesito desempenho.

Eu na verdade nunca dependo de ScreenUpdating ou de mudar o Calculation para manual... Esses são sim recursos bacanas, que ajudam até, mas pra mim, são as ultimas coisas, e só uso quando necessário. O resto que, eu mencionei, acelera muito mais o código...

FF

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

 
Postado : 19/03/2015 7:59 am
(@bellizzi)
Posts: 33
Eminent Member
Topic starter
 

Agradeço pelas ajudas.
Eu ainda não conheço muito de programação de excel. trablhar com array eu ainda não consegui compreender como fazer, pois pego diversas planilhas com muitas linhas e colunas e em diferentes formatos e, para transporta-los para dentro do array me complico todo.

Quanto a modificar meu código não sei se iria conseguir muito pensar em como, pois como disse, sou leigo ainda em programação. Mas segue um deles:

Sub Controlegiratório11_Alteração()

Application.ScreenUpdating = False

Dim mes As String

Select Case Range("I70").Value
Case 1
Range("J70").Value = CStr("Janeiro")
Range("L72").Value = Format(Range("E59").Value / 12, "0.00%")
Range("K72").Value = Format(Range("D59").Value / 12, "0.00%")
Case 2
Range("J70").Value = CStr("Fevereiro")
Range("L72").Value = Format(Range("E59").Value / 6, "0.00%")
Range("K72").Value = Format(Range("D59").Value / 6, "0.00%")
Case 3
Range("J70").Value = CStr("Março")
Range("L72").Value = Format(Range("E59").Value / 4, "0.00%")
Range("K72").Value = Format(Range("D59").Value / 4, "0.00%")
Case 4
Range("J70").Value = CStr("Abril")
Range("L72").Value = Format(Range("E59").Value / 3, "0.00%")
Range("K72").Value = Format(Range("D59").Value / 3, "0.00%")
Case 5
Range("J70").Value = CStr("Maio")
Range("L72").Value = Format((Range("E59").Value / 12) * 5, "0.00%")
Range("K72").Value = Format((Range("D59").Value / 12) * 5, "0.00%")
Case 6
Range("J70").Value = CStr("Junho")
Range("L72").Value = Format(Range("E59").Value / 2, "0.00%")
Range("K72").Value = Format(Range("D59").Value / 2, "0.00%")
Case 7
Range("J70").Value = CStr("Julho")
Range("L72").Value = Format((Range("E59").Value / 12) * 7, "0.00%")
Range("K72").Value = Format((Range("D59").Value / 12) * 7, "0.00%")
Case 8
Range("J70").Value = CStr("Agosto")
Range("L72").Value = Format((Range("E59").Value / 12) * 8, "0.00%")
Range("K72").Value = Format((Range("D59").Value / 12) * 8, "0.00%")
Case 9
Range("J70").Value = CStr("Setembro")
Range("L72").Value = Format((Range("E59").Value / 12) * 9, "0.00%")
Range("K72").Value = Format((Range("D59").Value / 12) * 9, "0.00%")
Case 10
Range("J70").Value = CStr("Outubro")
Range("L72").Value = Format((Range("E59").Value / 12) * 10, "0.00%")
Range("K72").Value = Format((Range("D59").Value / 12) * 10, "0.00%")
Case 11
Range("J70").Value = CStr("Novembro")
Range("L72").Value = Format((Range("E59").Value / 12) * 11, "0.00%")
Range("K72").Value = Format((Range("D59").Value / 12) * 11, "0.00%")
Case 12
Range("J70").Value = CStr("Dezembro")
Range("L72").Value = Format(Range("E59").Value, "0.00%")
Range("K72").Value = Format(Range("D59").Value, "0.00%")

End Select

Application.ScreenUpdating = True

End Sub

No caso deste código, eu tenho valores que são calculados em várias tabelas com formulas e este calculo no meu código já é a forma final como deve ficar ao ser acionado um botão que inseri para rolagem automática.

 
Postado : 19/03/2015 11:17 am
(@bellizzi)
Posts: 33
Eminent Member
Topic starter
 

Tratando do assunto "Array", a única forma que eu paro para pensar é utilizando laços for next ou for each next. Entretato apenas conheço o range("??" & rows.count).end(xlUp).row para fazer contagem, nunca testei para contar colunas e para tentar utilizar com laços for e for each.

 
Postado : 19/03/2015 11:20 am
(@edcronos)
Posts: 1006
Noble Member
 

olha
umas poucas pesquisas vc vai entender bem array
se vc sabe o tamanho da range da qual quer pegar é só
suarray=range(suarange).value2

aí vc trabalha na array e cola os dados de volta
range(suarange).value2=sua range

bem,
claro que não é tão simples vc vai ter que aprender a estruturar sues codigos

oq pode ser bem complicado, mas depois fica uma maravilha

eu disponibilizei algumas planilhas que usa arrays aqui no planilhando algumas que fiz para outras pessoas

se bem que o fernando pode falar que as minha macros são muito complicadas para alguem entender

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"

 
Postado : 19/03/2015 11:31 am
(@bellizzi)
Posts: 33
Eminent Member
Topic starter
 

Derrepente conseguem me ajudar com este código:

Select Case Range("K5").Value
Case 1
Range("J5").Value = CStr("Janeiro")
Range("X6").Value = CInt("4")
Range("H80").Value2 = Format(CDbl((Range("D47").Value2 / 12) * 1), "0.0%")
Range("I80").Value2 = Format(CDbl((Range("E47").Value2 / 12) * 1), "0.0%")
Case 2
Range("J5").Value = CStr("Fevereiro")
Range("X6").Value = CInt("8")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 2, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 2, "0.0%")
Case 3
Range("J5").Value = CStr("Março")
Range("X6").Value = CInt("12")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 3, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 3, "0.0%")
Case 4
Range("J5").Value = CStr("Abril")
Range("X6").Value = CInt("16")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 4, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 4, "0.0%")
Case 5
Range("J5").Value = CStr("Maio")
Range("X6").Value = CInt("20")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 5, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 5, "0.0%")
Case 6
Range("J5").Value = CStr("Junho")
Range("X6").Value = CInt("24")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 6, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 6, "0.0%")
Case 7
Range("J5").Value = CStr("Julho")
Range("X6").Value = CInt("28")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 7, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 7, "0.0%")
Case 8
Range("J5").Value = CStr("Agosto")
Range("X6").Value = CInt("32")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 8, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 8, "0.0%")
Case 9
Range("J5").Value = CStr("Setembro")
Range("X6").Value = CInt("36")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 9, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 9, "0.0%")
Case 10
Range("J5").Value = CStr("Outubro")
Range("X6").Value = CInt("40")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 10, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 10, "0.0%")
Case 11
Range("J5").Value = CStr("Novembro")
Range("X6").Value = CInt("44")
Range("H80").Value2 = Format((Range("D47").Value2 / 12) * 11, "0.0%")
Range("I80").Value2 = Format((Range("E47").Value2 / 12) * 11, "0.0%")
Case 12
Range("J5").Value = CStr("Dezembro")
Range("X6").Value = CInt("48")
Range("H80").Value2 = Format(Range("D47").Value2, "0.0%")
Range("I80").Value2 = Format(Range("E47").Value2, "0.0%")

No final, ele sempre me retorna um numero da seguinte forma : '0,2% (por exemplo de calculo)

Tenho um gráfico dinamico que pega este resultado. Como posso fazer para que não entre este apostrofo no valor final apos rodar o código?

 
Postado : 19/03/2015 1:31 pm
(@edcronos)
Posts: 1006
Noble Member
 

bem , para mim vai ser meio dificil,
pq nunca usei case, nem planilha nem graficos dinamicos

mas tem algo errado aqui
Range("H80").Value2 = Format(Range("D47").Value2, "0.0%")

veja bem
Value2 vai pegar ou gravar o valor real
e format está forçando uma formatação

deveria ser assim

sendo que H80 já está com uma formatação que vc quer
Range("H80").Value2 = Range("D47").Value2

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"

 
Postado : 19/03/2015 2:00 pm
(@bellizzi)
Posts: 33
Eminent Member
Topic starter
 

Funcionou perfeitamente, obrigado.

 
Postado : 19/03/2015 2:12 pm
(@edcronos)
Posts: 1006
Noble Member
 

olha
tem como diminuir as linhas dessa macro,

um laço for e variaveis
vou tentar aqui

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"

 
Postado : 19/03/2015 2:18 pm
(@edcronos)
Posts: 1006
Noble Member
 

Sub tesd()
dt = Range("K5").Value2
mesa = Array("Janeiro", "fevereiro", "complete o restante :P ")

Range("J5").Value = mesa(dt - 1)
Range("X6").Value = 4 * dt
Range("H80").Value2 = (Range("D47").Value2 / 12) * dt
Range("I80").Value2 = (Range("E47").Value2 / 12) * dt

End Sub

complete a array e tenta aí

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"

 
Postado : 19/03/2015 2:28 pm
(@bellizzi)
Posts: 33
Eminent Member
Topic starter
 

irei testar amanha e te aviso se funcionou, hj já estou saindo do trabalho. Obrigado.

 
Postado : 19/03/2015 2:39 pm