4
respostas

[Dúvida] Configurando a macro para utilizar o comando ActiveWorkbook.RefreshAll 2 vezes

Olá, boa noite!

Com a ajuda do Copilot, eu fiz o seguinte código:

ActiveWorkbook.RefreshAll Application.Wait Now + TimeValue("00:00:08") ActiveWorkbook.RefreshAll

O meu objetivo é que após 8 segundos ao primeiro refresh all, fosse executado novamente o refreshall. Dessa forma, eu pretendia obter o mesmo efeito do que dar dois cliques no botão (como o professor fez na aula).

O código funcionou, mas somente a consulta é atualizada, enquanto a tabela dinâmica (e, consequentemente, os gráficos) permanecem inalterados.

Existe alguma forma de escrever o código para que existam dois comandos para atualizar tudo, sendo que a segunda atualização somente ocorra após a conclusão da primeira?

4 respostas

Olá Lucas, tudo bem com você?

O comando ActiveWorkbook.RefreshAll é usado para atualizar todas as conexões de dados na pasta de trabalho, incluindo tabelas dinâmicas. Porém, não há um comando específico no VBA que possa garantir que a segunda atualização só ocorra após a primeira ser totalmente concluída. Isso é devido ao fato de que o Excel gerencia a atualização de consultas em segundo plano e não fornece uma maneira direta de verificar se a atualização foi concluída.

Uma alternativa seria criar duas macros separadas: uma para atualizar a consulta e outra para atualizar a tabela dinâmica. Você poderia então executar a primeira macro, esperar que a atualização da consulta seja concluída e depois executar a segunda macro. Isso garantiria que a tabela dinâmica só fosse atualizada após a consulta ser atualizada.

Exemplo:

Sub AtualizarConsulta()
    ' Código para atualizar a consulta
    ActiveWorkbook.RefreshAll
End Sub

Sub AtualizarTabelaDinamica()
    ' Código para atualizar a tabela dinâmica
    ActiveWorkbook.RefreshAll
End Sub

Depois de criar essas duas macros, você poderia executá-las em sequência, garantindo um intervalo de tempo adequado entre elas.

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade. Em caso de dúvidas estou à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Rafael, obrigado pela resposta.

Não existiria de eu configurar uma tecla de atalho para a segunda sub, e fazer com que na primeira sub essas teclas fossem acionadas? Será que isso funcionaria?

Olá Lucas.

Eu não tenho acesso completo a seu cenário, mas pelo que entendi da sua pergunta seria uma Sub chamando a outra e isso você pode fazer usando a palavra chave Call. Neste pequeno exemplo abaixo, dentro da Sub2 eu chamo a Sub1.

Sub SubUm()

    MsgBox "Eu sou a Sub Um que foi chamada dentro da Sub Dois"

End Sub

Sub SubDois()

    Call SubUm
    
    MsgBox "Eu sou a Sub Dois"

End Sub

Espero ter ajudado. Abraços e bons estudos!

Obrigado pela resposta Rafael.

Primeiramente, me desculpe. Eu pensei que os tópicos do fórum fossem vinculados a aulas específicas, por isso não ampliei muito a explicação.

No problema que gerou a minha dúvida, havia uma base de dados externa conectada a uma planilha, que estava ligado a uma tabela dinâmica que estava ligada a um gráfico dinâmico. O professor Sabino na aula nos ensinou a fazer uma sub colocada em um botão que atualizaria tudo isso, só que demandaria dois cliques, uma vez que o gráfico dinâmico só se atualiza após a tabela dinâmica se atualizar.

A minha indagação é pensando no usuário final, uma vez que seria muito comum ele não apertar duas vezes no botão, e aí os dados ficarem incorretos no gráfico dinâmico.

Em suma, estou procurando automatizar essa necessidade de "dois cliques" de alguma forma.