outra reformulação ...
 
Notifications
Clear all

outra reformulação de macro

12 Posts
2 Usuários
0 Reactions
1,821 Visualizações
(@juliowd)
Posts: 149
Estimable Member
Topic starter
 

Oi. Como eu consegui melhorar uma macro no post anterior, e aprendi pra caramba, gostaria de saber se existe algo que seja mais rápido do que essa programação que ja estou usando.
Segue abaixo:

'macro para copiar os valores acima de zero e com "..."

Z = 1

For i = 1 To 40000

If Plan4.Range("t" & i) = "..." And Plan4.Range("s" & i) < 0 Then

Plan9.Range("B" & Z) = Plan4.Range("B" & i)
Plan9.Range("C" & Z) = Plan4.Range("C" & i)
Plan9.Range("D" & Z) = Plan4.Range("D" & i)
Plan9.Range("E" & Z) = Plan4.Range("E" & i)
Plan9.Range("F" & Z) = Plan4.Range("F" & i)
Plan9.Range("G" & Z) = Plan4.Range("G" & i)
Plan9.Range("K" & Z) = Plan4.Range("k" & i)
Plan9.Range("L" & Z) = Plan4.Range("L" & i)
Plan9.Range("M" & Z) = Plan4.Range("M" & i)
Plan9.Range("N" & Z) = Plan4.Range("N" & i)
Plan9.Range("O" & Z) = Plan4.Range("O" & i)
Plan9.Range("P" & Z) = Plan4.Range("P" & i)
Plan9.Range("Q" & Z) = Plan4.Range("Q" & i)
Plan9.Range("R" & Z) = Plan4.Range("R" & i)
Plan9.Range("S" & Z) = Plan4.Range("S" & i)

Z = Z + 1

End If

Next

Obrigado pela ajuda!!
Abração!

 
Postado : 07/08/2014 12:58 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Além haver outras forma de se fazer tal macro, leia:
http://www.cpearson.com/excel/optimize.htm

No link contém ensinamentos de como melhorar de forma otimizada suas macros!!

Att

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

 
Postado : 07/08/2014 1:30 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde,

Veja se atende:

Sub Copiar()
    Dim Z As Long
    Dim i As Long
    
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    
    Z = 1
    
    For i = 1 To 40000
        If Plan4.Range("t" & i) = "..." And Plan4.Range("s" & i) < 0 Then
            Plan9.Range("B" & Z).Resize(1, 6) = Plan4.Range("B" & i).Resize(1, 6)
            Plan9.Range("K" & Z).Resize(1, 9) = Plan4.Range("K" & i).Resize(1, 9)
            Z = Z + 1
        End If
    Next
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Abraço

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

 
Postado : 07/08/2014 2:08 pm
(@juliowd)
Posts: 149
Estimable Member
Topic starter
 

Oi Alexandre. Muito legal seu post. Já salvei nos meus favoritos Vou consultar regularmente. Obrigado!!

JValq, obrigado pela sua sugestão. Como estou aprendendo, seria demais pedir para você me explicar o uso do número 1, 6, e 1, 9? Te pergunto isso pois vou usar em uma série de outras macros e queria entender bem.
Obrigado!!

 
Postado : 08/08/2014 2:27 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

1 = a linha que o loop iniciará

6 e 9 a dimensão das colunas que será aplicada..Ex: 1 3 usando Resize, seria de A até C...

Para mais leia:
http://www.homeandlearn.org/the_resize_property.html
http://msdn.microsoft.com/pt-br/library ... =office.15).aspx

Att

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

 
Postado : 08/08/2014 2:34 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Julio, uma vai até 1mil,outra até 40mil, pq?
Qual o limite de linhas?
Eu acho q vou fazer esse com matrizes tb, é fácil, super parecido, e roda umas 500 vezes mais rápido...

Soh queria entender o pq da escolha do número de linhas, é q tenho a impressão q vc ta fazendo muuuuitooo mais linhas do q necessário...

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

 
Postado : 08/08/2014 5:48 pm
(@juliowd)
Posts: 149
Estimable Member
Topic starter
 

Fernando, tens razão. Quando eu fiz esta ali, fiz um número bem grande. Depois passou e não mudei. 1000 é suficiente! hehehe Exagerei mesmo....

 
Postado : 08/08/2014 10:49 pm
(@juliowd)
Posts: 149
Estimable Member
Topic starter
 

Alexandre, eu ainda não entendi bem essa questão do 6 e do 9. Tem relação com as colunas? É que na coluna A eu nunca deixo dados, pra ganhar um espacinho. Então sempre começa na B... continuei sem entender... =/ Talvez seja a hora também... rsrs

 
Postado : 08/08/2014 10:53 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vc ainda não respondeu a pergunta, se então 1mil é suficiente, pq? Vc tá pegando o número total de linhas? É essa sua intenção? Os códigos podem sem dificuldade, enxergar qual a última linha preenchida. Se for 100 ou 10000, isso pode ser dinâmico em código...

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

 
Postado : 09/08/2014 1:22 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde,

A propriedade Resize redimensiona um intervalo em função de uma célula, por exemplo.
O primeiro parâmetro são as linhas e o segundo as colunas, portanto [A1].resize(1,6) é equivalente a [A1].
Ou seja, é o intervalo que começa em A1 e tem 1 linha e 6 colunas.
Quanto ao que o Fernando falou, a impressão é que você determinou um intervalo grande para a macro percorrer.
A macro pode executar mais rápido se o intervalo for menor.
Se ele pode crescer seria interessante usar um intervalo dinâmico.
Para usar o intervalo dinâmico é necessário saber a última célula, que pode ser obtida de diversas formas.
Exemplos:

Plan1.UsedRange.Rows.Count
Plan1.[A1].CurrentRegion.Rows.Count

Abraço

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

 
Postado : 09/08/2014 10:44 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Corrigindo:

[A1].Resize(1,6) equivale a [A1]
[A1].Resize(6,1) equivale a [A1]

Abraço

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

 
Postado : 09/08/2014 3:14 pm
(@juliowd)
Posts: 149
Estimable Member
Topic starter
 

Ah, entendi!!
Então é isso!!
Eu realmente não sei quantas linhas serão preenchidas. Por isso jogo lá em cima, só pra não me preocupar depois.
Penso que 1000 seria suficiente. Mas se tem como fazer isso variável, ajuda mto minha vida.

 
Postado : 09/08/2014 6:28 pm