Escolar Documentos
Profissional Documentos
Cultura Documentos
Sobre o projecto
Este documento mostra como construir um simples formulrio para inserir dados pessoais sobre despesas numa folha de clculo. O trabalho est dividido em duas seces principais: a construo do formulrio em si e de seguida, escrever o cdigo VBA para que ele funcione. O formulrio final ser parecido com a imagem seguinte (Fig.1).
NOTA: as imagens aqui apresentadas mostram como so as janelas na verso Excel 2010 a correr num sistema operativo Windows Vista. Se estiver a trabalhar numa outra verso do Excel ou noutro sistema operativo a diferena ser pequena, mas todas as tcnicas explicadas sero exactamente iguais.
Construir o Formulrio
Inicie o Excel e abra o Editor de Visual Basic (atalho de teclado: [Alt]+[F11]). Ir necessitar das janelas do Project Explorer e Properties Window por isso, se no estivem visveis coloque-as atravs do Menu View. DICA: ao construir o seu formulrio tente evitar o duplo clique em qualquer objecto a menos que as instrues o indiquem), porque isso por vezes abre a janela de cdigo do formulrio. Se isso acontecer acidentalmente, simplesmente feche a janela do cdigo no boto fechar ou volte janela do Formulrio com o atalho de teclado [Control]+[Tab].
Fig. 2 - A ToolBox
O Formulrio tem um limite pontilhado ao seu redor. No contorno, no canto inferior direito e a meio da aresta inferior e do lado direito do formulrio, existem pequenos quadrados brancos. Estes so as alas de redimensionamento. Poder utilizar o rato para agarrar e arrastar de forma a redimensionar para o tamanho necessrio. A grelha de pontos no interior do formulrio serve para ajudar a alinhar os objectos facilmente.
Quando nomear formulrios e os seus controlos lembre-se que no pode incluir espaos ou alguma das palavras reservadas (i.e. aquelas palavras que fazem parte da linguagem do VBA tal com Date).
TextBox
Arraste a caixa de texto para perto do topo e mais ou menos centrado no formulrio. Cada controlo dever ter um nome suficientemente identificativo de modo a que quando estiver a escrever o cdigo possa facilmente identifica-los. Este controlo em particular tem o nome predefinido de TextBox1. Utilize a janela Properties Window para mudar o nome para txtnome. DICA: Quando atribuir nomes aos controlos til adicionar um prefixo descritivo do tipo de controlo (txt para as caixas de texto, cbo para caixas de combinao, et.). Isto permite lembra-lo qual o tipo de controlo quando estiver a trabalhar com o cdigo. Permite tambm forar a que os nomes apareceram agrupados quando vistos numa lista ordenada. Alem disso tambm permite utilizar palavras que isoladas no so permitidas. (ex. txtDate em vez de Date). Agora utilize a TollBox para inserir um rtulo2 no formulrio. Para alterar a legenda do rtulo poder digitar directamente no rtulo ou mudar na janela Properties Window. Mude a legenda para Nome:. Mude a propriedade TextAlign do rtulo para 3-fmTextAlignRight e de seguida d um duplo clique na ala de redimensionamento do canto inferior direito, de modo a ajustar a dimenso ao texto (Fig. 7). Arraste o rtulo de modo a ficar esquerda da caixa de texto, Nome.
Fig. 7 - Duplo clique na ala do canto inferior direito para ajustar o tamanho do rotulo
Quando arrasta os controlos no formulrio estes so automaticamente ajustados grelha de pontos. Embora esta seja um recurso til, por vezes podemos necessitar de maior preciso. Pode verificar que no consegue colocar o rtulo exactamente ao centro da caixa de texto. A grelha fora-o a ficar acima ou abaixo. Utilize a janela Properties Window para subtrair (ou adicionar caso seja necessrio) 3 unidades propriedade Top do rtulo, de forma a posicionar correctamente com a caixa de texto (Fig. 8).
Label
Fig. 8 - Utilize a janela Properties Window para ajustar a posio final do controlo
No necessrio dar um novo nome ao rtulo porque no nos vamos referir a ele neste projecto., noutras circunstncias poder ser necessrio.
Fig. 11 - A caixa de combinao mostra a lista Fig. 10 Atribui um Nome ao intervalo de clulas da lista
Se precisar adicionar elementos lista, poder necessitar redefinir a sua lista. Poder fazer isso, no Menu Inserir escolha a opo Nome e Definir3. Volte ao Editor de Visual Basic e clique na caixa de combinao, Departamento, para o seleccionar e de seguida aceda janela Propreties Window e localize a propriedade RowSource. Introduza o mesmo nome que atribuiu ao intervalo de clulas (neste exemplo Departamentos). Verifique o formulrio (clique na tecla [F5]) e verifique se j surge a sua lista (Fig. 11).
No MS Excel 2007/2010 No separador Formulas e gestor de Nomes, seleccione o nome dado e clique em editar.
Execute o formulrio (abra-o em Excel) e comeando na caixa de texto, Nome, pressione a tecla [Tab] repetidamente e verifique se segue a ordem logica. Se desejar mudar a ordem, feche o formulrio e no Editor de Visual Basic, clique no menu View e escolha a Tab Order. Aqui poder mover os itens na lista para cima e para baixo, de modo a controlar a comportamento da tecla [Tab] no formulrio (Fig. 12).
Teste o cdigo. Clique no menu Debug e escolha a opo Compile VBAProject. Se obtiver uma mensagem de erro verifique a escrita do cdigo e compile o cdigo de novo. De seguida mude para a vista esquema de formulrio (pressione [Control]+[Tab] ou d um duplo clique no nome do formulrio na janela Project Explorer). Pressione a tecla [F5] para executar o formulrio em Excel. Clique no Boto Cancelar e o formulrio dever fechar. Volte ao Editor de Visual Basic. 7
Este procedimento utiliza uma instruo If para verificar o contedo da caixa de texto txtnome. Se a caixa de texto estiver vazia (i.e. o seu contedo duplas aspas significam nada) uma mensagem mostrada e o foco direccionado para essa caixa de texto (o cursor colocado nessa caixa de texto) e o procedimento cancelado. Como anteriormente, teste e compile o cdigo. Abra o formulrio e sem preencher a caixa de texto Nome, clique no boto OK. Dever visualizar a mensagem de erro (Fig. 13). Feche a mensagem de erro e de seguida preencha a caixa de texto Nome e clique de novo no boto OK. Nenhuma mensagem dever surgir agora. Faa uma entrada semelhante para cada caixa de texto e para a caixa de combinao. Pode ver o cdigo completo no final do documento (Listagem 8).
Alem de verificar se a caixa de texto tem algum valor, por vezes tambm preciso verificar se do tipo correcto. Digite as seguintes declaraes (Listagem 3). Estas usam a funo IsNumeric() para verificar se o valor da caixa de texto txtquantia um numero ( e no algo como texto); e a funo IsDate() para verificar se o valor da caixa de texto txtData uma data. Listagem 3 8
If Not IsNumeric(Me.txtquantia.Value) Then MsgBox "A caixa da Quantia deve conter um nmero.", vbExclamation, "Despesas pessoais" Me.txtquantia.SetFocus Exit Sub End If If Not IsDate(Me.txtData.Value) Then MsgBox "A Caixa da data deve conter uma data.", vbExclamation, " Despesas pessoais " Me.txtData.SetFocus Exit Sub End If
Agora, tendo chegado a um ponto onde todos os itens necessrios esto presentes e correctos, hora de escrever as entradas para a folha de clculo. Este cdigo envolve a utilizao de uma varivel para armazenar o nmero de linhas da tabela. Insira uma nova linha no inicio deste procedimento, imediatamente a seguir da declarao Private Sub cmdOK_Click() e escreva a linha seguinte:
Dim Contadorlinhas As Long
Eu assumi que as entradas vo ser feitas na Folha1 do livro de trabalho actual, comeando na clula A1. Poder preferir comear a tabela com uma linha de rtulos. O cdigo funcionar na mesma com cabealhos ou no. Volte ao fim do cdigo e insira a prxima linha:
Contadorlinhas = Worksheets("Folha1").Range("A1").CurrentRegion.Rows.Count
Esta declarao conta quantas linhas de dados esto includos na regio que inclui a clula A1 e armazena esse nmero na varivel Contadorlinhas. Agora escreva as linhas de cdigo para escrever a data na folha de clculo (Listagem 4): Listagem 4
With Worksheets("Folha1").Range("A1") .Offset(Contadorlinhas, 0).Value = Me.txtnome.Value .Offset(Contadorlinhas, 1).Value = Me.txtapelido.Value .Offset(Contadorlinhas, 2).Value = Me.cboDepartamento.Value .Offset(Contadorlinhas, 3).Value = DateValue(Me.txtData.Value) .Offset(Contadorlinhas, 4).Value = Me.txtquantia.Value .Offset(Contadorlinhas, 5).Value = Me.txtDescricao.Value If Me.chkRecibo.Value = True Then .Offset(Contadorlinhas, 6).Value = "Sim" Else .Offset(Contadorlinhas, 6).Value = "No" End If .Offset(Contadorlinhas, 7).Value = Format(Now, "dd/mm/yyyy hh:nn:ss") End With
O cdigo usa uma serie de declaraes para escrever o valor de cada controlo numa clula. Cada clula identificada por uma posio relativa clula A1, utilizando a propriedade de VBA Offset. Esta requer 2 nmeros, o primeiro representa o nmero de linhas de distncia da clula A1 (que est guardada na varivel Contadorlinhas), a segunda representa o nmero de colunas de distncia da clula A1 (que escrita no cdigo por um numero).
Note que a funo DateValue() usada para mudar o valor da caixa de texto para uma data real (invs de uma data apresentada como texto) antes de a passar para o Excel. O valor de uma caixa de verificao expressa em TRUE ou FALSE assim, como eu quero ver SIM ou NO na folha de clculo, o cdigo utiliza uma declarao If para criar a entrada desejada. Finalmente um registo de Registo de data/hora4 inserido na ltima coluna usando o Format () para especificar a hora exacta, fornecido pela funo Now (). Agora um bom momento para compilar e testar o cdigo novamente. Para concluir o procedimento, aps os dados terem sido escritos para a folha de clculo, o formulrio precisa ser esvaziado. Isso exige uma outra varivel a ser inserida no topo do procedimento:
Dim ctl As Control
Esta varivel representa os controlos na folha de calculo e ser utilizado no ciclo de visita a cada controle, verifica se uma caixa de texto ou uma caixa de combinao, e se for define o valor do controlo para uma string vazia ("") . Se o controlo uma caixa de verificao define o seu valor como False. Digite as seguintes linhas (Listagem 5): Listagem 5
For Each ctl In Me.Controls If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl.Value = "" ElseIf TypeName(ctl) = "CheckBox" Then ctl.Value = False End If Next ctl
Compile e teste o cdigo de novo. Se ocorrerem erros verifique se escreveu exactamente como mostrado aqui.
No original Timestamp
10
frmDespesas.Show
A primeira linha opcional. Ela diz ao Excel para mudar para a folha Folha1. Mas uma vez que o cdigo que escreve os dados na folha de clculo especfica a folha pelo nome, este poderia ser omitido e ainda assim os dados seriam colocados no sitio certo. O utilizador pode correr esta macro a partir do menu do costume (Ferramentas> Macro> Macros) ou poder atribuir a macro a um menu personalizado, um boto numa barra de ferramentas, um boto na folha de clculo ou um objecto de desenho.
11
Private Sub cmdLimpar_Click() 'Limpa o formulario For Each ctl In Me.Controls If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl.Value = "" ElseIf TypeName(ctl) = "CheckBox" Then ctl.Value = False End If Next ctl End Sub
12
Contadorlinhas = Worksheets("Folha1").Range("A1").CurrentRegion.Rows.Count With Worksheets("Folha1").Range("A1") .Offset(Contadorlinhas, 0).Value = Me.txtnome.Value .Offset(Contadorlinhas, 1).Value = Me.txtapelido.Value .Offset(Contadorlinhas, 2).Value = Me.cboDepartamento.Value .Offset(Contadorlinhas, 3).Value = DateValue(Me.txtData.Value) .Offset(Contadorlinhas, 4).Value = Me.txtquantia.Value .Offset(Contadorlinhas, 5).Value = Me.txtDescricao.Value .Offset(Contadorlinhas, 6).Value = Format(Now, "dd/mm/yyyy hh:nn:ss") If Me.chkRecibo.Value = True Then .Offset(Contadorlinhas, 7).Value = "Sim" Else .Offset(Contadorlinhas, 7).Value = "No" End If End With Limpa o formulrio For Each ctl In Me.Controls If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl.Value = "" ElseIf TypeName(ctl) = "CheckBox" Then ctl.Value = False End If Next ctl End Sub
13