Eventos do Excel VBA - um guia fácil (e completo)

Ao criar ou gravar uma macro no Excel, você precisa executar a macro para executar as etapas do código.

Algumas maneiras de executar uma macro incluem usar a caixa de diálogo da macro, atribuir a macro a um botão, usar um atalho, etc.

Além dessas execuções de macro iniciadas pelo usuário, você também pode usar eventos VBA para executar a macro.

Eventos do Excel VBA - Introdução

Deixe-me primeiro explicar o que é um evento no VBA.

Um evento é uma ação que pode disparar a execução da macro especificada.

Por exemplo, quando você abre uma nova pasta de trabalho, é um evento. Quando você insere uma nova planilha, é um evento. Quando você clica duas vezes em uma célula, é um evento.

Existem muitos desses eventos no VBA e você pode criar códigos para esses eventos. Isso significa que, assim que um evento ocorrer, e se você tiver especificado um código para esse evento, esse código será executado instantaneamente.

O Excel faz isso automaticamente assim que percebe que um evento ocorreu. Portanto, você só precisa escrever o código e colocá-lo na sub-rotina de evento correta (isso é abordado posteriormente neste artigo).

Por exemplo, se você inserir uma nova planilha e quiser que ela tenha um prefixo de ano, poderá escrever o código para ela.

Agora, sempre que alguém insere uma nova planilha, este código é executado automaticamente e adiciona o prefixo do ano ao nome da planilha.

Outro exemplo pode ser que você deseja alterar a cor da célula quando alguém clica duas vezes nela. Você pode usar o evento de clique duplo para isso.

Da mesma forma, você pode criar códigos VBA para muitos desses eventos (como veremos mais adiante neste artigo).

Abaixo está um breve visual que mostra o evento de clique duplo em ação. Assim que eu clicar duas vezes na célula A1. O Excel abre instantaneamente uma caixa de mensagem que mostra o endereço da célula.

O clique duplo é um evento e mostrar a caixa de mensagem é o que eu especifiquei no código sempre que o evento de clique duplo ocorrer.

Embora o exemplo acima seja um evento inútil, espero que ajude você a entender o que os eventos realmente são.

Diferentes tipos de eventos Excel VBA

Existem diferentes objetos no Excel - como o próprio Excel (ao qual frequentemente nos referimos como o aplicativo), pastas de trabalho, planilhas, gráficos, etc.

Cada um desses objetos pode ter vários eventos associados a ele. Por exemplo:

  • Se você criar uma nova pasta de trabalho, é um evento de nível de aplicativo.
  • Se você adicionar uma nova planilha, é um evento de nível de pasta de trabalho.
  • Se você alterar o valor em uma célula em uma planilha, é um evento no nível da planilha.

Abaixo estão os diferentes tipos de eventos que existem no Excel:

  1. Eventos de nível de planilha: Esses são os tipos de eventos que seriam disparados com base nas ações executadas na planilha. Exemplos desses eventos incluem alterar uma célula na planilha, alterar a seleção, clicar duas vezes em uma célula, clicar com o botão direito em uma célula, etc.
  2. Eventos de nível de pasta de trabalho: Esses eventos seriam acionados com base nas ações no nível da pasta de trabalho. Exemplos desses eventos incluem adicionar uma nova planilha, salvar a pasta de trabalho, abrir a pasta de trabalho, imprimir uma parte ou toda a pasta de trabalho, etc.
  3. Eventos de nível de aplicativo: Estes são os eventos que ocorrem no aplicativo Excel. Um exemplo disso incluiria o fechamento de qualquer uma das pastas de trabalho abertas ou a abertura de uma nova pasta de trabalho.
  4. Eventos de nível de formulário de usuário: Esses eventos seriam acionados com base nas ações no ‘UserForm’. Exemplos disso incluem inicializar um UserForm ou clicar em um botão no UserForm.
  5. Eventos de gráfico: Esses são eventos relacionados à planilha de gráfico. Uma planilha de gráfico é diferente de uma planilha (que é onde a maioria de nós está acostumada a trabalhar no Excel). A finalidade das folhas de gráfico é manter um gráfico. Exemplos de tais eventos incluem alterar a série do gráfico ou redimensionar o gráfico.
  6. Eventos OnTime e OnKey: Estes são dois eventos que não se enquadram em nenhuma das categorias acima. Então, eu listei esses separadamente. O evento ‘OnTime’ permite que você execute um código em um momento específico ou após um tempo específico ter decorrido. O evento 'OnKey' permite que você execute um código quando um pressionamento de tecla específico (ou uma combinação de pressionamentos de tecla) é usado.

Onde colocar o código relacionado ao evento

Na seção acima, abordei os diferentes tipos de eventos.

Com base no tipo de evento, você precisa colocar o código no objeto relevante.

Por exemplo, se for um evento relacionado à planilha, ele deve ir na janela de código do objeto da planilha. Se for relacionado à pasta de trabalho, ele deve ir na janela de código de um objeto de pasta de trabalho.

No VBA, diferentes objetos - como planilhas, pastas de trabalho, planilhas de gráficos, formulários de usuário, etc., têm suas próprias janelas de código. Você precisa colocar o código do evento na janela de código do objeto relevante. Por exemplo - se for um evento de nível de pasta de trabalho, você precisa ter o código do evento na janela de código da pasta de trabalho.

As seções a seguir abrangem os locais onde você pode colocar o código do evento:

Na janela de código da planilha

Ao abrir o Editor VB (usando o atalho de teclado ALT + F11), você notaria o objeto de planilhas no Project Explorer. Para cada planilha da pasta de trabalho, você verá um objeto.

Quando você clica duas vezes no objeto de planilha em que deseja colocar o código, a janela de código dessa planilha é aberta.

Embora você possa começar a escrever o código do zero, é muito melhor selecionar o evento em uma lista de opções e deixar o VBA inserir automaticamente o código relevante para o evento selecionado.

Para fazer isso, você precisa primeiro selecionar a planilha no menu suspenso no canto superior esquerdo da janela de código.

Depois de selecionar a planilha no menu suspenso, você obtém uma lista de todos os eventos relacionados à planilha. Você pode selecionar aquele que deseja usar no menu suspenso no canto superior direito da janela de código.

Assim que você seleciona o evento, ele insere automaticamente a primeira e a última linha do código para o evento selecionado. Agora você pode adicionar seu código entre as duas linhas.

Nota: Assim que selecionar Planilha no menu suspenso, você notará que duas linhas de código aparecem na janela de código. Depois de selecionar o evento para o qual deseja o código, você pode excluir as linhas que apareceram por padrão.

Observe que cada planilha possui uma janela de código própria. Quando você coloca o código para a Planilha1, ele só funcionará se o evento acontecer na Planilha1.

Na janela de código deste livro de trabalho

Assim como as planilhas, se você tiver um código de evento no nível da pasta de trabalho, poderá colocá-lo na janela de código ThisWorkbook.

Quando você clicar duas vezes em ThisWorkbook, ele abrirá a janela de código para ele.

Você precisa selecionar Workbook no menu suspenso no canto superior esquerdo da janela de código.

Depois de selecionar a pasta de trabalho no menu suspenso, você obtém uma lista de todos os eventos relacionados à pasta de trabalho. Você pode selecionar aquele que deseja usar no menu suspenso no canto superior direito da janela de código.

Assim que você seleciona o evento, ele insere automaticamente a primeira e a última linha do código para o evento selecionado. Agora você pode adicionar seu código entre as duas linhas.

Nota: Assim que selecionar Workbook no menu suspenso, você notará que duas linhas de código aparecem na janela de código. Depois de selecionar o evento para o qual deseja o código, você pode excluir as linhas que apareceram por padrão.

Na janela de código do formulário de usuário

Ao criar UserForms no Excel, você também pode usar eventos de UserForm para executar códigos com base em ações específicas. Por exemplo, você pode especificar um código que é executado quando o botão é clicado.

Embora os objetos Sheet e ThisWorkbook já estejam disponíveis quando você abre o Editor VB, UserForm é algo que você precisa criar primeiro.

Para criar um UserForm, clique com o botão direito em qualquer um dos objetos, vá em Inserir e clique em UserForm.

Isso inseriria um objeto UserForm na pasta de trabalho.

Quando você clica duas vezes no UserForm (ou em qualquer objeto adicionado ao UserForm), a janela de código do UserForm é aberta.

Agora, assim como planilhas ou ThisWorkbook, você pode selecionar o evento e ele irá inserir a primeira e a última linha para aquele evento. E então você pode adicionar o código no meio dele.

Na janela de código do gráfico

No Excel, você também pode inserir planilhas de gráfico (que são diferentes das planilhas). Uma folha de gráfico deve conter apenas gráficos.

Depois de inserir uma planilha de gráfico, você poderá ver o objeto de planilha de gráfico no Editor VB.

Você pode adicionar o código do evento à janela de código da planilha de gráfico, assim como fizemos na planilha.

Clique duas vezes no objeto de folha de gráfico no Project Explorer. Isso abrirá a janela de código para a folha de gráfico.

Agora, você precisa selecionar Gráfico no menu suspenso no canto superior esquerdo da janela de código.

Depois de selecionar Gráfico no menu suspenso, você obtém uma lista de todos os eventos relacionados à planilha Gráfico. Você pode selecionar aquele que deseja usar no menu suspenso no canto superior direito da janela de código.

Nota: Assim que selecionar Gráfico no menu suspenso, você notará que duas linhas de código aparecem na janela de código. Depois de selecionar o evento para o qual deseja o código, você pode excluir as linhas que apareceram por padrão.

Módulo In Class

Módulos de classe precisam ser inseridos exatamente como UserForms.

Um módulo de classe pode conter código relacionado ao aplicativo - que seria o próprio Excel e os gráficos incorporados.

Vou cobrir o módulo da classe como um tutorial separado nas próximas semanas.

Observe que, além dos eventos OnTime e OnKey, nenhum dos eventos acima pode ser armazenado no módulo VBA regular.

Compreendendo a sequência de eventos

Quando você dispara um evento, isso não acontece isoladamente. Também pode levar a uma sequência de vários gatilhos.

Por exemplo, quando você insere uma nova planilha, as seguintes coisas acontecem:

  1. Uma nova planilha é adicionada
  2. A planilha anterior é desativada
  3. A nova planilha é ativada

Embora, na maioria dos casos, você não precise se preocupar com a sequência, se estiver criando códigos complexos que dependem de eventos, é melhor conhecer a sequência para evitar resultados inesperados.

Compreendendo o papel dos argumentos em eventos VBA

Antes de pularmos para os exemplos de eventos e as coisas incríveis que você pode fazer com eles, há um conceito importante que preciso abordar.

Em eventos VBA, haveria dois tipos de códigos:

  • Sem nenhum argumento
  • Com argumentos

E nesta seção, desejo cobrir rapidamente o papel dos argumentos.

Abaixo está um código que não contém nenhum argumento (os parênteses estão vazios):

Private Sub Workbook_Open () MsgBox "Lembre-se de preencher o quadro de horários" End Sub

Com o código acima, ao abrir uma pasta de trabalho, ela simplesmente mostra uma caixa de mensagem com a mensagem - “Lembre-se de preencher o Quadro de Horários”.

Agora vamos dar uma olhada em um código que tem um argumento.

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Sh.Name End Sub

O código acima usa o argumento Sh que é definido como um tipo de objeto. O argumento Sh pode ser uma planilha ou uma planilha de gráfico, já que o evento acima é disparado quando uma nova planilha é adicionada.

Ao atribuir a nova planilha adicionada à pasta de trabalho à variável de objeto Sh, o VBA nos permitiu usá-la no código. Portanto, para me referir ao novo nome da planilha, posso usar Sh.Name.

O conceito de argumentos será útil quando você passar pelos exemplos de eventos do VBA nas próximas seções.

Eventos de nível de pasta de trabalho (explicados com exemplos)

A seguir estão os eventos mais comumente usados ​​em uma pasta de trabalho.

NOME DO EVENTO O QUE ACIONA O EVENTO
Ativar Quando uma pasta de trabalho é ativada
AfterSave Quando uma pasta de trabalho é instalada como um suplemento
BeforeSave Quando uma pasta de trabalho é salva
BeforeClose Quando uma pasta de trabalho é fechada
BeforePrint Quando uma pasta de trabalho é impressa
Desativar Quando uma pasta de trabalho é desativada
NewSheet Quando uma nova folha é adicionada
Aberto Quando uma pasta de trabalho é aberta
SheetActivate Quando qualquer planilha da pasta de trabalho é ativada
SheetBeforeDelete Quando qualquer folha é excluída
SheetBeforeDoubleClick Quando qualquer folha é clicada duas vezes
SheetBeforeRightClick Quando qualquer folha é clicada com o botão direito
SheetCalculate Quando qualquer folha é calculada ou recalculada
SheetDeactivate Quando uma pasta de trabalho é desativada
SheetPivotTableUpdate Quando uma pasta de trabalho é atualizada
SheetSelectionChange Quando uma pasta de trabalho é alterada
WindowActivate Quando uma pasta de trabalho é ativada
WindowDeactivate Quando uma pasta de trabalho é desativada

Observe que esta não é uma lista completa. Você pode encontrar a lista completa aqui.

Lembre-se de que o código do evento Workbook é armazenado na janela de código de objetos ThisWorkbook.

Agora, vamos dar uma olhada em alguns eventos úteis da pasta de trabalho e ver como eles podem ser usados ​​no seu trabalho diário.

Evento de abertura da pasta de trabalho

Digamos que você queira mostrar ao usuário um lembrete amigável para preencher suas planilhas de horas sempre que abrir uma pasta de trabalho específica.

Você pode usar o código abaixo para fazer isso:

Private Sub Workbook_Open () MsgBox "Lembre-se de preencher o quadro de horários" End Sub

Agora, assim que você abrir a pasta de trabalho que contém esse código, será exibida uma caixa de mensagem com a mensagem especificada.

Existem algumas coisas que você deve saber ao trabalhar com este código (ou códigos de evento da pasta de trabalho em geral):

  • Se uma pasta de trabalho tiver uma macro e você quiser salvá-la, será necessário salvá-la no formato .XLSM. Caso contrário, o código da macro seria perdido.
  • No exemplo acima, o código do evento seria executado apenas quando as macros estivessem habilitadas. Você pode ver uma barra amarela pedindo permissão para habilitar macros. Até que seja habilitado, o código do evento não é executado.
  • O código do evento Workbook é colocado na janela de código do objeto ThisWorkbook.

Você pode refinar ainda mais este código e mostrar a mensagem apenas de sexta-feira.

O código abaixo faria isso:

Sub particular Workbook_Open () wkday = Weekday (Date) If wkday = 6 Then MsgBox "Lembre-se de preencher o quadro de horários" End Sub

Observe que na função Dia da semana, domingo é atribuído o valor 1, segunda-feira é 2 e assim por diante.

Portanto, para sexta-feira, usei 6.

O evento de abertura da pasta de trabalho pode ser útil em muitas situações, como:

  • Quando você deseja mostrar uma mensagem de boas-vindas à pessoa quando uma pasta de trabalho for aberta.
  • Quando você deseja exibir um lembrete quando a pasta de trabalho for aberta.
  • Quando você deseja sempre ativar uma planilha específica na pasta de trabalho quando ela for aberta.
  • Quando você deseja abrir arquivos relacionados junto com a pasta de trabalho.
  • Quando você deseja capturar o carimbo de data e hora sempre que a pasta de trabalho é aberta.

Workbook NewSheet Event

O evento NewSheet é disparado quando você insere uma nova planilha na pasta de trabalho.

Digamos que você queira inserir o valor de data e hora na célula A1 da planilha recém-inserida. Você pode usar o código abaixo para fazer isso:

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

O código acima usa ‘On Error Resume Next’ para lidar com casos em que alguém insere uma planilha de gráfico e não uma planilha. Uma vez que a folha de gráfico não tem a célula A1, mostraria um erro se ‘On Error Resume Next’ não fosse usado.

Outro exemplo pode ser quando você deseja aplicar alguma configuração básica ou formatação a uma nova planilha assim que ela for adicionada. Por exemplo, se você deseja adicionar uma nova planilha e deseja que ela obtenha automaticamente um número de série (até 100), você pode usar o código abaixo.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next With Sh.Range ("A1") .Value = "S. No." .Interior.Color = vbBlue .Font.Color = vbWhite End With For i = 1 a 100 Sh.Range ("A1"). Offset (i, 0) .Value = i Next i Sh.Range ("A1", Range ("A1"). End (xlDown)). Borders.LineStyle = xlContinuous End Sub

O código acima também formata um pouco. Isso dá à célula do cabeçalho uma cor azul e torna a fonte branca. Ele também aplica uma borda a todas as células preenchidas.

O código acima é um exemplo de como um código VBA curto pode ajudá-lo a ganhar alguns segundos toda vez que inserir uma nova planilha (caso isso seja algo que você tenha que fazer todas as vezes).

Livro de exercícios antes de salvar o evento

O evento Antes de Salvar é disparado quando você salva uma pasta de trabalho. Observe que o evento é disparado primeiro e, em seguida, a pasta de trabalho é salva.

Ao salvar uma pasta de trabalho do Excel, pode haver dois cenários possíveis:

  1. Você está salvando pela primeira vez e ele mostrará a caixa de diálogo Salvar como.
  2. Você já o salvou antes e ele simplesmente salvará e substituirá as alterações na versão já salva.

Agora vamos dar uma olhada em alguns exemplos onde você pode usar o evento BeforeSave.

Suponha que você tenha uma nova pasta de trabalho que está salvando pela primeira vez e deseja lembrar o usuário de salvá-la na unidade K, então você pode usar o código abaixo:

Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then MsgBox "Salvar este arquivo na unidade K" End Sub

No código acima, se o arquivo nunca foi salvo, SaveAsUI é True e abre a caixa de diálogo Salvar como. O código acima exibiria a mensagem antes da caixa de diálogo Salvar como aparecer.

Outro exemplo pode ser atualizar a data e a hora quando o arquivo é salvo em uma célula específica.

O código a seguir inserirá o carimbo de data e hora na célula A1 da Planilha1 sempre que o arquivo for salvo.

Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets ("Sheet1"). Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

Observe que esse código é executado assim que o usuário salva a pasta de trabalho. Se a pasta de trabalho estiver sendo salva pela primeira vez, será exibida uma caixa de diálogo Salvar como. Mas o código já está executado quando você vê a caixa de diálogo Salvar como. Neste ponto, se você decidir cancelar e não salvar a pasta de trabalho, a data e a hora já estariam inseridas na célula.

Workbook BeforeClose Event

O evento Antes de Fechar acontece logo antes de a pasta de trabalho ser fechada.

O código a seguir protege todas as planilhas antes que a pasta de trabalho seja fechada.

Private Sub Workbook_BeforeClose (Cancel As Boolean) Dim sh As Worksheet For each sh In ThisWorkbook.Worksheets sh.Protect Next sh End Sub

Lembre-se de que o código do evento é acionado assim que você fecha a pasta de trabalho.

Uma coisa importante a saber sobre este evento é que não importa se a pasta de trabalho está realmente fechada ou não.

Caso a pasta de trabalho não tenha sido salva e você receba um prompt perguntando se deseja salvá-la ou não, e clique em Cancelar, isso não salvará sua pasta de trabalho.No entanto, o código do evento já teria sido executado até então.

Workbook BeforePrint Event

Quando você dá o comando de impressão (ou o comando Visualizar impressão), o evento Antes de imprimir é acionado.

O código a seguir iria recalcular todas as planilhas antes de sua pasta de trabalho ser impressa.

Private Sub Workbook_BeforePrint (Cancelar como booleano) Para cada ws nas planilhas ws.Calculate Next ws End Sub

Quando o usuário está imprimindo a pasta de trabalho, o evento será disparado se ele estiver imprimindo a pasta de trabalho inteira ou apenas parte dela.

Outro exemplo abaixo é o código que adicionaria a data e a hora ao rodapé quando a pasta de trabalho for impressa.

Private Sub Workbook_BeforePrint (Cancel As Boolean) Dim ws As Worksheet For each ws In ThisWorkbook.Worksheets ws.PageSetup.LeftFooter = "Printed On -" & Format (Now, "dd-mmm-aaaa hh: mm") Next ws End Sub

Eventos de nível de planilha (explicados com exemplos)

Os eventos da planilha ocorrem com base nos gatilhos da planilha.

A seguir estão os eventos mais comumente usados ​​em uma planilha.

Nome do evento O que desencadeia o evento
Ativar Quando a planilha é ativada
Antes de Excluir Antes que a planilha seja excluída
BeforeDoubleClick Antes de clicar duas vezes na planilha
BeforeRightClick Antes que a planilha seja clicada com o botão direito
Calcular Antes que a planilha seja calculada ou recalculada
Mudar Quando as células na planilha são alteradas
Desativar Quando a planilha é desativada
PivotTableUpdate Quando a Tabela Dinâmica na planilha é atualizada
SelectionChange Quando a seleção na planilha é alterada

Observe que esta não é uma lista completa. Você pode encontrar a lista completa aqui.

Lembre-se de que o código do evento Worksheet é armazenado na janela de código do objeto da planilha (aquela em que você deseja que o evento seja disparado). Pode haver várias planilhas em uma pasta de trabalho, e seu código seria disparado apenas quando o evento ocorresse na planilha em que foi colocado.

Agora, vamos dar uma olhada em alguns eventos úteis da planilha e ver como eles podem ser usados ​​no seu trabalho diário.

Planilha de ativação de evento

Este evento é disparado quando você ativa uma planilha.

O código abaixo desprotege uma planilha assim que ela é ativada.

Private Sub Worksheet_Activate () ActiveSheet.Unprotect End Sub

Você também pode usar este evento para garantir que uma célula específica ou um intervalo de células (ou um intervalo nomeado) seja selecionado assim que você ativar a planilha. O código a seguir selecionaria a célula D1 assim que você ativar a planilha.

Private Sub Worksheet_Activate () ActiveSheet.Range ("D1"). Selecione End Sub

Evento de mudança de planilha

Um evento de mudança é disparado sempre que você faz uma mudança na planilha.

Bem … nem sempre.

Existem algumas mudanças que acionam o evento e outras não. Aqui está uma lista de algumas mudanças que não irão acionar o evento:

  • Quando você altera a formatação da célula (tamanho da fonte, cor, borda, etc.).
  • Quando você mescla células. Isso é surpreendente, pois às vezes a mesclagem de células também remove o conteúdo de todas as células, exceto a do canto superior esquerdo.
  • Quando você adiciona, apaga ou edita um comentário de célula.
  • Quando você classifica um intervalo de células.
  • Quando você usa Goal Seek.

As seguintes alterações desencadeariam o evento (mesmo que você possa pensar que não deveria):

  • Copiar e colar a formatação acionaria o evento.
  • Limpar a formatação acionaria o evento.
  • Executar uma verificação ortográfica acionaria o evento.

Abaixo está um código que mostra uma caixa de mensagem com o endereço da célula que foi alterada.

Private Sub Worksheet_Change (ByVal Target As Range) MsgBox "Você acabou de alterar" & Target.Address End Sub

Embora seja uma macro inútil, ela mostra como usar o argumento Target para descobrir quais células foram alteradas.

Agora vamos ver mais alguns exemplos úteis.

Suponha que você tenha um intervalo de células (digamos A1: D10) e deseja mostrar um prompt e perguntar ao usuário se ele realmente deseja alterar uma célula neste intervalo ou não, você pode usar o código abaixo.

Ele mostra um prompt com dois botões - Sim e Não. Se o usuário selecionar 'Sim', a alteração é feita, caso contrário, é revertida.

Private Sub Worksheet_Change (ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox ("Você está fazendo uma alteração nas células em A1: D10. Tem certeza que deseja?", vbYesNo) End If If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub

No código acima, verificamos se a célula de destino está nas primeiras 4 colunas e nas primeiras 10 linhas. Se for esse o caso, a caixa de mensagem é exibida. Além disso, se o usuário selecionou Não na caixa de mensagem, a alteração é revertida (pelo comando Application.Undo).

Observe que usei Application.EnableEvents = False antes da linha Application.Undo. E então eu reverti usando Application.EnableEvent = True na próxima linha.

Isso é necessário, pois quando o desfazer acontece, ele também aciona o evento de alteração. Se eu não definir o EnableEvent como False, ele continuará acionando o evento de alteração.

Você também pode monitorar as alterações em um intervalo nomeado usando o evento de alteração. Por exemplo, se você tem um intervalo nomeado chamado “DataRange” e deseja mostrar um prompt caso o usuário faça uma alteração neste intervalo nomeado, você pode usar o código abaixo:

Private Sub Worksheet_Change (ByVal Target As Range) Dim DRange As Range Definir DRange = Range ("DataRange") If Not Intersect (Target, DRange) Is Nothing Then MsgBox "Você acabou de fazer uma alteração no intervalo de dados" End If End Sub

O código acima verifica se a célula / intervalo onde você fez as alterações possui alguma célula comum ao intervalo de dados. Em caso afirmativo, ele mostra a caixa de mensagem.

Evento de mudança de seleção de pasta de trabalho

O evento de mudança de seleção é acionado sempre que houver uma mudança de seleção na planilha.

O código abaixo iria recalcular a planilha assim que você alterasse a seleção.

Private Sub Worksheet_SelectionChange (ByVal Target As Range) Application.Calculate End Sub

Outro exemplo deste evento é quando você deseja destacar a linha e coluna ativas da célula selecionada.

Algo conforme mostrado abaixo:

O código a seguir pode fazer isso:

Private Sub Worksheet_SelectionChange (ByVal Target As Range) Cells.Interior.ColorIndex = xlNone With ActiveCell .EntireRow.Interior.Color = RGB (248, 203, 173) .EntireColumn.Interior.Color = RGB (180, 198, 231) End With End Sub

O código primeiro remove a cor de fundo de todas as células e, em seguida, aplica a cor mencionada no código à linha e coluna ativas.

E esse é o problema com este código. Que remove a cor de todas as células.

Se você deseja destacar a linha / coluna ativa enquanto mantém a cor em outras células intactas, use a técnica mostrada neste tutorial.

Workbook DoubleClick Event

Este é um dos meus eventos de planilha favoritos e você verá muitos tutoriais onde usei isso (como este ou este).

Este evento é acionado quando você clica duas vezes em uma célula.

Deixe-me mostrar como isso é incrível.

Com o código abaixo, você pode clicar duas vezes em uma célula e ela vai aplicar uma cor de fundo, mudar a cor da fonte e deixar o texto da célula em negrito;

Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean) Cancel = True com o destino .Interior.Color = vbBlue .Font.Color = vbWhite .Font.Bold = True End With End Sub

Isso pode ser útil quando você está percorrendo uma lista de células e deseja destacar algumas das células selecionadas. Embora você possa usar a tecla F4 para repetir a última etapa, ela só poderá aplicar um tipo de formatação. Com este evento de clique duplo, você pode aplicar todos os três com apenas um clique duplo.

Observe que no código acima, fiz o valor de Cancel = True.

Isso é feito para que a ação padrão de clique duplo seja desabilitada - que é entrar no modo de edição. Com Cancel = True, o Excel não colocaria você no modo de edição ao clicar duas vezes na célula.

Aqui está outro exemplo.

Se você tiver uma lista de tarefas no Excel, poderá usar o evento de clique duplo para aplicar o formato tachado e marcar a tarefa como concluída.

Algo conforme mostrado abaixo:

Aqui está o código que fará isso:

Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean) Cancel = True CurrFormat = Target.Font.Strikethrough If CurrFormat Then Target.Font.Strikethrough = False Else Target.Font.Strikethrough = True End If End Sub

Observe que, neste código, dei um clique duplo como um evento de alternância. Quando você clica duas vezes em uma célula, verifica se o formato de tachado já foi aplicado. Se tiver sido, clique duas vezes para remover o formato tachado e, se não tiver sido, o formato tachado será aplicado.

Evento Excel VBA OnTime

Os eventos que vimos até agora neste artigo foram associados a um dos objetos do Excel, seja a pasta de trabalho, planilha, planilha de gráfico ou formulários do usuário, etc.

O evento OnTime é diferente de outros eventos, pois pode ser armazenado no módulo VBA regular (enquanto os outros deveriam ser colocados na janela de código de objetos como ThisWorkbook ou Worksheets ou UserForms).

Dentro do módulo VBA regular, ele é usado como um método do objeto do aplicativo.

O motivo pelo qual isso é considerado um evento é que ele pode ser disparado com base na hora que você especificar. Por exemplo, se eu quiser que a planilha seja recalculada a cada 5 minutos, posso usar o evento OnTime para isso.

Ou, se eu quiser mostrar uma mensagem / lembrete em um horário específico do dia, posso usar o evento OnTime.

Abaixo está um código que mostrará uma mensagem às 14h todos os dias.

Sub MessageTime () Application.OnTime TimeValue ("14:00:00"), "ShowMessage" End Sub ShowMessage () MsgBox "It's Lunch Time" End Sub

Lembre-se de que você precisa colocar este código no módulo VBA regular,

Além disso, embora o evento OnTime seja disparado no horário especificado, você precisa executar a macro manualmente a qualquer momento. Depois de executar a macro, ela esperará até as 14h e, em seguida, chamará a macro ‘ShowMessage’.

A macro ShowMessage exibiria a mensagem.

O evento OnTime leva quatro argumentos:

Application.OnTime (EarliestTime, Procedimento, LatestTime, Cronograma)

  • EarliestTime: A hora em que você deseja executar o procedimento.
  • Procedimento: O nome do procedimento que deve ser executado.
  • LatestTime (opcional): No caso de outro código estar em execução e seu código especificado não puder ser executado no horário especificado, você pode especificar o LatestTime pelo qual ele deve aguardar. Por exemplo, poderia ser EarliestTime + 45 (o que significa que ele aguardará 45 segundos para que o outro procedimento seja concluído). Se depois de 45 segundos o procedimento não puder ser executado, ele será abandonado. Se você não especificar isso, o Excel esperará até que o código possa ser executado e, em seguida, o executará.
  • Programação (opcional): Se definido como True, ele agenda um novo procedimento de tempo. Se for False, cancela o procedimento definido anteriormente. Por padrão, isso é True.

No exemplo acima, usamos apenas os dois primeiros argumentos.

Vejamos outro exemplo.

O código a seguir atualizaria a planilha a cada 5 minutos.

Dim NextRefresh as Date Sub RefreshSheet () ThisWorkbook.Worksheets ("Sheet1"). Calculate NextRefresh = Now + TimeValue ("00:05:00") Application.OnTime NextRefresh, "RefreshSheet" End Sub Sub StopRefresh () On Error Resume Next Application.OnTime NextRefresh, "RefreshSheet",, False End Sub

O código acima atualizaria a planilha a cada 5 minutos.

Ele usa a função Agora para determinar a hora atual e, em seguida, adiciona 5 minutos à hora atual.

O evento OnTime continuará a ser executado até que você o interrompa. Se você fechar a pasta de trabalho e o aplicativo Excel ainda estiver em execução (outras pastas de trabalho estão abertas), a pasta de trabalho que contém o evento OnTime em execução será reaberta.

Isso é melhor tratado parando especificamente o evento OnTime.

No código acima, eu tenho o código StopRefresh, mas você precisa executá-lo para interromper o evento OnTime. Você pode fazer isso manualmente, atribuí-lo a um botão e fazer isso pressionando o botão ou chame-o a partir do evento Fechar pasta de trabalho.

Private Sub Workbook_BeforeClose (Cancelar como Booleano) Call StopRefresh End Sub

O código de evento ‘BeforeClose’ acima vai para a janela de código ThisWorkbook.

Evento Excel VBA OnKey

Quando você está trabalhando com o Excel, ele monitora as teclas que você usa. Isso nos permite usar pressionamentos de tecla como gatilho para um evento.

Com o evento OnKey, você pode especificar um pressionamento de tecla (ou uma combinação de pressionamentos de tecla) e o código que deve ser executado quando esse pressionamento de tecla é usado. Quando essas teclas são pressionadas, ele executa o código para isso.

Assim como o evento OnTime, você precisa ter uma maneira de cancelar o evento OnKey. Além disso, quando você define o evento OnKey para um pressionamento de tecla específico, ele se torna disponível em todas as pastas de trabalho abertas.

Antes de mostrar um exemplo de uso do evento OnKey, deixe-me primeiro compartilhar os códigos de chave que estão disponíveis para você no VBA.

CHAVE CÓDIGO
Backspace {BACKSPACE} ou {BS}
Quebrar {QUEBRAR}
Caps Lock {CAPS LOCK}
Excluir {DELETE} ou {DEL}
Seta para baixo {BAIXA}
Fim {FIM}
Digitar ~
Enter (no teclado nuerico) {DIGITAR}
Fuga {ESCAPE} ou {ESC}
Lar {CASA}
Ins {INSERIR}
Seta esquerda {DEIXOU}
Num Lock {NUM LOCK}
PageDown {PGDN}
Subir página {PGUP}
Seta direita {CERTO}
Scroll Lock {SCROLLOCK}
Aba {ABA}
Seta para cima {PRA CIMA}
F1 a F15 {F1} a {F15}

Quando você precisa usar qualquer evento onkey, você precisa usar o código para ele.

A tabela acima contém os códigos para pressionamentos de tecla individuais.

Você também pode combiná-los com os seguintes códigos:

  • Mudança: + (Sinal de mais)
  • Ao controle: ^ (Acento circunflexo)
  • Alt: % (Percentagem)

Por exemplo, para Alt F4, você precisa usar o código: “% {F4}”- onde% é para a tecla ALT e {F4} é para a tecla F4.

Agora vamos dar uma olhada em um exemplo (lembre-se que o código para eventos OnKey são colocados no módulo VBA regular).

Quando você pressiona a tecla PageUp ou PageDown, ele salta 29 linhas acima / abaixo da célula ativa (pelo menos é o que está fazendo no meu laptop).

Se quiser que ele pule apenas 5 linhas por vez, você pode usar o código abaixo:

Sub PageUpDOwnKeys () Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub Sub PageUpMod () On Error Resume Next ActiveCell.Offset (-5, 0) .Activate End Sub Sub PageDownMod () On Error Resume Next ActiveCell.Offset (5, 0) .Activate End Sub

Quando você executa a primeira parte do código, ele executa os eventos OnKey. Depois de executado, o uso das teclas PageUp e PageDown faria com que o cursor pule 5 linhas por vez.

Observe que usamos ‘On Error Resume Next’ para garantir que os erros sejam ignorados. Esses erros podem ocorrer quando você pressiona a tecla PageUp, mesmo quando você está no topo da planilha. Como não há mais linhas para pular, o código mostraria um erro. Mas como usamos ‘On Error Resume Next’, ele será ignorado.

Para garantir que esses eventos OnKey estejam disponíveis, você precisa executar a primeira parte do código. Caso deseje que isso esteja disponível assim que abrir a pasta de trabalho, você pode colocá-lo na janela de código ThisWorkbook.

Private Sub Workbook_Open () Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub

O código a seguir retornará as teclas à sua funcionalidade normal.

Sub Cancel_PageUpDownKeysMod () Application.OnKey "{PgUp}" Application.OnKey "{PgDn}" End Sub

Quando você não especifica o segundo argumento no método OnKey, ele retornará o pressionamento de tecla à sua funcionalidade normal.

Caso queira cancelar a funcionalidade de um pressionamento de tecla, de modo que o Excel não faça nada quando esse pressionamento de tecla for usado, você precisará usar uma string em branco como o segundo argumento.

No código a seguir, o Excel não faria nada quando usamos as teclas PageUp ou PageDown.

Sub Ignore_PageUpDownKeys () Application.OnKey "{PgUp}", "" Application.OnKey "{PgDn}", "" End Sub

Desabilitando eventos no VBA

Às vezes, você pode precisar desabilitar eventos para fazer seu código funcionar corretamente.

Por exemplo, suponha que eu tenha um intervalo (A1: D10) e desejo mostrar uma mensagem sempre que uma célula é alterada neste intervalo. Então, mostro uma caixa de mensagem e pergunto ao usuário se ele tem certeza de que deseja fazer a alteração. Se a resposta for Sim, a alteração foi feita e, se a resposta for Não, o VBA a desfará.

Você pode usar o código abaixo:

Private Sub Worksheet_Change (ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox ("Você está fazendo uma alteração nas células em A1: D10. Tem certeza que deseja?", vbYesNo) End If If Ans = vbNo Then Application.Undo End If End Sub

O problema com esse código é que, quando o usuário seleciona Não na caixa de mensagem, a ação é revertida (já que usei Application.Undo).

Quando ocorre o desfazer e o valor é alterado de volta para o original, o evento de alteração do VBA é novamente acionado e é exibida novamente a mesma caixa de mensagem ao usuário.

Isso significa que você pode continuar clicando em NÃO na caixa de mensagem e ela continuará aparecendo. Isso acontece porque você ficou preso no loop infinito neste caso.

Para evitar tais casos, você precisa desabilitar os eventos para que o evento de mudança (ou qualquer outro evento) não seja acionado.

O código a seguir funcionaria bem neste caso:

Private Sub Worksheet_Change (ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox ("Você está fazendo uma alteração nas células em A1: D10. Tem certeza que deseja?", vbYesNo) End If If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub

No código acima, logo acima da linha Application.Undo, usamos - Application.EnableEvents = False.

Definir EnableEvents como False não acionaria nenhum evento (na pasta de trabalho atual ou em qualquer pasta de trabalho aberta).

Depois de concluir a operação de desfazer, podemos voltar a propriedade EnableEvents para True.

Lembre-se de que a desativação de eventos afeta todas as pastas de trabalho que estão abertas no momento (ou abertas enquanto EnableEvents está definido como False). Por exemplo, como parte do código, se você abrir uma nova pasta de trabalho, o evento Abrir a pasta de trabalho não funcionará.

Impacto da pilha de desfazer eventos

Deixe-me primeiro dizer o que é um Undo Stack.

Quando você trabalha no Excel, ele continua monitorando suas ações. Quando cometer um erro, você sempre pode usar Control + Z para voltar à etapa anterior (ou seja, desfazer sua ação atual).

Se você pressionar Control + Z duas vezes, você voltará duas etapas. Essas etapas que você executou são armazenadas como parte da pilha Undo.

Qualquer evento que altere a planilha destrói essa pilha de Desfazer.Isso significa que, se eu tiver feito 5 coisas antes de acionar um evento, não poderei usar Control + Z para voltar às etapas anteriores. O desencadeamento do evento destruiu essa pilha para mim.

No código a seguir, eu uso o VBA para inserir o carimbo de data / hora na célula A1 sempre que houver uma alteração na planilha.

Private Sub Worksheet_Change (ByVal Target As Range) Application.EnableEvents = False Range ("A1"). Value = Format (Agora, "dd-mmm-aaaa hh: mm: ss") Application.EnableEvents = True End Sub

Como estou fazendo uma alteração na planilha, isso destruirá a pilha de desfazer.

Além disso, observe que isso não se limita apenas a eventos.

Se você tiver um código armazenado em um módulo VBA regular e fizer uma alteração na planilha, isso também destruirá a pilha de desfazer no Excel.

Por exemplo, o código a seguir simplesmente insere o texto “Olá” na célula A1, mas mesmo executando isso destruiria a pilha de desfazer.

Sub TypeHello () Range ("A1"). Value = "Hello" End Sub

Você também pode gostar dos seguintes tutoriais do Excel VBA:

  • Trabalhando com células e intervalos no Excel VBA.
  • Trabalhando com planilhas no Excel VBA.
  • Trabalhando com pastas de trabalho no Excel VBA.
  • Loops do Excel VBA - o guia definitivo.
  • Usando IF Then Else Statment no Excel VBA.
  • Para o próximo loop no Excel.
  • Criação de funções definidas pelo usuário no Excel VBA.
  • Como criar e usar suplementos no Excel.
  • Crie e reutilize macros salvando na pasta de trabalho de macros pessoais.

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

wave wave wave wave wave