Notifications
Clear all

Application.ScreenUpdating em macros "aninhadas"

15 Posts
4 Usuários
0 Reactions
2,015 Visualizações
(@jorudess)
Posts: 0
New Member
Topic starter
 

Fala galera, eu tô começando a aprender sobre VBA e Macros agora... então lá vai uma pergunta de iniciante:

Eu fiz uma macro chamada Limpar Dados que é executada na plan1. Esta macro formata algumas células e faz rodar uma segunda macro, chamada Resetar, esta segunda deve ser executada na plan2.

Eu utilizo os comandos application.screenupdating = false e application.screenupdating = true em ambas as macros para evitar aquele "pisca-pisca" e o resultado é algo parecido com isso:

Macro Limpar Dados
Sub Limpar_Dados ()
Application.ScreenUpdating = False
blá blá blá...
Call Resetar
Sheets("Plan1").Select (Rodar a macro Resetar na Plan2 e depois voltar para a Plan1)
Application.ScreenUpdating = True
End sub

Macro Resetar
Sub Resetar ()
Application.ScreenUpdating = False
Sheets("Plan2").Select (Para as ações serem executados apenas na Plan2, sem este comando a macro estava rodando também na Plan1)
blá blá blá
Application.ScreenUpdating = True
End sub

Observações:
A macro Resetar é independente, ou seja, as vezes eu executo só ela... mas sempre que eu executar a macro Limpar Dados, a macro Resetar deve ser executada também.

Problema:
Observe que no final da macro Resetar existe Application.ScreenUpdating = True e na prática (visualmente), ao executar a macro Limpar Dados, a tela pisca trocando entre as plans. Como faço para resolver isso?

 
Postado : 14/02/2017 4:34 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se entendi corretamente, apesar de saber o que está no lugar dos "blá blá blá...", é só apagar a instrução "'Application.ScreenUpdating = True" da rotina "Resetar"

Faça os testes e veja se é isto o que quer.

[]s

 
Postado : 14/02/2017 5:17 pm
(@mprudencio)
Posts: 0
New Member
 

Como vc sempre que roda a macro limpardados vc roda a resetar pegue o codigo da macro resetar ao inves de chamar a macro com o call resetar

 
Postado : 14/02/2017 5:22 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Se entendi corretamente, apesar de saber o que está no lugar dos "blá blá blá...", é só apagar a instrução "'Application.ScreenUpdating = True" da rotina "Resetar"

Faça os testes e veja se é isto o que quer.

[]s

Funcionou Mauro! mas fica uma dúvida: toda vez que a gente colocar o comando application.screenupdating = false no começo de uma macro, não tem que colocar application.screenupdating = true no final? Eu estou assistindo uns videos no youtube sobre Macros e VBA e foi ensinado dessa forma.

Mas de qualquer agradeço pela atenção, valeu!

 
Postado : 14/02/2017 7:07 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Como vc sempre que roda a macro limpardados vc roda a resetar pegue o codigo da macro resetar ao inves de chamar a macro com o call resetar

Eu tinha pensado nisso, mas vou criar várias macros onde este problema vai acontecer e ficar copiando e colando a macro "secundária" dentro da macro "principal" vai ser muito trabalhoso, além de quer, caso eu precise fazer alguma alteração na macro "secundária", terei que replicar as alterações na macro "principal" tbm... 99% de chance de cometer erros.. ahuahauahauah

 
Postado : 14/02/2017 7:11 pm
(@brunoxro)
Posts: 0
New Member
 

Boa noite Jorudess,

Usar Call para chamar uma Macro vai ajudar você a cometer menos erros. Isso porque cada macro vai se menor e algumas rotinas já vão estar prontas e testadas quando você for adaptar.

att,

 
Postado : 14/02/2017 8:44 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Boa noite Jorudess,

Usar Call para chamar uma Macro vai ajudar você a cometer menos erros. Isso porque cada macro vai se menor e algumas rotinas já vão estar prontas e testadas quando você for adaptar.

att,

Valeu!

 
Postado : 14/02/2017 8:47 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não ative a outra planilha... Assim vc nunca precisará mexer com o screenupdating

 
Postado : 14/02/2017 9:14 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Não ative a outra planilha... Assim vc nunca precisará mexer com o screenupdating

Não entendi, Fernando. Você fala do comando Sheets("Plan2")?

Eu tive que ativar pq senão a macro "secundária" roda na planilha ativa, que no caso é a Plan1 (onde tem o botão linkado à macro). Eu preciso que a macro "secundária", que neste exemplo chamei de "Resetar", rode apenas nas células da "plan2".

 
Postado : 14/02/2017 9:56 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

não a ative, oras...
escreve linhas como :

Worksheets("Plan2").Range("a1").VALUE = "teste"

verá que praticamente tudo que vc está fazendo na outra planilha, não necessita que ela esteja visível ou ativada....

No seu modelo de código:

Macro Limpar Dados
Sub Limpar_Dados ()
'blá blá blá...
Call Resetar 
'blá blá blá...
End sub

Macro Resetar
Sub Resetar ()
Sheets("Plan2").Range("A1:Z1").ENTIRECOLUMN.CLEAR
Sheets("Plan2").Range("A1:J1").VALUE = ARRAY(1,2,3,4,5,6,7,8,9,10)
'MAIS BLA BLA BLA
End sub

Veja, assim vc nunca sairá da plan1, mas manipulará a plan2.....

Se vc colocar sue código completo, posso mostrar como ficaria... E usar o screenupdating somente quando e se for necessário !

 
Postado : 15/02/2017 5:20 am
(@jorudess)
Posts: 0
New Member
Topic starter
 

Ahhh... não sabia que tinha outro jeito de fazer isso... como eu disse... tô aprendendo o basicão ainda através de uns videos no youtube... eu vou testar com esse comando que você sugeriu, mas de qualquer forma vou colocar um dos meus códigos aqui pra vc dar uma olhada e sugerir melhorias = D.

Sub Limpar_Pre_Flop_Slot1()


Application.ScreenUpdating = False


'   Limpa as mãos suiteds
    Range("Q24").Select
    Selection.Copy
    Range("PRE_FLOP_SLOT1_SUITEDS").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

    
'   Limpa as mãos offsuiteds
    Range("Q25").Select
    Selection.Copy
    Range("PRE_FLOP_SLOT1_OFF_SUITEDS").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
            
        
'   Limpa os pocket pairs
    Application.CutCopyMode = False
    Range("Q26").Select
    Selection.Copy
    Range("PRE_FLOP_SLOT1_POCKET_PAIRS").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    
    
'   Limpa os comentários
    Range("C34").Select
    ActiveCell.FormulaR1C1 = ""
    
    
'   Roda a macro Resetar_PF_SLOT1
    Call Resetar_PF_Slot1
    Sheets("PRE-FLOP").Select
    Range("C17").Select
   
      
'Application.ScreenUpdating = True


End Sub 
Sub Resetar_PF_Slot1()


Application.ScreenUpdating = False


'   Ativa a aba PF
    Sheets("PF").Select

'   Reseta PF - Slot 1 - Spades
    Range("C7").Select
    Selection.Copy
    Range("PF_SLOT1_S").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
    
'   Reseta PF - Slot 1 - Clubs
    Range("R7").Select
    Selection.Copy
    Range("PF_SLOT1_C").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
    
'   Reseta PF - Slot 1 - Diamonds
    Range("C23").Select
    Selection.Copy
    Range("PF_SLOT1_D").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
    
'   Reseta PF - Slot 1 - Hearts
    Range("R23").Select
    Selection.Copy
    Range("PF_SLOT1_H").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
    
    Range("B2").Select
    
    
'Application.ScreenUpdating = True


End Sub
 
Postado : 15/02/2017 6:49 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

...tô aprendendo o basicão ainda ... = D.

Estamos aqui pra isso! Vamos lá !

Sub Limpar_Pre_Flop_Slot1()

    'application.screenupdating = false 'caso algo estranho aparecer na tela

'Quando você não especifica a planilha, o código roda na planilha ativa...
'Este é o caso dos Range soltos abaixo... eu particularmente não gosto !

'   Limpa as mãos suiteds
    Range("Q24").Copy 'ao invés de terminar com ".select" e começar a linha seguinte com "selection.", faça numa linha só
    Range("PRE_FLOP_SLOT1_SUITEDS").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
'   Limpa as mãos offsuiteds
    Range("Q25").Copy
    Range("PRE_FLOP_SLOT1_OFF_SUITEDS").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        
'   Limpa os pocket pairs
    Range("Q26").Copy
    Range("PRE_FLOP_SLOT1_POCKET_PAIRS").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
    Application.CutCopyMode = False
    
'   Limpa os comentários
    Range("C34").FormulaR1C1 = ""
    
'   Roda a macro Resetar_PF_SLOT1
    Call Resetar_PF_Slot1

    Range("C17").Select

    'application.screenupdating = true 'caso algo estranho aparecer na tela 

End Sub

Sub Resetar_PF_Slot1()

'   Reseta PF - Slot 1 - Spades
    Sheets("PF").Range("C7").Copy
    Sheets("PF").Range("PF_SLOT1_S").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
'   Reseta PF - Slot 1 - Clubs
    Sheets("PF").Range("R7").Copy
    Sheets("PF").Range("PF_SLOT1_C").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
'   Reseta PF - Slot 1 - Diamonds
    Sheets("PF").Range("C23").Copy
    Sheets("PF").Range("PF_SLOT1_D").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
'   Reseta PF - Slot 1 - Hearts
    Sheets("PF").Range("R23").Copy
    Sheets("PF").Range("PF_SLOT1_H").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        
End Sub

Se a tela piscar *(alguém internamente fudeu o código do Copy/Paste, lá na microsoft. Antigamente não dava zuera na tela e hoje pode dar...) enfim, se a tela der uma piscada ou aparecer coisas estranhas em tela dps de rodar, aí sim, só neste caso, coloque o screenupdating false no começo e true no final somente da primeira rotina... onde eu coloquei e deixei comentado...

 
Postado : 15/02/2017 8:04 am
(@jorudess)
Posts: 0
New Member
Topic starter
 

Show... você simplificou bastante o código.. vou fazer essas alteraçoes aqui e testar.

Valeu!

 
Postado : 15/02/2017 2:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

e aí?

 
Postado : 17/02/2017 7:55 pm
(@jorudess)
Posts: 0
New Member
Topic starter
 

Fernando,

Fiz as alterações que vc sugeriu, inclusive na primeira rotina, onde também especifiquei a planilha que deve ser executada, pra não correr o risco de ser executada na planilha errada. O que me desanima é que tenho várias rotinas iguais a essa.. mudando só os intervalos e tal. Terei que alterar uma por uma? Não tem um jeito de fazer isso mais rápido? Talvez um outro editor de VBA que tenha mais recursos....

Voltando para o que interessa... agora consigo executar a rotina Limpar_Pre_Flop_Slot1 sem problemas, a tela não pisca, mas quando vou executar a rotina Resetar_PF_Slot1 isoladamente, a tela pisca =/. Como eu disse a rotina Resetar_PF_Slot1 também será executada isoladamente em alguns casos. Tem algum jeito de impedir que a tela pisque quando eu executar Resetar_PF_Slot1 em separado?

Aproveitando a atenção... quando cometo um erro no código .. o depurador fica extremamente lento, impossível de usar.. tenho que forçar o fechamento do excel e abrir de novo sem rodar o depurador... procurando o erro no olhômetro mesmo. Isso é normal? Como resolvo isso? É pq a planilha tem muitas macros? Ou é pq estou usando uma função para contar celulas coloridas e sempre que avanço o depurador essa função tem que refazer os calculos?

Valeu!

 
Postado : 21/02/2017 5:00 pm