reformulação de mac...
 
Notifications
Clear all

reformulação de macro

33 Posts
4 Usuários
0 Reactions
3,580 Visualizações
(@juliowd)
Posts: 0
New Member
Topic starter
 

Olá! Eu estou desenvolvendo uma planilha que já está funcionando. Porém funciona lenta. Muito lenta. E desconfio de uma programação específica.
Então eu gostaria da ajuda de vocês aqui do fórum com uma macro que seja mais rápida. Vou passar a macro que desconfio ser o problema.

'macro para deletar as linhas que contiverem "..."
For linha = 1000 To 6 Step -1
If ThisWorkbook.ActiveSheet.Range("t" & linha) = "..." Then
ThisWorkbook.ActiveSheet.Rows(linha).Delete
End If
Next linha

Agradeço a ajuda!!!
Um abraço.

 
Postado : 05/08/2014 3:01 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Meio difícil dizer, mas tente assim:

'macro para deletar as linhas que contiverem "..."
application.screenupdating = false
For linha = 1000 To 6 Step -1
If Range("t" & linha) = "..." Then
Rows(linha).Delete
End If
Next linha
application.screenupdating = true

Edit: Ah, outra coisa, usar o Active alguma coisa sempre é mais lento do que usar uma variável, ou do que ser específico, assim, poderia retirar essa parte.

 
Postado : 05/08/2014 3:32 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

ah sim... eu uso isso..
é que eu só passei parte da programação.. tem mais coisas antes e depois..
mesmo assim, valeu!!!!

 
Postado : 05/08/2014 3:37 pm
(@edcronos)
Posts: 1006
Noble Member
 

Julio,
existe varias maneira de se excluir linhas, mas para se definir a melhor maneira tem que se saber como é o layout da planilha
pode-se simplesmente mover os dados para juntar tudo "muito mais rápido"
mas as formatações não acompanham, Nem as formulas
para se definir a melhor maneira é um importante saber como é a sua planilha

download/file.php?id=13352

Essa planilha tem duas macros que Adiciona e Exclui linhas em branco

Uma Move os Valores e outra que Adiciona e Exclui Linhas
é só coloca a range da sua planilha na macro

 
Postado : 05/08/2014 4:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

o problema é o .Delete rodando mil vezes...

Eu usaria o Application.Union dentro do loop ao invés do .Delete... e depois que sair do loop, aplicar o .delete uma vez só... não vou poder fazer no seu arquivo, mas segue um exemplo relampago:

'macro para deletar as linhas que contiverem "..."
dim rngParaDeletar as Excel.Range
    set rngParaDeletar = activesheet.rows(1001)

    For linha = 1000 To 6 Step -1
        If ActiveSheet.Range("t" & linha) = "..." Then
            SET RNGPARADELETAR = application.union(rngparadeletar,ActiveSheet.Rows(linha))
        End If
    Next linha
    if not rngparadeletar = nothing then
        rngparadeletar.delete shift:=xlup
    endif
 
Postado : 05/08/2014 4:10 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, tentei usar seu código. Mas deu o seguinte:
ele marcou o NOTHING, e apareceu uma caixinha dizendo: erro de compilação. Uso inválido do objeto.

Edcronos, vou entender melhor a sua planilha pra fazer uns testes aqui e te dou um retorno em seguida do teste...

Obrigado!

 
Postado : 05/08/2014 5:11 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Erro primário meu... segue correção:

'macro para deletar as linhas que contiverem "..."
dim rngParaDeletar as Excel.Range
    set rngParaDeletar = activesheet.rows(1001)

    For linha = 1000 To 6 Step -1
        If ActiveSheet.Range("t" & linha) = "..." Then
            SET RNGPARADELETAR = application.union(rngparadeletar,ActiveSheet.Rows(linha))
        End If
    Next linha
    if not rngparadeletar IS nothing then
        rngparadeletar.delete shift:=xlup
    endif
 
Postado : 05/08/2014 5:35 pm
(@edcronos)
Posts: 1006
Noble Member
 

refiz a macro que excluir e adiciona linhas para excluir a linha inteira

Sub Adiciona_Exclui_Linhas_Em_Branco_De_Range_MoveLinhasColunaT()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    cr = Cells(1, "T").Column    'coluna de referencia indica a coluna que vai verificar se a Linhas está em branco
    
    l = 0 ' <<< Se Colocar ZERO apaga todas as linhas em branco, maior que zero adiciona linhas em branco
    
    Lf = 2    'Linha inicial da range

    Li = Cells(Rows.Count, cr).End(xlUp).Row    ' ultima linha da range
    tl = 0: kl = 0
    Do
        Li = Li - 1
        If Cells(Li, cr) <> "" Then
            If tl > l Then
                lk = tl - l
                Range(Li + 1 & ":" & Li + lk).Rows.Delete Shift:=xlUp
            End If
            If tl < l Then
                lk = l - tl
                Range(Li + 1 & ":" & Li + lk).Rows.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            End If
            tl = 0
        Else
            tl = tl + 1
        End If
    Loop Until Li = Lf
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
 
Postado : 05/08/2014 5:38 pm
(@edcronos)
Posts: 1006
Noble Member
 

agora que reparei vc não quer excluir as linhas que estão em branco
"..."

se for isso ...

troque essa linha
If Cells(Li, cr) <> "" Then
por esta
If Cells(Li, cr) <> "..." Then

cara desculpe
deu branco total aqui e nem sei se funcionaria no seu arquivo

 
Postado : 05/08/2014 5:56 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando!!! Fiz a sua e foi perfeito! Ganhei muito tempo!
Muito obrigado!! Fascinante!! hehe

E Edcronos, eu vou testar a sua agora então!!!

 
Postado : 05/08/2014 6:06 pm
(@edcronos)
Posts: 1006
Noble Member
 

é que a macro atbm adiciona linhas
mas seria no caso de ser em branco

Sub Adiciona_Exclui_Linhas_Em_Branco_De_Range_MoveLinhasColunaT()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    cr = Cells(1, "T").Column    'coluna de referencia indica a coluna que vai verificar se a Linhas está em branco
    
    l = 0
    
    Lf = 2    'Linha inicial da range

    Li = Cells(Rows.Count, cr).End(xlUp).Row    ' ultima linha da range
    tl = 0: kl = 0
    Do
        Li = Li - 1
        If Cells(Li, cr) <> "..." Then
                lk = tl - l
                Range(Li + 1 & ":" & Li + lk).Rows.Delete Shift:=xlUp
            tl = 0
        Else
            tl = tl + 1
        End If
    Loop Until Li = Lf
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

ela para vc acho que ficaria assim
apenas excluindo linhas que tivesse "..."

testa aí pelo menos para me dizer se funciona, eu não consegui raciocinar em relação aos ...

att

 
Postado : 05/08/2014 6:12 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Qto tempo demorava antes e qto tempo passou a demorar ?

FF

 
Postado : 05/08/2014 6:22 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Edcronos, não funcionou. Ficou rodando, rodando e tive que sair pelo ctrl + alt + del.

Te agradeço demais a ajuda, mas vou ficar com a do Fernando, que adiantou muito meu lado!!

Obrigado amigos!!
Um abraço grande.

 
Postado : 05/08/2014 6:31 pm
(@edcronos)
Posts: 1006
Noble Member
 

bem, eu tentei,
o fernando é profissional
eu só faço gatilhos
mas não consegui raciocinar em relação aos 3 pontos

 
Postado : 05/08/2014 6:50 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

E ae....
Deu erro 1004 na
If Cells(Li, cr) <> "..." Then
=/

 
Postado : 05/08/2014 7:10 pm
Página 1 / 3