VBA DoEvents

Índice

O VBA DoEvents A função pausa temporariamente uma macro em execução, dando ao Excel a chance de processar pressionamentos de teclas, cliques do mouse e outras mensagens do sistema operacional.

Em macros de longa execução, o Excel pode parecer travar e não responder, e a macro pode ser impossível de interromper. Se DoEvents estiver incluído em seu código, os usuários podem ter certeza de que a macro ainda está em execução e podem interromper a execução, se necessário.

Exemplo de DoEvents VBA

Considere o seguinte código:

1234567891011 Subteste público ()Dim i enquantoPara i = 1 a 20.000Intervalo (“A1”). Valor = iProximo euEnd Sub

Ao tentar este código, você notará que não é possível interagir com a janela do Excel. No entanto, como não é muito exigente para o processador, a macro ainda pode ser interrompida pressionando ESC ou CTRL + BREAK.

Se muitas funções complexas e exigentes estivessem sendo executadas dentro desse loop, o Excel demoraria mais para registrar um evento de pressionamento de tecla - até vários minutos ou possivelmente nenhum, especialmente se o computador estiver executando outros programas ao mesmo tempo.

Agora adicione uma única linha com DoEvents abaixo da atribuição de intervalo:

123 Intervalo ("A1"). Valor = iDoEvents

Se você executar este código novamente, verá que o Excel agora está responsivo - ele pode ser focado e trazido para o primeiro plano. DoEvents é chamado todas as vezes por meio do loop, o que garante que a macro esteja sempre produzindo execução para que o Excel possa processar todas as mensagens enviadas a ela. Como essa macro é executada rapidamente, quase parece que está sendo executada em segundo plano (embora não esteja) - mais operações dentro do loop exporiam rapidamente essa ilusão.

Perigos DoEvents

Dê uma segunda olhada, no entanto. Mais do que simplesmente permitir que o Excel seja focado, você pode clicar dentro das células e até mesmo alternar entre as guias enquanto a macro está sendo executada (experimente - você verá um comportamento engraçado). Isso mostra um dos perigos de DoEvents - pode ser a causa de consequências indesejadas se sua macro não for codificada com cuidado.

Outro perigo é que DoEvents podem servir como uma janela para a execução de outras macros. Tente isto: coloque um CommandButton ActiveX na planilha, clique duas vezes nele e adicione o seguinte código dentro do evento CommandButton1_Click ():

1234567 Dim c As RangePara cada c no intervalo ("B3: E8")c.Value = c.Value + 1Próximo c

Desative o Modo de design no Excel e execute a macro Test () que você adicionou anteriormente. Enquanto a macro Test está em execução, você pode clicar no CommandButton na planilha e sua macro associada será executada assim que DoEvents der uma pausa na macro Test ().

O perigo aqui é se a macro CommandButton alterou os dados em que a macro Test () estava trabalhando ou acionou a macro Test () novamente. Você pode acabar com alguns resultados extremamente confusos se não for cuidadoso.

Finalmente, você deve estar ciente de que DoEvents fará com que sua macro sofra um impacto no desempenho quando chamada. Dentro de um loop, esse impacto aumentará rapidamente, a menos que você limite a frequência com que DoEvents é chamado. Consultando nosso exemplo Test (), tente isto:

1 Se i Mod 1000 = 0 Then DoEvents

Isso reduz visivelmente a capacidade de resposta do Excel, mas o impacto no desempenho será menor.

Quando usar DoEvents

Apesar desses perigos, DoEvents é uma função útil que ajuda nos testes e depuração. Considere adicionar DoEvents a loops de longa duração.

Outro motivo para incluir DoEvents é permitir o feedback do usuário. Por exemplo, uma macro pode atualizar os rótulos de um formulário de usuário com indicadores de progresso. Sem DoEvents, o Excel pode não receber as mensagens para redesenhar o UserForm, dando ao usuário a impressão de que a macro parou de funcionar - especialmente se você alternar para outro programa e tentar voltar para o Excel. Com DoEvents, no entanto, o UserForm continuará a ser redesenhado e as atualizações para o progresso da macro continuarão a aparecer.

Na maioria das vezes, DoEvents não é algo que você deseje incluir muito em seu código e muitas vezes pode ser omitido. Se a capacidade de resposta é algo que sua macro precisa, não o exclua!

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave