Introdução
O Microsoft Access inclui vários recursos para permitir que os desenvolvedores de banco de dados criem formulários de entrada de dados, relatórios e consultas que podem orientar os usuários na consulta de dados existentes no banco de dados e na inserção de novos dados. Vários construtores de consultas e ferramentas de assistente facilitam esse processo de desenvolvimento. Mesmo com essas ferramentas, no entanto, pode haver situações em que o desenvolvedor gostaria de adicionar ainda mais funcionalidades ainda não fornecidas pelas ferramentas de desenvolvimento do MS Access. Por exemplo, o desenvolvedor pode querer corrigir automaticamente dados incorretos antes de serem salvos no banco de dados, mostrar um alerta se uma regra de negócios for violada, ajudar o usuário a navegar de um formulário de entrada de dados para outro ou iniciar um relatório com alguns filtros personalizados. A maneira de realizar essa personalização é adicionando código usando a linguagem de programação Visual Basic for Applications.
Visual Basic for Applications (VBA) é a linguagem de programação usada na família de produtos de software Microsoft Office, como Excel e Access. A linguagem VBA é derivada da linguagem “Basic” inventada em 1964 que se tornou popular em computadores pessoais na década de 1970. A parte “Visual” do nome foi adicionada pela Microsoft para refletir o uso da linguagem de programação Basic no Microsoft Windows.
Existem muitos tutoriais que introduzem a programação básica. Este tutorial se concentrará em um pequeno subconjunto de recursos da linguagem VBA, conforme usado no MS Access.
Conteúdo
- Eventos no Microsoft Access
- Exemplo de código VBA:garantindo que os nomes estejam em maiúsculas e minúsculas
- A linguagem VBA – Declarando e Atribuindo a Variáveis, Declarações Condicionais e Comentários
- A linguagem VBA – funções, métodos e exemplos
- A linguagem VBA – Propriedades
- Exercícios de codificação VBA
- Como lidar com erros no VBA
- Executando consultas SQL personalizadas no VBA
A próxima página apresenta eventos no Microsoft Access.
Eventos no Microsoft Access
No Access, o código de programação VBA é anexado a formulários e relatórios e pode ser configurado para ser executado em um horário específico ou em reação a um evento específico. Esse estilo de programação às vezes é chamado de programação “baseada em eventos”, o que significa que o código que o desenvolvedor escreve será executado em resposta a algum evento .
Quando um formulário é exibido no modo de exibição de formulário, ele geralmente consulta todos os dados existentes nas tabelas subjacentes e, em seguida, fica ocioso até que o usuário faça alguma coisa. Por exemplo, o usuário pode clicar em um dos botões de navegação para ir para o próximo registro, clicar em uma caixa de texto e começar a digitar alguns dados novos ou clicar no botão Fechar para fechar o formulário. Cada uma dessas ações resulta em um Evento acontecendo na forma. Cada clique do mouse ou toque do teclado é tratado como um evento.
Na maioria das vezes, os eventos têm um comportamento padrão. Clicar no botão de navegação “próximo registro” faz com que o formulário role para o próximo registro de dados. Digitar a letra “C” quando o cursor está em uma caixa de texto faz com que a letra “C” apareça na caixa de texto. Pressionar a tecla TAB faz com que o cursor salte para a próxima caixa de texto (ou controle) no formulário e assim por diante. Um programador pode substituir ou aprimorar esse comportamento padrão e inserir seu próprio código para ser executado em resposta ao evento.
A programação VBA em formulários de acesso e relatórios é focada principalmente em escrever código para responder a diferentes eventos.
Antes de mergulhar nos detalhes dos eventos, pode ser instrutivo implementar um exemplo simples. Para ver algum código em ação, a próxima seção deste tutorial fornece um passo a passo para adicionar código VBA a um formulário de entrada de dados.
Exemplo de código VBA:garantindo que os nomes estejam em maiúsculas e minúsculas
O que se segue é um exemplo relativamente breve e simples de adicionar código VBA a um formulário de entrada de dados no MS Access. Vários detalhes serão omitidos para fins de brevidade. Após este exemplo, o restante deste tutorial preencherá esses detalhes.
Este exemplo usa o Cliente formulário de entrada de dados que foi personalizado no tutorial Advanced MS Access Forms. Você pode querer completar esse tutorial (ou pelo menos as partes que tratam do formulário de entrada de dados do Cliente) antes de continuar.
Ao inserir novas informações do cliente, gostaríamos de garantir que os nomes do cliente sejam inseridos em “caixa adequada”. Ou seja, a primeira letra do nome deve ser maiúscula e o restante do nome deve ser minúsculo. Se o usuário digitar:“joe” gostaríamos que o formulário corrigisse automaticamente para maiúsculas:“Joe”.
Em termos de eventos, adicionaremos o código que está conectado ao evento After Update para o campo First Name no formulário do cliente. Isso significa que depois algo foi alterado (atualizado ) no campo First Name, o evento After Update será acionado e, em seguida, o código que escreveremos entrará em ação para garantir que o nome digitado seja convertido em maiúsculas e minúsculas.
As etapas a seguir colocam esse código no lugar.
- Abra a entrada de dados do cliente no modo de design.
- Clique com o botão direito do mouse no Nome caixa de texto e selecione Propriedades no menu pop-up.
- Quando a Folha de propriedades for exibido, clique na guia Evento. Isso é mostrado na figura abaixo:
Observe a lista de eventos que são exibidos. Cada um pode ser programado para responder ao evento específico que acontece com o FirstName caixa de texto. - Crie um novo manipulador de eventos clicando nos três pontos à direita do evento Após a atualização.
- O Escolher construtor janela aparecerá. Selecione Construtor de código e clique em OK botão.
- A janela de edição de código VBA será exibida. Observe que o Access já criou o stub da sub-rotina que começa com as palavras Private Sub e termina com as palavras End Sub.
O nome da sub-rotina é criado usando o nome do controle de formulários (FirstName) e o nome do Evento ao qual esta sub-rotina responderá (AfterUpdate).
A linha End Sub é onde esta sub-rotina em particular terminará.
- Adicione o seguinte código na linha vazia entre Private Sub e End Sub.:
FirstName = StrConv(FirstName, vbProperCase)
Depois de concluído, o código aparecerá da seguinte forma:
Esta nova linha de código faz o seguinte:
StrConv é uma função que recebe o conteúdo da caixa de texto FirstName e o converte de acordo com o segundo parâmetro fornecido, que é vbProperCase neste exemplo. Depois que essa conversão for feita, o resultado será atribuído (usando o sinal de igual) de volta à caixa de texto FirstName. Isso substituirá qualquer coisa que esteja atualmente na caixa de texto FirstName. Por exemplo, esta função pegará “sally”, converterá para “Sally” e então colocará “Sally” na caixa de texto FirstName. - Salve este novo código puxando para baixo o Arquivo menu e selecionando Salvar .
- Teste o novo código. Volte para a tela do modo de design do Microsoft Access. Altere a visualização para Visualização de formulário.
- Navegue até um registro vazio. Clique no campo FirstName e digite um nome em todas as letras minúsculas:
- Pressione a guia para mover para a próxima caixa de texto. O nome de Joe deve ser alterado para “Joe” conforme mostrado abaixo:
- Se você receber um erro, volte para o editor de código VBA e certifique-se de ter escrito todas as partes do código corretamente. Pode ser necessário baixar o Executar menu e selecione Redefinir para interromper a execução do código VBA.
O exemplo acima forneceu uma visão rápida de como se pode personalizar o comportamento de um formulário para ajudar o usuário a inserir dados bem formatados no banco de dados. Vários detalhes foram ignorados durante este exemplo e esses detalhes serão discutidos no restante deste tutorial.
A linguagem VBA
Esta seção apresenta brevemente as principais partes da linguagem VBA como ela é usada no MS Access. Uma visão geral abrangente do VBA está além do escopo deste tutorial. Referências a livros e materiais mais abrangentes são fornecidas no final deste tutorial.
Declarando variáveis
Uma variável é um nome dado a um espaço reservado onde o programador pode armazenar alguns dados. Por exemplo, uma variável pode ser usada para armazenar um número enquanto realizamos algumas operações matemáticas ou comparamos seu valor com outras variáveis. As variáveis podem ser declaradas para conter valores de um tipo de dados específico como Inteiros, Strings ou Datas. Para declarar uma nova variável, use a instrução Dim. Por exemplo, para declarar uma nova variável chamada MyName e configurá-lo para conter uma String (caracteres), faça o seguinte:
Dim strMyName As String
Para declarar uma nova variável chamada “AccountBalance” e configurá-la para armazenar um número com um decimal, use o seguinte:
Dim dblAccountBalance como duplo
Atribuindo valores
Um valor pode ser atribuído a uma variável ou a um controle no formulário usando o sinal de igual. Por exemplo, para armazenar o nome “Alex” na variável MyName, use o seguinte:
strMeuNome =“Alex”
Para copiar o conteúdo da caixa de texto FirstName para a variável MyName, use:
strMeuNome =[Nome]
Os valores também podem ser calculados antes de serem atribuídos. Por exemplo, a expressão a seguir pega o saldo da conta do cliente atual da caixa de texto [Saldo], adiciona 1% de juros (multiplicando o saldo por 1,01) e reduz o resultado em $ 10. Por fim, o resultado é atribuído à variável AccountBalance.
dblAccountBalance =( [Saldo] * 1,01 ) – 10,00
Declarações Condicionais
Uma instrução condicional usa um teste lógico para determinar quais linhas de código devem ser executadas em seguida. A instrução condicional If … Then é usada com bastante frequência. Por exemplo:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
A expressão lógica AccountBalance <1000 é avaliada. Se essa expressão for verdadeira (por exemplo, se AccountBalance for $ 400), a próxima linha após Then será executada. Neste exemplo, MonthlyFee =10.
Se essa expressão for False, a linha após o Else será executada.
A expressão lógica pode incluir várias partes que são conectadas pelos operadores booleanos OR, AND e NOT. Uma discussão mais completa sobre expressões booleanas pode ser encontrada neste tutorial de programação. Por exemplo, suponha que renunciamos à taxa mensal se a conta tiver menos de um ano. Suponha que temos AccountAge como a idade da conta em meses. Então o código ficaria:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Mais de uma linha de código pode ser executada na instrução If... Then e If... Then podem ser aninhadas umas nas outras.
Comentários
Ao programar em qualquer linguagem de programação, é uma boa prática incluir comentários que descrevam o código. No VBA, um comentário pode ser incluído começando com aspas simples. Tomando o exemplo acima como exemplo, podemos adicionar os seguintes comentários:
Mais partes da linguagem VBA são discutidas na próxima página.
Linguagem VBA – Continuação
Funções
A linguagem VBA possui um grande número de funções e métodos embutidos que podem ser usados para realizar várias tarefas, como funções matemáticas (sin, cos, tan), funções de string e muitas outras. As funções normalmente têm um ou mais parâmetros de entrada que são usados pela função. Por exemplo, na função Cos(45) o “45” é o ângulo de entrada no qual a função cosseno irá operar. A função StrConv requer dois parâmetros de entrada:A string a ser convertida e o estilo de conversão:
StrConv(FirstName, vbProperCase)
Algumas funções úteis incluem:
MsgBox(prompt, botões, título) | Exibe uma caixa de mensagem pop-up com o texto do prompt, botões e título |
StrConv( expressão, estilo ) | Converter a expressão de string para maiúsculas, minúsculas ou maiúsculas |
Esquerda( expressão, caracteres ) | Pegue os caracteres mais à esquerda da expressão de string |
Mid(expressão, início, caracteres) | Pegue o conjunto intermediário de caracteres da expressão de string começando no início |
IsNull(expressão) | Teste se a expressão de string (ou caixa de texto) não tem conteúdo (é nula) |
Nz( expressão, valor_if_null ) | Se a expressão for nula, preencha um valor padrão |
Agora() | Retorna a data e hora atuais |
Redondo(expressão, decimais) | Arredonda a expressão numérica para algumas casas decimais |
RGB(vermelho, verde, azul) | Retorna o número inteiro de cor com base em uma combinação de vermelho, verde e azul |
Métodos
Métodos em VBA são como funções, mas estão conectados a um controle ou outro objeto em um formulário ou relatório.
Alguns métodos úteis incluem:
DoCmd.CancelEvent | Cancela o evento atual que está sendo tratado |
DoCmd.Close | Fechar o formulário atual (ou banco de dados) |
DoCmd.OpenForm | Abre um novo formulário |
DoCmd.OpenReport | Execute um comando do MS Access, como salvar dados novos ou atualizados, desfazer uma alteração ou sair de um formulário |
.SetFocus | Defina o foco para o controle no formulário |
.Desfazer | Desfaça a alteração ou comando mais recente |
.Atualizar | Atualiza todos os dados subjacentes a um formulário |
.Request | Requer os dados fornecidos a um formulário |
.Repintar | Repinta todos os controles em um formulário |
Muitas outras funções e métodos estão listados neste site da Microsoft.
O conjunto de exemplos a seguir faz uso de várias funções e métodos em diferentes combinações.
Exemplos
Mostrar um aviso ao usuário se o saldo da conta for inferior a US$ 1.000
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Se a caixa de texto FirstName no formulário tiver algo nela, converta-a para maiúsculas e minúsculas
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
a próxima página apresenta Propriedades de diferentes objetos.
Propriedades
Cada elemento em um formulário ou relatório de entrada de dados tem um conjunto de propriedades associado a isso. As propriedades controlam o posicionamento, a cor, a fonte, o plano de fundo e outros atributos de aparência e formatação de cada controle. Por exemplo, algumas das muitas propriedades de um TextBox incluem:
Visível | Determina se a caixa de texto está visível no formulário |
Bloqueado | Determina se os dados na caixa de texto podem ser alterados |
Índice de guias | A ordenação de cada controle conforme o usuário navega no formulário pressionando Tab |
Etiqueta | Identifica o nome do rótulo associado à caixa de texto |
Largura, Altura, Posição Superior e Inferior | Indica a posição relativa e o tamanho da caixa de texto |
Estilo e cor do plano de fundo | Define o estilo de fundo e a cor da caixa de texto |
Estilo e cor da borda | Define o estilo e a cor da borda ao redor da caixa de texto |
Tamanho da fonte, peso, sublinhado, itálico, cor e alinhamento | Define a fonte e o estilo |
Margens e espaçamento de preenchimento – define as margens e o preenchimento ao redor da caixa de texto |
As propriedades podem ser definidas usando o Design View e salvas com o formulário ou relatório. As propriedades também podem ser alteradas usando o código VBA enquanto o formulário está sendo executado. Para acessar uma propriedade no VBA, use o nome do controle, depois um ponto e depois o nome da propriedade. Por exemplo, o código a seguir altera a cor da fonte da caixa de texto CustomerID para Red:
CustomerID.ForeColor =vbRed
As seções a seguir fornecem alguns exercícios que combinam diferentes partes da linguagem de programação VBA para personalizar o comportamento de vários formulários de entrada de dados.
Exercícios de código VBA
Experimente os seguintes exercícios que personalizam formulários. Consulte as seções anteriores para obter exemplos de código que podem ser adaptados ao exercício atual.
Exercício 1
Modifique o formulário CustomerDataEntry para adicionar dois manipuladores de eventos AfterUpdate que converterão o nome e o sobrenome para maiúsculas e minúsculas (crie um manipulador AfterUpdate separado para cada caixa de texto). Escreva o código para verificar primeiro se a caixa de texto não é nula antes de tentar converter o texto.
Exercício 2
Modifique o formulário AccountsDataEntry para adicionar um manipulador de eventos AfterUpdate que exibirá uma caixa de mensagem de aviso se o saldo da conta estiver abaixo de US$ 5.000. Transforme também a cor da fonte da caixa de texto Equilíbrio em Vermelho.
Exercício 3
Modifique o formulário de entrada de dados do cliente. Crie uma sub-rotina On Lost Focus que transforme o rótulo da caixa de texto FirstName em vermelho (vbRed) se o usuário sair da caixa de texto FirstName sem digitar nada. Defina o rótulo para azul (vbBlue) se houver algo na caixa de texto. No exemplo abaixo, nada foi digitado na caixa de texto FirstName e, em seguida, o usuário tabulou para a próxima caixa de texto, fazendo com que o rótulo FirstName ficasse vermelho.
A próxima página deste tutorial discute como lidar com erros no código VBA.
Como lidar com erros no VBA
Ocasionalmente, o código VBA apresentará um erro. Por exemplo, se uma caixa de texto estiver vazia e tentarmos converter o conteúdo da caixa de texto para maiúsculas e minúsculas, a função StrCnv falhará. Outro exemplo é quando ocorre a divisão por zero. Sem tratamento de erros, esses problemas podem fazer com que o programa VBA falhe. Quando ocorre um erro, um código especial pode entrar em ação para lidar com o erro e continuar processando o código VBA.
Os dois principais recursos de tratamento de erros do VBA são a instrução On Error Goto e a instrução Resume Next. Essas duas instruções de código VBA trabalham juntas para evitar que o VBA trave o aplicativo.
A instrução On Error Goto informa ao VBA sobre o que fazer quando ocorre um erro em uma sub-rotina. A parte Goto da instrução faz referência a um rótulo em outro lugar no código onde o VBA continuará funcionando. Assim que o programa VBA chegar ao rótulo, qualquer erro aparecerá em um objeto chamado Err. A propriedade Err.Description conterá uma descrição de texto do último erro encontrado. A instrução Resume Next fará com que o programa VBA continue executando a partir do ponto após a ocorrência do erro.
O exemplo a seguir expande a rotina FirstName_AfterUpdate apresentada no início deste tutorial. Agora o programa VBA pode lidar com quaisquer erros que possam ocorrer no programa.
Private Sub FirstName_AfterUpdate ' Subroutine to convert the FirstName of the customer to Proper Case On Error Goto FirstName_AfterUpdate_Error_Handler FirstName = StrConv(FirstName, vbProperCase) ' If the conversion was successful, exit this subroutine Exit Sub FirstName_AfterUpdate_Error_Handler: ' If there is an error show the description of the error MsgBox Err.Description ' Resume with the next statement In the subroutine Resume Next End Sub
a próxima seção deste tutorial discute como incluir código SQL no VBA.
Executando consultas SQL personalizadas no VBA
Structured Query Language (SQL) é a linguagem de programação usada em bancos de dados relacionais como MS Access, SQL Server, Oracle e muitos outros. As instruções SQL podem ser usadas para inserir, atualizar, excluir e recuperar (selecionar) registros de dados de tabelas (entre muitas outras habilidades). Um exemplo simples de uma instrução SQL seria:
SELECT customerid, firstname, lastname FROM customer
O código SQL pode ser escrito no VBA e executado em um momento apropriado. Por exemplo, uma sub-rotina VBA pode ser gravada para consultar a tabela Customer para encontrar o CustomerID mais alto. Em seguida, poderíamos adicionar 1 a esse número para obter um CustomerID novo e não utilizado para um novo registro.
Os passos gerais para realizar este tipo de tarefa são:
Criar uma instrução SQL
Execute a instrução SQL usando a conexão de banco de dados aberta (chamada CurrentDb no VBA)
Recupere os registros resultantes e use os dados recuperados
Para criar esta sub-rotina VBA, abra o formulário CustomerDataEntry e obtenha as propriedades do campo CustomerID. Na guia de eventos, clique nos três pontos à direita do evento On Dbl Click. Escolha Code builder e o stub será criado da seguinte forma:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Adicione o seguinte código:
Private Sub CustomerID_DblClick(Cancel As Integer) ' Create a new CustomerID when user double-clicks in the CustomerID field On Error GoTo ErrorHandler Dim rstResults As Recordset ' This will hold the set of result records Dim strSQL As String ' This variable will hold the text of the SQL Statement ' If there is nothing in the CustomerID text box If IsNull(CustomerID) Then ' Make the SQL statement strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer" ' Run the SQL query against the current database Set rstResults = CurrentDb.OpenRecordset(strSQL) ' If at least 1 record is returned If rstResults.EOF = False Then ' Assign the NewID to the CustomerID field CustomerID = rstResults!NewID End If rstResults.Close ' Close up the result set Set rstResults = Nothing ' Empty out the result set End If Exit Sub ErrorHandler: Set rstResults = Nothing End Sub
O código terá a seguinte aparência quando estiver tudo pronto:
Salve o arquivo e, em seguida, visualize o formulário CustomerDataEntry. Navegue até um novo registro e clique duas vezes no campo CustomerID. Um novo CustomerID deve ser criado automaticamente.