Você está na página 1de 13

Microsoft Excel VBA Fact Sheet: Build a UserForm for Excel Martin Green www.fontstuff.

.com Traduo/Adaptao: Paulo Costa www.e-dicas.blogspot.com

Construir um Formulrio em VBA para Excel


Introduo
Um formulrio uma janela de dilogo personalizada que se constri utilizando o Editor de Visual Basic. Este exemplo construdo em Excel mas pode ser utilizado em qualquer outro programa que suporte VBA. Com um formulrio poder criar um interface amigvel para o seu livro ou documento, tornando assim mais controlvel para si e mais simples para o utilizador.

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).

Fig. 1 O projecto de Formulrio terminado.

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].

Inserir um novo Formulrio


Certifique-se que o actual livro de trabalho (por exemplo, VBAProject(Livro1)) est seleccionado na janela Project Explorer. De seguida abra o menu Inserir e escolha UserForm. Quando fizer isso um novo formulrio em branco ir surgir na janela de cdigo do Editor de Visual Basic e uma entrada correspondente surgir na janela Project Explorer (Fig.2). Nesta janela ver uma nova pasta chamada Forms contendo o novo formulrio ao qual foi atribudo o nome de UserForm1. A barra ToolBox (Fig.3) dever estar visvel caso contrario, clique algures no Formulrio (O Editor de Visual Basic esconde a ToolBox quando acha que estamos a trabalhar noutro objecto) e se mesmo assim ainda no estiver visvel abra-o atravs do menu View.

Fig. 3 - A janela Project Explorer mostra o formulrio.

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.

Renomear o Formulrio e adicionar um ttulo


Um projecto simples pode incluir vrios formulrios por isso boa ideia dar a cada um nome significativo. Com o formulrio seleccionado procure a propriedade Name na janela Properties Window ( normalmente a primeira propriedade da lista) e altere-o para frmDespesas. De seguida altere a propriedade Caption para Despesas Pessoais. A janela Project explorer mostra agora o novo nome do formulrio e a barra de ttulo mostra a nova propriedade caption (Fig.4).

Fig. 4 - A barra de ttulo do formulrio mostra a nova legenda

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).

Adicionar o controlo Caixa de Texto e um Rotulo


Os controlos so objectos, como caixa de texto, caixa de combinao e botes de comando, que sero inseridos no formulrio. A seleco dos controlos feita nos botes da ToolBox. Aponte para os botes da Toolbox para ver a legenda de cada um deles. Adicione uma caixa de texto ao formulrio, clicando no respectivo boto1 e depois clique mais ou menos no centro do formulrio. Assim como nos prprios formulrios, os controlos possuem um contorno pontilhado e alas de redimensionamento, isto quando o objecto est seleccionado (clique num objecto para o seleccionar). Poder alterar o tamanho e a forma do controlo, quer agarrando e arrastando as alas de redimensionamento (o ponteiro do rato mudar para uma dupla seta (Fig. 5)) quer alterando os valores das propriedades Height e Width na janela Proprieties Window. Para mover um controlo agarre no limite pontilhado (o ponteiro do rato mudar para uma cruz bidireccional (Fig. 6)) ou altere os valores das propriedades Top e Left.

TextBox

Fig. 6 - Redimensionar um controlo

Fig. 5 - Mover um controlo

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.

Adicionar os restantes controlos


Utilize as mesmas tcnicas para adicionar os restantes controlos ao formulrio. Precisa adicionar quatro caixas de texto, uma caixa de combinao (caixa de texto com uma lista pendente), uma caixa de verificao e trs botes de comando. Segue a lista dos controlos em falta e as suas propriedades: Caixa de texto ................ Name: txtapelido Rotulo ............................. Caption: Apelido: Caixa de combinao ..... Name: cboDepartamento Rotulo ............................. Caption: Departmento: Caixa de texto ................ Name: txtData Rotulo ............................. Caption: Data: Caixa de texto ................ Name: txtquantia Rotulo ............................. Caption: Quantia: Caixa de Verificao....... Name: chkRecibo, Caption: Recibo? Caixa de texto ................ Name: txtDescricao, Height:45, Width:132, scrollbars: 2-fmScrollbarsVertical Rotulo ............................. Caption: Descrio: Boto de comando......... Name: cmdOK, Caption: OK Boto de comando......... Name: cmdLimpar, Caption: Limpar Boto de comando......... Name: cmdCancelar, Caption: Cancelar DICA: A qualquer altura poder verificar qual o aspecto que o formulrio est a tomar, bastando para isso pressionar a tecla [F5] ou clicando no boto Run da barra de ferramentas do Editor de Visual Basic. Ao fazer isso ir surgir o formulrio no programa hospedeiro (neste caso o Excel). Para voltar ao Editor de Visual Basic, feche o formulrio, clicando no boto [x] no canto superior direito.O formulrio quando concludo dever ser similar imagem seguinte (Fig. 9):

Fig. 9 - O Formulrio concludo em vista esquema de formulrio (esquerda) e em uso (direita)

Criar a lista para a caixa de combinao


A caixa de escolha do Departamento, precisa agora que lhe seja atribuda a lista que deve apresentar. H duas maneiras de fazer isso. Pode ser feito atravs de cdigo (este mtodo est descrito na seco seguinte) ou podemos indicar uma rea nomeada do livro. Este ltimo mtodo o mais utilizado porque podemos editar a lista facilmente sem necessidade de reescrever cdigo algum. Mude para o Excel seleccione uma folha do mesmo livro. Escreva numa coluna os elementos que deseja que surjam na lista da caixa de combinao. Coloque um elemento em cada clula. Se desejar que os elementos aparecem ordenados alfabeticamente, ordene os elementos na prpria folha de clculo. Agora seleccione as clulas que vo dar origem lista de opes e atribua-lhes um nome. A maneira mais fcil clicar na caixa de nome (mesmo por cima da clula A1), escreva o nome Departamentos, (Fig. 10) clicando de seguida na tecla [Enter]. Clique numa clula qualquer da folha de clculo e verifique se atribui o nome correctamente, clicando na seta preta da caixa de nome e seleccione o nome Departamentos. Dever visualizar o conjunto de clulas j seleccionadas.

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).

Verificar a ordem de tabulao


Muitas pessoas gostam de usar a tecla [Tab] para se movimentarem nos elementos de um formulrio. A ordem que a tecla Tab segue a ordem com que so inseridos os controlos n o formulrio.
3

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).

Fig. 12 A janela Tab Order

Escreva o Cdigo VBA


O esquema do formulrio est agora pronto. O prximo passo escrever o cdigo VBA para que funcione. necessrio cdigo para cada um dos botes

Cdigo para o boto cancelar


O boto Cancelar o mais fcil de codificar. Ter de fazer o mesmo que faz o boto integrado ([X]), no canto direito superior do formulrio. Duplo clique no boto de comando cmdCancelar (ou um clique com a tecla direita e escolha a opo View Code) para abrir o mdulo de cdigo do formulrio. O Editor de Visual Basic vai mostrar j as linhas Sub e End Sub do evento Click. Coloque o seu cursor no espao vazio entre estas linhas, pressione a tecla [Tab] e escreva a seguinte linha:
Unload Me

O seu cdigo dever ser igual ao seguinte (Listagem 1): Listagem 1


Private Sub cmdCancelar_Click() Unload Me End Sub

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

Cdigo para o boto Ok


O Boto Ok tem de realizar trs tarefas. Tem de: 1. Verificar se todas as informaes foram fornecidas pelo utilizador (isto chamado de validao). 2. Escrever os dados na folha de clculo. 3. Apagar os dados do formulrio para poder introduzir nova informao. Na vista esquema de formulrio d um duplo clique no boto cmdOk e insira as linhas seguintes no procedimento cmdOk_Click (Listagem 2): Listagem 2
Private Sub cmdOK_Click() If Me.txtnome.Value = "" Then MsgBox "Por favor, insira um Nome.", vbExclamation, "Despesas pessoais" Me.txtnome.SetFocus Exit Sub End If End Sub

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).

Fig. 13 - A mensagem de erro lembra o utilizador a colocao do nome

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.

Cdigo para o boto Limpar


A funo deste boto limpar o formulrio manualmente, se o utilizador o desejar. Ele usa exactamente o mesmo procedimento que a ltima parte do processo do boto OK, ento d um duplo clique no boto cmdLimpar para criar seu procedimento de evento Click e digite o cdigo mostrado na Listagem 5. Voc pode copiar o cdigo do procedimento do boto OK para poupar tempo.

Compilar, Testar e Guardar O Formulrio terminado


Acabamos de completar o cdigo para o formulrio. Compile e teste. Se estiver satisfeito com o funcionamento do formulrio guarde o ficheiro. O trabalho est quase terminado. Tudo o que resta criar uma macro para abrir o formulrio.

A macro para abrir o Formulrio


Como viu, fcil abrir o formulrio pelo Editor de Visual Basic, mas a pessoa que ir utilizar esta ferramenta precisa de uma maneira simples de abrir o formulrio pelo Excel. H vrias maneiras de conseguir isso, todas envolvem a utilizao desta simples declarao:
4

No original Timestamp

10

frmDespesas.Show

Abrir o formulrio manualmente


Esta declarao pode ser includa numa macro que o utilizador pode chamar atravs de um menu. Para criar esta macro no Editor de Visual Basic, clique no menu Insert e escolha a opo Module para adicionar um normal modulo ao livro que contem o formulrio. Insira o cdigo abaixo na janela deste novo mdulo (Listagem 6) Listagem 6
Sub AbrirFormulario() Worksheets("Folha1").Activate frmDespesas.Show End Sub

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.

Abrir o formulrio Automaticamente


Poder fazer uso de um dos procedimentos do Excel embutido no evento, para abrir o formulrio automaticamente quando o livro aberto. No Editor de Visual Basic localize e clique duas vezes no mdulo ThisWorkbook na janela Project Explorer. Este mdulo existe para manter as macros especficas para este livro de trabalho. No topo da janela de cdigo existem duas listas pendentes. A da esquerda mostra neste momento Geral. Abra a lista e escolha Workbook. O Editor do Visual Basic automaticamente cria a macro Workbook_Open. Qualquer cdigo que colocar neste macro ser executado automaticamente quando o livro abre. (Se quiser ver o que poder fazer mais, d uma olhadela nos outros itens na lista direita.) Complete do cdigo da macro do seguinte modo (Listagem 7): Listagem 7
Private Sub Workbook_Open() Worksheets("Folha1").Activate frmDespesas.Show End Sub

Listagem com o cdigo complete para o formulrio


Aqui est a listagem completa do cdigo no mdulo do formulrio (Listagem 8) Listagem 8
Private Sub cmdCancelar_Click() Unload Me End Sub

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

Private Sub cmdOK_Click() Dim Contadorlinhas As Long Dim ctl As Control


' Verifica os dados inseridos pelo utilizador If Me.txtnome.Value = "" Then MsgBox "Please enter a Nome.", vbExclamation, "Staff Expenses" Me.txtnome.SetFocus Exit Sub End If If Me.txtapelido.Value = "" Then MsgBox "Please enter a Apelido.", vbExclamation, "Staff Expenses" Me.txtnome.SetFocus Exit Sub End If If Me.cboDepartamento.Value = "" Then MsgBox "Please choose a Departmento.", vbExclamation, "Staff Expenses" Me.txtnome.SetFocus Exit Sub End If If Me.txtData.Value = "" Then MsgBox "Please enter a Data.", vbExclamation, "Staff Expenses" Me.txtnome.SetFocus Exit Sub End If If Me.txtquantia.Value = "" Then MsgBox "Please enter an Quantia.", vbExclamation, "Staff Expenses" Me.txtnome.SetFocus Exit Sub End If If Me.txtDescricao.Value = "" Then MsgBox "Please enter a Description.", vbExclamation, "Staff Expenses" Me.txtnome.SetFocus Exit Sub End If If Not IsNumeric(Me.txtquantia.Value) Then MsgBox "The Quantia box must contain a number.", vbExclamation, "Staff Expenses" Me.txtquantia.SetFocus Exit Sub End If If Not IsDate(Me.txtData.Value) Then MsgBox "The Data box must contain a Data.", vbExclamation, "Staff Expenses" Me.txtData.SetFocus Exit Sub End If ' Escrever os dados na folha

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