Eventos do Excel VBA
In this Article
- O que são eventos VBA?
- Tipos de eventos
- Perigos do Uso de Código em Eventos
- Desativar Eventos
- Exemplos de Eventos de Pasta de Trabalho
- Evento de Abertura da Pasta de Trabalho
- Evento de Nova Planilha da Pasta de Trabalho
- Evento Antes de Salvar Pasta de Trabalho
- Evento Antes de Fechar Pasta de Trabalho
- Exemplos de Eventos de Planilha
- Evento de Alteração de Planilha
- Evento de Planilha Antes de Clique Duplo
- Evento de Ativação da Planilha
- Eventos de Controle Active X
- Evento de Clique do Botão de Comando
- Evento de Alteração de Caixa de Combinação (Combo Box)
- Evento de Clique na Caixa de Seleção (Check Box)
- Eventos do UserForm
- Evento de Ativação do UserForm
- Evento de Alteração
- Evento Click
- Eventos de Gráfico
- Eventos de Aplicativo
- Application.OnTime
- Application.OnKey
O que são eventos VBA?
Os eventos acontecem o tempo todo quando um usuário abre uma pasta de trabalho do Excel e começa a executar várias ações, como inserir dados em células ou mover-se entre planilhas.
No Editor do Visual Basic (ALT + F11), já existem subrotinas configuradas que podem ser disparadas quando o usuário faz algo, por exemplo, inserir dados em uma célula. A subrotina não fornece nenhum código de ação, apenas uma instrução ‘Sub’ e uma instrução ‘End Sub’ sem nenhum código entre elas. Elas são efetivamente inativas, de modo que nada acontece até que você insira algum código.
Aqui está um exemplo baseado no evento “Change” (Alterar) em uma planilha:
Como programador de VBA, você pode adicionar código para fazer com que certas coisas aconteçam quando o usuário executa uma ação específica. Isso lhe dá a oportunidade de controlar o usuário e evitar que ele execute ações que você não quer que ele faça e que podem danificar a pasta de trabalho. Por exemplo, talvez você queira que ele salve sua própria cópia individual da pasta de trabalho com outro nome, para não afetar a original, que pode estar sendo usada por vários usuários.
Se eles fecharem a pasta de trabalho, serão automaticamente solicitados a salvar as alterações. No entanto, a pasta de trabalho tem um evento “BeforeClose” (antes de fechar) e você pode inserir um código para evitar que a pasta de trabalho seja fechada e dispare um evento “Salvar”. Em seguida, você pode adicionar um botão à própria planilha e colocar sua própria rotina “Salvar” nele. Você também pode desativar a rotina “Savar” usando o evento “BeforeSave” (antes de salvar).
Compreender o funcionamento dos eventos é absolutamente essencial para um programador VBA.
Tipos de eventos
Workbook Events (Eventos de pasta de trabalho) – esses eventos são disparados com base no que o usuário faz com a própria pasta de trabalho. Eles incluem ações do usuário, como abrir a pasta de trabalho, fechar a pasta de trabalho, salvar a pasta de trabalho, adicionar ou excluir planilhas.
Worksheet Events (Eventos de planilha ) – esses eventos são disparados por um usuário que realiza ações em uma planilha específica. Cada planilha dentro da pasta de trabalho tem um módulo de código individual, que contém vários eventos específicos para essa planilha (não para todas as planilhas). Isso inclui ações do usuário, como alterar o conteúdo de uma célula, clicar duas vezes em uma célula ou clicar com o botão direito do mouse em uma célula.
Eventos de controle Active X – Os controles Active X podem ser adicionados a uma planilha usando o ícone “Inserir” na guia “Desenvolvedor” da faixa de opções do Excel. Geralmente, são controles de botões que permitem que o usuário execute várias ações sob controle do seu código, mas também podem ser objetos, como menus suspensos. O uso de controles Active X em vez de controles de formulário na planilha oferece um escopo completo de programabilidade. Os controles Active X oferecem muito mais flexibilidade do ponto de vista da programação do que o uso de controles de formulário em uma planilha.
Por exemplo, você pode ter dois controles suspensos em sua planilha. Você deseja que a lista disponível no segundo drop down seja baseada no que o usuário escolheu no primeiro drop down. Usando o evento “Change” no primeiro menu suspenso, você pode criar um código para ler o que o usuário selecionou e atualizar o segundo menu suspenso. Você também pode desativar o segundo menu suspenso até que o usuário tenha feito uma seleção no primeiro menu suspenso.
Eventos UserForm – Você pode inserir e projetar um formulário de aparência profissional para usar como pop-up. Todos os controles colocados no formulário são controles Active X e têm os mesmos eventos que os controles Active X que você pode colocar em uma planilha.
Eventos de gráfico – Esses eventos estão relacionados apenas a uma planilha de gráfico e não a um gráfico que aparece como parte de uma planilha. Esses eventos incluem o redimensionamento do gráfico ou a seleção do gráfico.
Eventos de aplicativo – Esses eventos usam o objeto Application no VBA. Os exemplos permitiriam que o código fosse disparado quando uma determinada tecla fosse pressionada ou quando um determinado tempo fosse atingido. Você poderia programar uma situação em que a pasta de trabalho fosse deixada aberta 24 horas por dia, 7 dias por semana, e importasse dados de uma fonte externa durante a noite em um horário predeterminado.
Perigos do Uso de Código em Eventos
Quando você escreve um código para fazer algo quando o usuário executa uma determinada ação, é preciso ter em mente que seu código pode acionar outros eventos, o que pode colocar seu código em um loop contínuo.
Por exemplo, suponha que você use o evento “Change” (alterar) em uma planilha para que, quando o usuário colocar um valor em uma célula, um cálculo baseado nessa célula seja colocado na célula imediatamente à direita dela.
O problema aqui é que a colocação do valor calculado na célula aciona outro evento “Change”, que, por sua vez, aciona outro evento “Change”, e assim por diante, até que o código fique sem colunas para usar e exiba uma mensagem de erro.
Você precisa pensar cuidadosamente ao escrever o código do evento para garantir que outros eventos não sejam acionados inadvertidamente.
Desativar Eventos
Você pode usar o código para desativar eventos para contornar esse problema. O que você precisará fazer é incorporar o código para desativar os eventos enquanto o código do evento estiver em execução e, em seguida, reativar os eventos no final do código. Aqui está um exemplo de como fazer isso
Sub DesativarEventos()
Application.EnableEvents = False
Application.EnableEvents = True
End Sub
Lembre-se de que isso desativa todos os eventos em todo o aplicativo Excel, portanto, também afetaria outras funções do Excel. Se você usar isso por qualquer motivo, certifique-se de que os eventos sejam ativados novamente depois.
Importância dos Parâmetros nos Eventos
Os eventos geralmente têm parâmetros que podem ser usados para saber mais sobre o que o usuário está fazendo e a localização da célula em que ele se encontra.
Por exemplo, o evento Worksheet Change (alterar planilha) tem a seguinte aparência:
Private Sub Worksheet_Change(ByVal Target As Range)
Usando o objeto range, é possível descobrir as coordenadas de linha/coluna da célula em que o usuário está.
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Column
MsgBox Target.Row
End Sub
Se quiser que o código funcione somente em um determinado número de coluna ou linha, adicione uma condição que encerre a sub-rotina se a coluna não for a necessária.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
End Sub
Isso contorna o problema de seu código acionar vários eventos, pois só funcionará se o usuário tiver alterado uma célula na coluna 2 (coluna B).
Exemplos de Eventos de Pasta de Trabalho
Os eventos da pasta de trabalho são encontrados no objeto “EstaPastaDeTrabalho” no VBE Project Explorer. Você precisará selecionar “Workbook” no primeiro menu suspenso na janela de código e, em seguida, o segundo menu suspenso mostrará todos os eventos disponíveis
Evento de Abertura da Pasta de Trabalho
Esse evento é disparado sempre que a pasta de trabalho é aberta por um usuário. Você pode usá-lo para enviar uma mensagem de boas-vindas a um usuário, capturando seu nome de usuário.
Private Sub Workbook_Open()
MsgBox "Bem-vindo " & Application.UserName
End Sub
Também é possível verificar o nome do usuário em relação a uma lista mantida em uma planilha oculta para ver se ele está autorizado a acessar a pasta de trabalho. Se não for um usuário autorizado, você poderá exibir uma mensagem e fechar a pasta de trabalho para que ele não possa usá-la.
Evento de Nova Planilha da Pasta de Trabalho
Esse evento é acionado quando um usuário adiciona uma nova planilha à pasta de trabalho.
Você pode usar este código para permitir que apenas você mesmo adicione uma nova planilha, em vez de ter diferentes usuários adicionando planilhas e bagunçando a pasta de trabalho.
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Application.DisplayAlerts = False
If Application.UserName <> "Richard" Then
Sh.Delete
End If
Application.DisplayAlerts = True
End Sub
Observe que é necessário desativar os alertas, pois um aviso do usuário será exibido quando a planilha for excluída, o que permite que o usuário contorne o seu código. Certifique-se de que os alertas sejam ativados novamente depois!
Evento Antes de Salvar Pasta de Trabalho
Esse evento é acionado quando o usuário clica no ícone “Salvar”, mas antes que o “Salvar” realmente ocorra.
Conforme descrito anteriormente, talvez você queira impedir que os usuários salvem suas alterações na pasta de trabalho original e forçá-los a criar uma nova versão usando um botão na planilha. Tudo o que você precisa fazer é alterar o parâmetro ‘Cancel’ para True, e a pasta de trabalho nunca poderá ser salva pelo método convencional.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
End Sub
Evento Antes de Fechar Pasta de Trabalho
Você pode usar esse evento para evitar que os usuários fechem a pasta de trabalho e, novamente, forçá-los a sair por meio de um botão da planilha. Novamente, você define o parâmetro ‘Cancel’ como ‘True’. O X vermelho no canto superior direito da janela do Excel não funciona mais.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub
Exemplos de Eventos de Planilha
Os eventos de planilha são encontrados no objeto de nome de planilha específico no VBE Project Explorer. Você precisará selecionar “Worksheet” no primeiro menu suspenso na janela de código e, em seguida, o segundo menu suspenso mostrará todos os eventos disponíveis.
Evento de Alteração de Planilha
Esse evento é acionado quando um usuário faz uma alteração em uma planilha, como inserir um novo valor em uma célula.
Você pode usar esse evento para colocar um valor ou comentário adicional ao lado da célula alterada, mas, conforme discutido anteriormente, você não deseja iniciar um loop de eventos.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
ActiveSheet.Cells(Target.Row, Target.Column + 1). Value = _
ActiveSheet.Cells(Target.Row, Target.Column). Value * 1.1
End Sub
Nesse exemplo, o código só funcionará se o valor for inserido na coluna B (coluna 2). Se isso for verdade, ele adicionará 10% ao número e o colocará na próxima célula disponível.
Evento de Planilha Antes de Clique Duplo
Esse evento disparará o código se o usuário clicar duas vezes em uma célula. Isso pode ser extremamente útil para relatórios financeiros, como um balanço patrimonial ou uma conta de lucros e perdas, em que os números provavelmente serão questionados pelos gerentes, especialmente se o resultado final for negativo!
Você pode usar isso para fornecer um recurso de detalhamento, de modo que, quando o gerente questionar um determinado número, tudo o que ele precisa fazer é clicar duas vezes no número, e o detalhamento aparecerá como parte do relatório
Isso é muito impressionante do ponto de vista do usuário e evita que ele se pergunte constantemente “por que esse número é tão alto?”
Você precisaria escrever um código para descobrir o título/critério do número (usando as propriedades do objeto Target) e, em seguida, filtrar os dados tabulares e copiá-los para o relatório.
Evento de Ativação da Planilha
Esse evento ocorre quando o usuário passa de uma planilha para outra. Ele se aplica à nova planilha para a qual o usuário está se movendo.
Ele pode ser usado para garantir que a nova planilha seja completamente calculada antes que o usuário comece a fazer qualquer coisa nela. Também pode ser usado para recalcular apenas aquela planilha específica sem recalcular toda a pasta de trabalho. Se a pasta de trabalho for grande e contiver fórmulas complicadas, o recálculo de uma planilha economizará muito tempo
Private Sub Worksheet_Activate()
ActiveSheet.Calculate
End Sub
Eventos de Controle Active X
Conforme discutido anteriormente, é possível adicionar controles Active X diretamente a uma planilha. Eles podem ser botões de comando, menus suspensos e caixas de listagem.
Os eventos do Active X são encontrados no objeto específico do nome da planilha (onde você adicionou o controle) no VBE Project Explorer. Você precisará selecionar o nome do controle Active X no primeiro menu suspenso na janela de código e, em seguida, o segundo menu suspenso mostrará todos os eventos disponíveis
Evento de Clique do Botão de Comando
Ao colocar um botão de comando em uma planilha, você desejará que ele execute alguma ação. Para isso, coloque o código no evento Click.
Você pode facilmente colocar uma mensagem “Tem certeza?” para que seja feita uma verificação antes da execução do código
Private Sub CommandButton1_Click ()
Dim BotaoRet As Variant
BotaoRet = MsgBox("Tem certeza de que deseja fazer isso?", vbQuestion Or vbYesNo)
If ButtonRet = vbNo Then Exit Sub
End Sub
Evento de Alteração de Caixa de Combinação (Combo Box)
Uma caixa de combinação do Active X tem um evento de alteração, de modo que, se um usuário selecionar um item específico na lista suspensa, você poderá capturar a escolha usando esse evento e, em seguida, escrever um código para adaptar outras partes da planilha ou da pasta de trabalho de acordo.
Private Sub ComboBox1_Change ()
MsgBox "Você selecionou " & ComboBox1.Text
End Sub
Evento de Clique na Caixa de Seleção (Check Box)
É possível adicionar uma caixa de seleção ou de verificação a uma planilha para oferecer opções ao usuário. Você pode usar o evento de clique para ver se o usuário alterou alguma coisa. Os valores retornados são True (verdadeiro) ou False (falso), conforme a caixa tenha sido marcada ou não.
Private Sub CheckBox1_Click ()
MsgBox CheckBox1.Value
End Sub
Eventos do UserForm
O Excel permite que você crie seus próprios formulários. Eles podem ser muito úteis para serem usados como pop-ups para coletar informações ou para fornecer várias opções ao usuário. Eles usam controles Active X, conforme descrito anteriormente, e têm exatamente os mesmos eventos, embora os eventos dependam muito do tipo de controle.
Aqui está um exemplo de um formulário simples:
Quando ele é exibido, esta é a sua aparência na tela:
Você usaria eventos no formulário para fazer coisas como inserir um nome de empresa padrão quando o formulário for aberto, para verificar se o nome da empresa inserido corresponde a um nome já existente na planilha e se não foi escrito incorretamente e para adicionar código aos eventos de clique nos botões “OK” e “Cancelar”.
O código e os eventos por trás do formulário podem ser visualizados clicando-se duas vezes em qualquer lugar do formulário.
O primeiro menu suspenso dá acesso a todos os controles do formulário. O segundo menu suspenso dará acesso aos eventos
Evento de Ativação do UserForm
Esse evento é acionado quando o formulário é ativado, normalmente quando ele é exibido. Esse evento pode ser usado para configurar valores padrão, por exemplo, um nome de empresa padrão na caixa de texto do nome da empresa.
Private Sub UserForm_Activate()
TextBox1.Text = "Nome da Minha Empresa"
End Sub
Evento de Alteração
A maioria dos controles no formulário tem um evento de alteração, mas, neste exemplo, a caixa de texto do nome da empresa pode usar o evento para colocar uma restrição no comprimento do nome da empresa que está sendo inserido.
Private Sub TextBox1_Change ()
If Len (TextBox1.Text) > 20 Then
MsgBox "O nome está restrito a 20 caracteres", vbCritical
TextBox1.Text = ""
End If
End Sub
Evento Click
É possível usar esse evento para realizar ações quando o usuário clica nos controles do formulário ou até mesmo no próprio formulário.
Nesse formulário, há um botão “OK” e, depois de coletar o nome de uma empresa, queremos colocá-lo em uma célula da planilha para referência futura.
Private Sub CommandButton1_Click ()
ActiveSheet.Range("A1"). Value = TextBox1.Text
Me.Hide
End Sub
Esse código atua quando o usuário clica no botão “OK”. Ele coloca o valor da caixa de entrada do nome da empresa na célula A1 da planilha ativa e, em seguida, oculta o formulário para que o controle do usuário retorne à planilha.
Eventos de Gráfico
Os eventos de gráfico só funcionam em gráficos que estão em uma planilha de gráfico separada, e não em um gráfico incorporado a uma planilha padrão.
Os eventos de gráfico são um tanto limitados e não podem ser usados em uma planilha em que haja vários gráficos. Além disso, os usuários não querem necessariamente mudar de uma planilha contendo números para uma planilha de gráficos – não há impacto visual imediato nesse caso.
O evento mais útil seria descobrir o componente de um gráfico no qual o usuário clicou, por exemplo, um segmento em um gráfico de pizza ou uma barra em um gráfico de barras, mas esse não é um evento disponível na gama padrão de eventos.
Esse problema pode ser resolvido com o uso de um módulo de classe para adicionar um evento “Mouse Down” que retornará detalhes do componente do gráfico em que o usuário clicou. Isso é usado em um gráfico dentro de uma planilha.
Isso envolve uma codificação bastante complicada, mas os resultados são espetaculares. Você pode criar detalhamentos, por exemplo, o usuário clica em um segmento de gráfico de pizza e, instantaneamente, esse gráfico é ocultado e um segundo gráfico aparece em seu lugar, mostrando um gráfico de pizza detalhado para o segmento original, ou você pode produzir os dados tabulares que suportam esse segmento do gráfico de pizza.
Eventos de Aplicativo
Você pode usar o objeto Application no VBA para disparar código de acordo com um evento específico.
Application.OnTime
Isso pode permitir que você acione um trecho de código em intervalos regulares enquanto a pasta de trabalho estiver carregada no Excel. Talvez você queira salvar automaticamente a pasta de trabalho em uma pasta diferente a cada 10 minutos, ou deixar a planilha em execução durante a noite para trazer os dados mais recentes de uma fonte externa.
Neste exemplo, uma subrotina é inserida em um módulo. Ela exibe uma caixa de mensagem a cada 5 minutos, embora possa facilmente ser outro procedimento codificado. Ao mesmo tempo, ela redefine o cronômetro para a hora atual mais 5 minutos.
Toda vez que é executado, o cronômetro é redefinido para executar a mesma subrotina em mais 5 minutos.
Sub TesteFuncaoOnTime()
MsgBox "Testando função OnTime"
Application.OnTime (Now () + TimeValue("00:05:00")), "TesteFuncaoOnTime"
End Sub
Application.OnKey
Essa função permite que você crie suas próprias teclas de atalho. Você pode fazer com que qualquer combinação de teclas chame uma subrotina de sua criação.
Neste exemplo, a letra “a” é redirecionada para que, em vez de colocar um “a” em uma célula, seja exibida uma caixa de mensagem. Esse código precisa ser colocado em um módulo inserido.
Sub TestePressionarTecla()
Application.OnKey "a", "Teste_Pressionar_Tecla"
End Sub
Sub Teste_Pressionar_Tecla()
MsgBox "Você pressionou 'a'"
End Sub
Primeiro, você executa a subrotina ‘TestePressionarTecla’. Você só precisa executá-la uma vez. Ela informa ao Excel que toda vez que a letra “a” for pressionada, ele chamará a subrotina “Teste_Pressionar_Tecla”. A subrotina “Teste_Pressionar_Tecla” exibe apenas uma caixa de mensagem para informar que você pressionou a tecla “a”. É claro que ela poderia carregar um formulário ou fazer vários outros tipos de coisas.
Você pode usar qualquer combinação de teclas que possa ser usada com a função ‘SendKeys’.
Para cancelar essa funcionalidade, você executa a instrução ‘OnKey’ sem o parâmetro ‘Procedure’.
Sub CancelarOnKey()
Application.OnKey "a"
End Sub
Agora tudo está de volta ao normal.