You are on page 1of 13

Microsoft Excel VBA Fact Sheet: Build a UserForm for Excel

© Martin Green www.fontstuff.com
Tradução/Adaptação: Paulo Costa – www.e-dicas.blogspot.com

Construir um Formulário em VBA para
Excel
Introdução
Um formulário é uma janela de diálogo personalizada que se constrói utilizando o Editor de Visual Basic.
Este exemplo é construído em Excel mas pode ser utilizado em qualquer outro programa que suporte
VBA.
Com um formulário poderá criar um interface amigável para o seu livro ou documento, tornando assim
mais controlável para si e mais simples para o utilizador.

Sobre o projecto
Este documento mostra como construir um simples formulário para inserir dados pessoais sobre
despesas numa folha de cálculo. O trabalho está dividido em duas secções principais: a construção do
formulário em si e de seguida, escrever o código VBA para que ele funcione. O formulário final será
parecido com a imagem seguinte (Fig.1).

Fig. 1 – O projecto de Formulário terminado.

1

Quando fizer isso um novo formulário em branco irá surgir na janela de código do Editor de Visual Basic e uma entrada correspondente surgirá na janela Project Explorer (Fig. Construir o Formulário Inicie o Excel e abra o Editor de Visual Basic (atalho de teclado: [Alt]+[F11]). se não estivem visíveis coloque-as através do Menu View. Fig. Se estiver a trabalhar numa outra versão do Excel ou noutro sistema operativo a diferença será pequena.NOTA: as imagens aqui apresentadas mostram como são as janelas na versão Excel 2010 a correr num sistema operativo Windows Vista. Irá necessitar das janelas do Project Explorer e Properties Window por isso. DICA: ao construir o seu formulário tente evitar o duplo clique em qualquer objecto a menos que as instruções o indiquem). porque isso por vezes abre a janela de código do formulário. clique algures no Formulário (O Editor de Visual Basic esconde a ToolBox quando acha que estamos a trabalhar noutro objecto) e se mesmo assim ainda não estiver visível abra-o através do menu View. mas todas as técnicas explicadas serão exactamente iguais. 2 . Se isso acontecer acidentalmente. A barra ToolBox (Fig. Inserir um novo Formulário Certifique-se que o actual livro de trabalho (por exemplo.A janela Project Explorer mostra o formulário.A ToolBox 2 . De seguida abra o menu Inserir e escolha UserForm. 3 . Fig. VBAProject(Livro1)) está seleccionado na janela Project Explorer. Nesta janela verá uma nova pasta chamada Forms contendo o novo formulário ao qual foi atribuído o nome de UserForm1. simplesmente feche a janela do código no botão fechar ou volte à janela do Formulário com o atalho de teclado [Control]+[Tab].2).3) deverá estar visível caso contrario.

como caixa de texto.O Formulário tem um limite pontilhado ao seu redor. Adicione uma caixa de texto ao formulário.e. Fig. No contorno. quer agarrando e arrastando as alças de redimensionamento (o ponteiro do rato mudará para uma dupla seta (Fig. Renomear o Formulário e adicionar um título Um projecto simples pode incluir vários formulários por isso é boa ideia dar a cada um nome significativo. Com o formulário seleccionado procure a propriedade Name na janela Properties Window (é normalmente a primeira propriedade da lista) e altere-o para frmDespesas. 5)) quer alterando os valores das propriedades Height e Width na janela Proprieties Window. isto quando o objecto está seleccionado (clique num objecto para o seleccionar). clicando no respectivo botão1 e depois clique mais ou menos no centro do formulário. De seguida altere a propriedade Caption para Despesas Pessoais. 6)) ou altere os valores das propriedades Top e Left. A grelha de pontos no interior do formulário serve para ajudar a alinhar os objectos facilmente. Aponte para os botões da Toolbox para ver a legenda de cada um deles. 1 TextBox 3 . Assim como nos próprios formulários.A barra de título do formulário mostra a nova legenda Quando nomear formulários e os seus controlos lembre-se que não pode incluir espaços ou alguma das “palavras reservadas” (i. aquelas palavras que fazem parte da linguagem do VBA tal com “Date”). A janela Project explorer mostra agora o novo nome do formulário e a barra de título mostra a nova propriedade caption (Fig. no canto inferior direito e a meio da aresta inferior e do lado direito do formulário. Para mover um controlo agarre no limite pontilhado (o ponteiro do rato mudará para uma cruz bidireccional (Fig. os controlos possuem um contorno pontilhado e alças de redimensionamento. que serão inseridos no formulário. Poderá alterar o tamanho e a forma do controlo. Estes são as alças de redimensionamento.4). Poderá utilizar o rato para agarrar e arrastar de forma a redimensionar para o tamanho necessário. 4 . caixa de combinação e botões de comando. Adicionar o controlo Caixa de Texto e um Rotulo Os controlos são objectos. A selecção dos controlos é feita nos botões da ToolBox. existem pequenos quadrados brancos.

Este controlo em particular tem o nome predefinido de TextBox1.Redimensionar um controlo Fig. “cbo” para caixas de combinação. Embora esta seja um recurso útil. Para alterar a legenda do rótulo poderá digitar directamente no rótulo ou mudar na janela Properties Window. Mude a legenda para Nome:. Arraste o rótulo de modo a ficar à esquerda da caixa de texto. (ex.Mover um controlo Arraste a caixa de texto para perto do topo e mais ou menos centrado no formulário. 7 . et. 7). de forma a posicionar correctamente com a caixa de texto (Fig. Cada controlo deverá ter um nome suficientemente identificativo de modo a que quando estiver a escrever o código possa facilmente identifica-los. Utilize a janela Properties Window para mudar o nome para txtnome. 6 . txtDate em vez de Date). Nome. Pode verificar que não consegue colocar o rótulo exactamente ao centro da caixa de texto.Fig. Permite também forçar a que os nomes apareceram agrupados quando vistos numa lista ordenada. DICA: Quando atribuir nomes aos controlos é útil adicionar um prefixo descritivo do tipo de controlo (“txt” para as caixas de texto. A grelha força-o a ficar acima ou abaixo.Duplo clique na alça do canto inferior direito para ajustar o tamanho do rotulo Quando arrasta os controlos no formulário estes são automaticamente ajustados à grelha de pontos. Alem disso também permite utilizar palavras que isoladas não são permitidas. de modo a ajustar a dimensão ao texto (Fig. 5 . 8). por vezes podemos necessitar de maior precisão.). Fig. Agora utilize a TollBox para inserir um rótulo2 no formulário. Utilize a janela Properties Window para subtrair (ou adicionar caso seja necessário) 3 unidades à propriedade Top do rótulo. Isto permite lembra-lo qual o tipo de controlo quando estiver a trabalhar com o código. Mude a propriedade TextAlign do rótulo para 3-fmTextAlignRight e de seguida dê um duplo clique na alça de redimensionamento do canto inferior direito. 2 Label 4 .

.... 9): Fig...... Caption: Apelido: Caixa de combinação ............. Name: txtquantia Rotulo .......Utilize a janela Properties Window para ajustar a posição final do controlo Não é necessário dar um novo nome ao rótulo porque não nos vamos referir a ele neste projecto......... Adicionar os restantes controlos Utilize as mesmas técnicas para adicionar os restantes controlos ao formulário................................... scrollbars: 2-fmScrollbarsVertical Rotulo .. Segue a lista dos controlos em falta e as suas propriedades: Caixa de texto . Caption: Cancelar DICA: A qualquer altura poderá verificar qual o aspecto que o formulário está a tomar..............O formulário quando concluído deverá ser similar à imagem seguinte (Fig.................. Name: cmdLimpar. Name: chkRecibo.Fig.... Caption: Descrição: Botão de comando............... Name: cboDepartamento Rotulo .... Caption: Departmento: Caixa de texto .. Caption: Recibo? Caixa de texto ... noutras circunstâncias poderá ser necessário. Precisa adicionar quatro caixas de texto...... Name: txtDescricao........ feche o formulário.... clicando no botão [x] no canto superior direito.. 9 .. uma caixa de combinação (caixa de texto com uma lista pendente).. bastando para isso pressionar a tecla [F5] ou clicando no botão Run da barra de ferramentas do Editor de Visual Basic... uma caixa de verificação e três botões de comando... Caption: Limpar Botão de comando..... Caption: Quantia: Caixa de Verificação.. Width:132......... Name: cmdCancelar....... Caption: Data: Caixa de texto .... 8 . Caption: OK Botão de comando.. Name: txtData Rotulo ................ Ao fazer isso irá surgir o formulário no programa hospedeiro (neste caso o Excel).....O Formulário concluído em vista esquema de formulário (esquerda) e em uso (direita) 5 ......... Height:45.... Name: cmdOK............... Name: txtapelido Rotulo ...................... Para voltar ao Editor de Visual Basic...

Verifique o formulário (clique na tecla [F5]) e verifique se já surge a sua lista (Fig. Deverá visualizar o conjunto de células já seleccionadas. Fig. Clique numa célula qualquer da folha de cálculo e verifique se atribui o nome correctamente. Mude para o Excel seleccione uma folha do mesmo livro. precisa agora que lhe seja atribuída a lista que deve apresentar. Pode ser feito através de código (este método está descrito na secção seguinte) ou podemos indicar uma área nomeada do livro. 10) clicando de seguida na tecla [Enter]. Se desejar que os elementos aparecem ordenados alfabeticamente. 3 No MS Excel 2007/2010 – No separador Formulas e gestor de Nomes. clicando na seta preta da caixa de nome e seleccione o nome Departamentos. 6 . A ordem que a tecla Tab segue a ordem com que são inseridos os controlos n o formulário. Introduza o mesmo nome que atribuiu ao intervalo de células (neste exemplo Departamentos). Agora seleccione as células que vão dar origem à lista de opções e atribua-lhes um nome. Departamento. (Fig. Poderá fazer isso. Este último método é o mais utilizado porque podemos editar a lista facilmente sem necessidade de reescrever código algum. 11).Criar a lista para a caixa de combinação A caixa de escolha do Departamento. Há duas maneiras de fazer isso. ordene os elementos na própria folha de cálculo. para o seleccionar e de seguida aceda à janela Propreties Window e localize a propriedade RowSource. poderá necessitar redefinir a sua lista. no Menu Inserir escolha a opção Nome e Definir3. Escreva numa coluna os elementos que deseja que surjam na lista da caixa de combinação.A caixa de combinação mostra a lista Fig. Volte ao Editor de Visual Basic e clique na caixa de combinação. Coloque um elemento em cada célula. 10 – Atribui um Nome ao intervalo de células da lista Se precisar adicionar elementos à lista. 11 . A maneira mais fácil é clicar na caixa de nome (mesmo por cima da célula A1). Verificar a ordem de tabulação Muitas pessoas gostam de usar a tecla [Tab] para se movimentarem nos elementos de um formulário. escreva o nome Departamentos. seleccione o nome dado e clique em editar.

Volte ao Editor de Visual Basic. Fig. Se obtiver uma mensagem de erro verifique a escrita do código e compile o código de novo. Clique no menu Debug e escolha a opção Compile VBAProject. pressione a tecla [Tab] repetidamente e verifique se segue a ordem logica. Terá de fazer o mesmo que faz o botão integrado ([X]). De seguida mude para a vista esquema de formulário (pressione [Control]+[Tab] ou dê um duplo clique no nome do formulário na janela Project Explorer). 12). Pressione a tecla [F5] para executar o formulário em Excel. Coloque o seu cursor no espaço vazio entre estas linhas. Nome. pressione a tecla [Tab] e escreva a seguinte linha: Unload Me O seu código deverá ser igual ao seguinte (Listagem 1): Listagem 1 Private Sub cmdCancelar_Click() Unload Me End Sub Teste o código.Execute o formulário (abra-o em Excel) e começando na caixa de texto. Clique no Botão Cancelar e o formulário deverá fechar. feche o formulário e no Editor de Visual Basic. Se desejar mudar a ordem. de modo a controlar a comportamento da tecla [Tab] no formulário (Fig. no canto direito superior do formulário. clique no menu View e escolha a Tab Order. 7 . O Editor de Visual Basic vai mostrar já as linhas Sub e End Sub do evento Click. O próximo passo é escrever o código VBA para que funcione. Aqui poderá mover os itens na lista para cima e para baixo. Duplo clique no botão de comando cmdCancelar (ou um clique com a tecla direita e escolha a opção View Code) para abrir o módulo de código do formulário. 12 –A janela Tab Order Escreva o Código VBA O esquema do formulário está agora pronto. É necessário código para cada um dos botões… Código para o botão cancelar O botão Cancelar é o mais fácil de codificar.

o seu conteúdo é “” – 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. Faça uma entrada semelhante para cada caixa de texto e para a caixa de combinação. teste e compile o código.". e a função IsDate() para verificar se o valor da caixa de texto txtData é uma data. Apagar os dados do formulário para poder introduzir nova informação.txtnome. Fig.SetFocus Exit Sub End If End Sub Este procedimento utiliza uma instrução If para verificar o conteúdo da caixa de texto txtnome. Listagem 3 8 .Value = "" Then MsgBox "Por favor. Pode ver o código completo no final do documento (Listagem 8). Feche a mensagem de erro e de seguida preencha a caixa de texto Nome e clique de novo no botão OK. Na vista esquema de formulário dê um duplo clique no botão cmdOk e insira as linhas seguintes no procedimento cmdOk_Click (Listagem 2): Listagem 2 Private Sub cmdOK_Click() If Me. vbExclamation. 13 . Deverá visualizar a mensagem de erro (Fig. Verificar se todas as informações foram fornecidas pelo utilizador (isto é chamado de validação). 2. Digite as seguintes declarações (Listagem 3). 3.txtnome.A mensagem de erro lembra o utilizador a colocação do nome Alem de verificar se a caixa de texto tem algum valor.e. por vezes também é preciso verificar se é do tipo correcto. "Despesas pessoais" Me. insira um Nome.Código para o botão Ok O Botão Ok tem de realizar três tarefas. Abra o formulário e sem preencher a caixa de texto Nome. Escrever os dados na folha de cálculo. Como anteriormente. 13). Estas usam a função IsNumeric() para verificar se o valor da caixa de texto txtquantia é um numero ( e não algo como texto). Se a caixa de texto estiver vazia (i. Nenhuma mensagem deverá surgir agora. Tem de: 1. clique no botão OK.

txtData.txtData.Value) Then MsgBox "A Caixa da data deve conter uma data.CurrentRegion.Value . vbExclamation. Poderá preferir começar a tabela com uma linha de rótulos. Cada célula é identificada por uma posição relativa à célula A1. 6).Rows.Value = "Não" End If .".txtData. Insira uma nova linha no inicio deste procedimento. "dd/mm/yyyy hh:nn:ss") End With O código usa uma serie de declarações para escrever o valor de cada controlo numa célula.Value = Format(Now. começando na célula A1. 9 .Count Esta declaração conta quantas linhas de dados estão incluídos na região que inclui a célula A1 e armazena esse número na variável Contadorlinhas.txtquantia. tendo chegado a um ponto onde todos os itens necessários estão presentes e correctos. 6). imediatamente a seguir da declaração Private Sub cmdOK_Click() e escreva a linha seguinte: Dim Contadorlinhas As Long Eu assumi que as entradas vão ser feitas na Folha1 do livro de trabalho actual.Range("A1") .Offset(Contadorlinhas. 7).Value = Me. " Despesas pessoais " Me. 2).Value If Me.Offset(Contadorlinhas.SetFocus Exit Sub End If If Not IsDate(Me.txtapelido.Value = Me.txtnome.txtDescricao. o primeiro representa o número de linhas de distância da célula A1 (que está guardada na variável Contadorlinhas).Value .txtquantia.Value) Then MsgBox "A caixa da Quantia deve conter um número.". utilizando a propriedade de VBA Offset. 4).Offset(Contadorlinhas. "Despesas pessoais" Me.Value = Me.Value) . Volte ao fim do código e insira a próxima linha: Contadorlinhas = Worksheets("Folha1"). 1).Offset(Contadorlinhas. Agora escreva as linhas de código para escrever a data na folha de cálculo (Listagem 4): Listagem 4 With Worksheets("Folha1").Value .chkRecibo. 3).Value = DateValue(Me.SetFocus Exit Sub End If Agora.Offset(Contadorlinhas.Value = Me.Value = "Sim" Else .Range("A1"). 5).Offset(Contadorlinhas. 0). vbExclamation. a segunda representa o número de colunas de distância da célula A1 (que é escrita no código por um numero).Value = True Then . é hora de escrever as entradas para a folha de cálculo. O código funcionará na mesma com cabeçalhos ou não.Offset(Contadorlinhas.Offset(Contadorlinhas.Value .txtquantia.If Not IsNumeric(Me. Este código envolve a utilização de uma variável para armazenar o número de linhas da tabela.cboDepartamento.Offset(Contadorlinhas.Value = Me. Esta requer 2 números.

após os dados terem sido escritos para a folha de cálculo. se o utilizador o desejar. Testar e Guardar O Formulário terminado Acabamos de completar o código para o formulário. Você pode copiar o código do procedimento do botão OK para poupar tempo. todas envolvem a utilização desta simples declaração: 4 No original Timestamp 10 . Há várias maneiras de conseguir isso. o código utiliza uma declaração If para criar a entrada desejada. Digite as seguintes linhas (Listagem 5): Listagem 5 For Each ctl In Me. mas a pessoa que irá utilizar esta ferramenta precisa de uma maneira simples de abrir o formulário pelo Excel. O valor de uma caixa de verificação é expressa em “TRUE” ou “FALSE” assim. fornecido pela função Now (). Compile e teste.Note que a função DateValue() é usada para mudar o valor da caixa de texto para uma data real (invés de uma data apresentada como texto) antes de a passar para o Excel. Se ocorrerem erros verifique se escreveu exactamente como mostrado aqui. é fácil abrir o formulário pelo Editor de Visual Basic.Value = False End If Next ctl Compile e teste o código de novo.Value = "" ElseIf TypeName(ctl) = "CheckBox" Then ctl. Código para o botão Limpar A função deste botão é limpar o formulário manualmente. A macro para abrir o Formulário Como viu. Para concluir o procedimento. Ele usa exactamente o mesmo procedimento que a última parte do processo do botão OK. então dê um duplo clique no botão cmdLimpar para criar seu procedimento de evento Click e digite o código mostrado na Listagem 5. Se o controlo é uma caixa de verificação define o seu valor como False. Isso exige uma outra variável a ser inserida no topo do procedimento: Dim ctl As Control Esta variável representa os controlos na folha de calculo e será utilizado no ciclo de visita a cada controle. e se for define o valor do controlo para uma string vazia ("") . como eu quero ver “SIM” ou “NÃO” na folha de cálculo. Tudo o que resta é criar uma macro para abrir o formulário. Finalmente um registo de Registo de data/hora4 é inserido na última coluna usando o Format () para especificar a hora exacta.Controls If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl. verifica se é uma caixa de texto ou uma caixa de combinação. Se estiver satisfeito com o funcionamento do formulário guarde o ficheiro. o formulário precisa ser esvaziado. O trabalho está quase terminado. Agora é um bom momento para compilar e testar o código novamente. Compilar.

) Complete do código da macro do seguinte modo (Listagem 7): Listagem 7 Private Sub Workbook_Open() Worksheets("Folha1"). um botão numa barra de ferramentas. Abrir o formulário Automaticamente Poderá fazer uso de um dos procedimentos do Excel embutido no evento. Para criar esta macro no Editor de Visual Basic. dê uma olhadela nos outros itens na lista à direita. clique no menu Insert e escolha a opção Module para adicionar um normal modulo ao livro que contem o formulário. um botão na folha de cálculo ou um objecto de desenho.Activate frmDespesas.Activate frmDespesas. Qualquer código que colocar neste macro será executado automaticamente quando o livro abre. este poderia ser omitido e ainda assim os dados seriam colocados no sitio certo. No topo da janela de código existem duas listas pendentes. O utilizador pode correr esta macro a partir do menu do costume (Ferramentas> Macro> Macros) ou poderá atribuir a macro a um menu personalizado. Insira o código abaixo na janela deste novo módulo (Listagem 6) Listagem 6 Sub AbrirFormulario() Worksheets("Folha1"). No Editor de Visual Basic localize e clique duas vezes no módulo ThisWorkbook na janela Project Explorer. (Se quiser ver o que poderá fazer mais. Mas uma vez que o código que escreve os dados na folha de cálculo específica a folha pelo nome. Abra a lista e escolha Workbook.Show Abrir o formulário manualmente Esta declaração pode ser incluída numa macro que o utilizador pode chamar através de um menu. Ela diz ao Excel para mudar para a folha Folha1.frmDespesas. O Editor do Visual Basic automaticamente cria a macro Workbook_Open.Show End Sub A primeira linha é opcional. A da esquerda mostra neste momento Geral.Show End Sub Listagem com o código complete para o formulário Aqui está a listagem completa do código no módulo do formulário (Listagem 8) Listagem 8 Private Sub cmdCancelar_Click() Unload Me End Sub 11 . para abrir o formulário automaticamente quando o livro é aberto. Este módulo existe para manter as macros específicas para este livro de trabalho.

SetFocus Exit Sub End If If Not IsDate(Me.". vbExclamation.".".SetFocus Exit Sub End If If Me. "Staff Expenses" Me. "Staff Expenses" Me.txtnome.Value = "" Then MsgBox "Please enter a Description. vbExclamation.txtquantia.txtquantia.Value) Then MsgBox "The Data box must contain a Data. "Staff Expenses" Me.txtquantia. "Staff Expenses" Me.txtnome. vbExclamation. vbExclamation. "Staff Expenses" Me.txtnome.txtData.Controls If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl.SetFocus Exit Sub End If If Me.SetFocus Exit Sub End If ' Escrever os dados na folha 12 .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.Value = "" Then MsgBox "Please enter an Quantia.Value = "" Then MsgBox "Please enter a Nome. "Staff Expenses" Me.txtnome.txtnome.txtDescricao.txtnome.SetFocus Exit Sub End If If Me.".SetFocus Exit Sub End If If Not IsNumeric(Me.". "Staff Expenses" Me.SetFocus Exit Sub End If If Me.Value = "" Then MsgBox "Please choose a Departmento. vbExclamation. "Staff Expenses" Me.Value = "" Then MsgBox "Please enter a Data.Value = "" Then MsgBox "Please enter a Apelido.txtapelido.cboDepartamento.SetFocus Exit Sub End If If Me.txtData. vbExclamation.Private Sub cmdLimpar_Click() 'Limpa o formulario For Each ctl In Me.Value = "" ElseIf TypeName(ctl) = "CheckBox" Then ctl.".txtData.Value) Then MsgBox "The Quantia box must contain a number.".". vbExclamation. vbExclamation.txtnome.

Value = Me.Value = Me.Offset(Contadorlinhas.txtData.Range("A1").Value = Me.Value = "Sim" Else . 7).Count With Worksheets("Folha1").cboDepartamento. 2).Value .Value = "Não" End If End With ‘Limpa o formulário For Each ctl In Me.Controls If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl. 5).Rows.Value = DateValue(Me. "dd/mm/yyyy hh:nn:ss") If Me.Offset(Contadorlinhas.Value .Value = False End If Next ctl End Sub 13 .Value = "" ElseIf TypeName(ctl) = "CheckBox" Then ctl.Value . 0).txtquantia.Offset(Contadorlinhas.Offset(Contadorlinhas.Value = Format(Now.Offset(Contadorlinhas. 1).Value) .txtapelido.Contadorlinhas = Worksheets("Folha1").Value = True Then .txtnome. 6).Range("A1") .Value = Me.CurrentRegion. 3).Offset(Contadorlinhas. 7).Offset(Contadorlinhas.chkRecibo. 4).txtDescricao.Value .Offset(Contadorlinhas.Value .Value = Me.Offset(Contadorlinhas.