none
Tela piscando entre workbooks RRS feed

Todas as Respostas

  • Basta desligar a atualização de tela no início e religar no final:

    Application.ScreenUpdating = False
    
    ...
    
    
    Application.ScreenUpdating = True

    Abraço!


    Filipe Magno

    quarta-feira, 10 de outubro de 2018 02:47
  • Caro Filipe, obrigado pela atenção!

    Meu código já tem essa aplicação, porém só funciona entre planilhas da mesma pasta e não entre arquivos diferentes!
    Tipo:

    Sub Inserir_Composições()
    
    Dim W               As Worksheet
    Dim UltimaLinha     As Long
    Dim S               As Worksheet
    Dim NomeArquivo     As String
    Dim i               As Long
    Dim CellAddr        As String
    
    'Pegar o nome dos arquivos abertos, exceto se o nome do arquivo for Base_dados.xslm
        For i = 1 To Workbooks.Count
            If Workbooks(i).Name <> "Base_dados.xlsm" Then
                NomeArquivo = Workbooks(i).Name
            End If
        Next
    
    Application.ScreenUpdating = False
    
    Set W = Sheets(1)
        Do While ActiveCell.Value2 <> ""
        If ActiveCell.Value <> "" Then
            
        Selection.Copy '(Copiar a Id da planilha ativa)
        Workbooks("Base_dados.xlsm").Activate  '(Vai para o outro arquivos chamado de Base_dados)
        Sheets(3).Select
        Range("B1").PasteSpecial
        Application.CutCopyMode = False
        
        Columns("B:B").Find(What:=ActiveCell.Value, After:=ActiveCell, _
            LookAt:=xlPart, SearchOrder:=xlByRows, _
            MatchCase:=False, SearchFormat:=False).Activate
        
        ActiveCell.Offset(0, 1).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        Selection.Copy
        
        Workbooks(NomeArquivo).Activate
        Sheets("Comp_analiticas").Select
        Range("A200000").Select
        Selection.End(xlUp).Select
        ActiveCell.Offset(2, 0).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        
        ActiveCell.Offset(1, 6).Select
    
    'COLOCAR SOMATÓRIA
    '-----------------
        
            Set S = Sheets("Comp_analiticas")
            S.Range("G" & Rows.Count).End(xlUp).End(xlUp).Offset(1, 0).Select
            
            If ActiveCell.Offset(1, 0).Value = "" Then GoTo Calcula
            
                With ActiveCell
                UltimaLinha = .End(xlDown).Row
                .Resize(UltimaLinha - .Row + 1).Select
                
                End With
             
    Calcula:
                CellAddr = Selection.Address
                ActiveCell.Offset(-1, 0).Select
                ActiveCell.Formula = "=SUM(" & CellAddr & ")"
        
    'COLOCAR ITEMIZAÇÃO
    '------------------
                ActiveCell.Offset(0, -6).Select
                Sheets(1).Select
                ActiveCell.Offset(0, -2).Select
                Application.CutCopyMode = False
                Selection.Copy
                ActiveCell.Offset(0, 2).Select
                Sheets("Comp_analiticas").Select
                ActiveSheet.Paste Link:=True
                Application.CutCopyMode = False
                Sheets(1).Select
            
            End If
        
        If ActiveCell.Value = "" Then Exit Do
        ActiveCell.Offset(1, 0).Select
    
    Loop
    
    Application.ScreenUpdating = True
    
    MsgBox "Composições adicionadas com sucesso"
    
    Set W = Nothing
    Set S = Nothing
    
    End Sub
    
    
    

    Como faço pra esse código não ficar piscando quando trocar de planilhas? 

    quarta-feira, 10 de outubro de 2018 19:04
  • Boa tarde Sávio.

    Este código abrange todos os casos, inclusive troca de pasta de trabalho. Vale porém uma ressalva: ele não funciona para execução passo a passo, ou seja, se houver ponto de interrupção no código esta opção torna-se inativa.

    Além disso, cuidado para não causar a reativação em um procedimento chamado dentro do seu código principal. Este é um ponto muito comum de erro.

    Seria um destes o motivo?


    Filipe Magno

    quarta-feira, 10 de outubro de 2018 19:22
  • Olá Filipe! Obrigado por responder-me.

    Bom saber que o código serve para todos os casos e estou ciente de que não funcionará em modo passo a passo.

    Não entendi a parte de causar uma reativação em um procedimento.

    Poderia me dá um exemplo?

    Seria o uso inadequado de Select ou Activate em meu código?

    Só sei que quando executo a consulta a tela pisca, alternando entre o banco e a planilha mesmo usando o Application.ScreenUpdating.

    Sávio Lóz.

    quarta-feira, 10 de outubro de 2018 19:45
  • Boa noite Sávio.

    Sobre a reativação considere o exemplo:

    Sub Procedimento1()
    
    
    Application.ScreenUpdating = False
    
    'Trecho 1 ...
    
    Call Procedimento2
    
    'Trecho 3 ...
    
    Application.ScreenUpdating = True
    
    End Sub
    
    
    Sub Procedimento2()
    
    
    Application.ScreenUpdating = False
    
    'Trecho 2 ...
    
    Application.ScreenUpdating = True
    
    
    End Sub

    Os trechos 1 e 2 executarão com a atualização de tela desabilitada, enquanto que o trecho 3 não, uma vez que houve uma reativação enquanto o Procedimento2 era executado.

    Creio não ser este seu caso, mas fica o alerta.

    Quanto ao seu caso, se não estiver interrompendo o código em algum ponto e nem executando passo a passo não vejo motivos para não funcionar...

    Qualquer dúvida é só perguntar.


    Filipe Magno

    quinta-feira, 11 de outubro de 2018 01:11
  • Pois é Filipe. Realmente não entendo o pisca pisca, mas o código funciona.

    Estou pesquisando pela internet como setar uma outra planilha e buscar os dados sem ter que a tela acompanhar esses deslocamentos, mas só vejo entre planilhas do mesmo arquivo.

    A busca continua... uma hora aparece uma ideia boa.

    De qualquer forma, obrigado pela atenção.

    quinta-feira, 11 de outubro de 2018 13:21
  • Sávio, apenas para registro: eu utilizo várias macros que ativam diferentes pastas de trabalho e a desabilitação da atualização da tela funciona normalmente (Excel 2007 e 2010). Não conheço outro comando diferente deste para esta finalidade. Além disso, alguns comandos só funcionam com a ativação da pasta de trabalho, ou seja, é provável que você tenha que descobrir o motivo do não funcionamento...

    Qualquer dúvida é só perguntar.

    Boa sorte.


    Filipe Magno

    quinta-feira, 11 de outubro de 2018 14:44
  • Filipe, bom dia.

    Que o código de desabilitação de tela funciona, isso pra mim já é fato. Minha dúvida surgiu exatamente por isso. 

    Ontem estava analisando meu código e percebi que preciso utilizar uma outra logística para que tudo funcione de forma limpa. Tem muito Select, Activate e isso prejudica um pouco o que estou querendo. Estou estudando uma forma de criar relativas e melhorar mais o código.

    Pesquisando na internet, tenho visto vários códigos que se relacionam com outras pastas de trabalho, mas é sempre o mesmo caminho, ou seja, vai na outra, busca a informação e para. No meu caso, eu preciso que fique analisando item por item e isso causa um vai e volta entre planilhas, gerando aquele pisca pisca que demonstra um código que ainda precisa melhorar.

    Não sou programador, sou um simples usuário que aos poucos resolve bobagens com VBA e que se aventurou em criar uma automação na planilha e descobrindo que o VBA pode muito mais...

    Mais uma vez, obrigado por toda atenção.


    sexta-feira, 12 de outubro de 2018 12:51