Dicas de VBA – Eventos em Excel
Por Jorge Paulino para o Pplware
A execução de macros em Excel, está normalmente associada a um botão ou um objecto, no entanto existem diversas formas de executar macros, que podem simplificar bastante a automação na folha de cálculo. Este artigo pretende mostrar alguns exemplos simples de alguns dos eventos mais importantes e mais utilizados em VBA.
NOTA: Neste artigo será usado o Microsoft Excel 2010 mas o mesmo se aplica a versões anteriores com o Microsoft Excel 2003 ou o Microsoft Excel 2007.
Quando entramos no editor de VBA, o VBE (Visual Basic Editor), existem alguns objectos no explorador do projecto: um objecto por cada folha disponível (Sheet), e um objecto global (ThisWorkBook).
Objecto Sheet
No objecto Sheet, temos os eventos relativos apenas para essa folha, como por exemplo:
- Change: Quando é efectuada alguma alteração em alguma célula;
- SelectionChange: Quando é alterada a selecção;
- BeforeRightClick: Antes de clicar com o botão direito;
- Calculate: Quando é efectuada uma operação que obrigue a cálculos;
Existem mais disponíveis mas estes são talvez os mais utilizados. Por exemplo, o BeforeRightClick permite-nos criar um menu personalizado quando clicamos com o botão direito do rato, o Calculate permite-nos correr um código quando existem cálculos, etc, etc.
Por exemplo, se queremos executar qualquer código quando alteramos um valor numa determinada área, podemos utilizar o evento Change. Deste modo verificamos se a nossa área – range - coincide com a célula alterada, utilizando a função Intersect(), e executamos o nosso código.
Private Sub Worksheet_Change(ByVal Target As Range) ' Verifica se a célula modificada está entre o range B2:B10 If Not Intersect(Range("B2:B10"), Target) Is Nothing Then MsgBox("Executar código!") End If End Sub |
Objecto ThisWorkBook
No objecto ThisWorkBook estão os eventos comuns a todas as folhas e os eventos gerais, como por exemplo:
- Workbook_Open: Quando o documento é aberto
- Workbook_BeforeClose: Quando o documento é fechado (antes de fechar)
- Workbook_BeforeSave: Quando o documento vai ser gravado
- Workbook_NewSheet: Quando é adicionada uma nova folha
- Workbook_SheetChange: Quando é alterado qualquer célula em qualquer folha
- Workbook_SheetActivate: Quando uma folha é activada
Estes são apenas alguns dos eventos que estão disponíveis e que podem ser utilizados.
Por exemplo, se queremos saber qual a folha – Worksheet – que foi seleccionada, podemos fazer:
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim sheet As Worksheet sheet = Sh MsgBox(sheet.Name) End Sub |
Ou ainda, evitar que o documento seja fechado:
Private Sub Workbook_BeforeClose(ByVal Cancel As Boolean) Dim msg As String msg = "Deseja fechar o documento ?" ' Cancela o encerramento do documento If MsgBox(msg, vbYesNo) <> vbYes Then Cancel = True End If End Sub |
Como podem ver, existem vários eventos que podemos utilizar para melhorar os nossas folhas de cálculo, através do VBA, e com bastantes aplicações.
Para breve mais dicas de como melhorar o código em VBA!
Página Pessoal do Autor: Jorge Paulino
Este artigo tem mais de um ano
Obrigado pelo tópico.
Já aprendi mais alguma coisa. Obrigado
Muito bom…
Obrigada pela dica!
Aguardo pelas próximas 🙂
O código abaixo nao está funcionando…
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim sheet As Worksheet
sheet = Sh
MsgBox(sheet.Name)
End Sub
Variável de objeto ou variável do bloco With não definida (Erro 91)
Alguem sabe o que está faltando?
Qual o conteúdo da tua variável Sh?
Para atribuir um objecto a uma variável usar-se a keyword SET.
Assim deve funcionar:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim sheet As Worksheet
Set sheet = Sh
MsgBox(sheet.Name)
End Sub
Legal o artigo.
Obrigado pela dica.
Foi de grande ajuda para meu estudos.
Estou cursando o excel com vba pelo adv, http://www.cursoadv.com.br.
O site está muito legal.
Bom dia, existe alguma maneira de executar MACRO quando a célula for alterada ? sem que eu precise passar ou tocar na célula.?
Boa tarde, utilizei o método change para executar um código quando houvesse uma mudança de valor da célula A3 por exemplo, mas não ocorreu a execução do código quando houve a mudança no valor da célula. A mudança do valor ocorre através de um link DDE. Observei que quando esta mudança do valor é feita manualmente, funciona mas através do link DDE, NÃO. Você sabe me explicar pq???
Abs