Você está na página 1de 37

O Editor do Visual Basic

Quem leu, ou assistiu ao filme, “As crônicas de Nárnia” de C.S. Lewis, pode imaginar
que a porta do guarda roupas que separa os dois universos é uma das opções do menu
do Excel. Essa porta sempre esteve presente no aplicativo e tudo que temos que fazer
para acessar essa outra dimensão é descobri-la e transpô-la. Faça isso através da
seqüência:

Ferramentas > Macro > Editor do Visual Basic.

Você não irá encontrar seres mitológicos e encantados, mas irá encontrar um ambiente
totalmente novo, onde impera a lógica e o desafio. Neste ambiente você pode tudo e
tudo o que imaginar pode se tornar realidade...

Como no conto, o primeiro contato é sempre um mistério, mas à medida que nos
aventurarmos nos comandos e painéis iremos adquirir a confiança e o conforto
necessário para desenvolvermos nossos programas.

Por ora vamos apenas dar uma olhada nas partes essenciais e aprender como visualizar
os painéis que utilizaremos com mais freqüência.

Esse é o mapa do universo onde iremos nos aventurar. Essencialmente, se não estiver
vendo os painéis mostrados na figura acima, clique em “Exibir” e selecione:

• Janela "Verificação Imediata"


• Project Explorer
• Janela "Propriedades"

Inserindo um formulário
Abra o Excel e acesse: Ferramentas>Macro>Editor do VisualBasic, ou mais
diretamente, segure a tecla ALT pressionada e tecle F11. Já tivemos oportunidade de
conhecer o painel do editor do Visual Basic quando utilizamos o gravador de macros na
segunda parte deste artigo. Desta vez vamos criar um formulário. Imagine um
formulário como sendo a imagem exibida por um programa qualquer quando o
executamos. Por exemplo, o próprio
Excel é um formulário composto por
células e barras de menu. O Word
também é um formulário.

Para inserir um formulário utilizando o


VBA do Excel, clique em: Inserir>
UserForm

Duas coisas devem ocorrer:

• Um formulário de nome
"UserForm1" será exibido,
• uma nova janela, denominada "Caixa de ferramentas" deve aparecer.

Como dissemos, se a caixa de ferramentas não aparecer, selecione “Exibir” na barra de


menu principal e clique sobre “Caixa de ferramentas”.

As ferramentas que aparecem na caixa de ferramentas são bastante conhecidas de todo


usuário de computador. Vamos olhar essa caixa um pouco mais de perto.

A caixa de ferramentas

A caixa de ferramentas é um formulário bem ao estilo do Visual Basic, contém vários


ícones correspondentes aos diversos tipos de ferramentas que podemos utilizar ao
desenvolver um programa. Em nosso exemplo iremos utilizar apenas algumas dessas
ferramentas:
Melhor que descrever o que faz cada uma dessas ferramentas é mostrar. As próximas
figuras indicam quais ferramentas foram utilizadas no programa exemplo para compor
os formulários UserForm1 e UserForm2:

Criando o formulário 1

Insira um formulário. Por padrão ele irá receber o nome de “UserForm1”. Vamos
manter este nome.

Label: Acesse a caixa de ferramentas. Clique sobre o ícone “label” e clique e


arraste no formulário para desenhar um retângulo como mostrado a seguir:
ComboBox:Clique agora sobre a ferramenta “caixa de combinação”. Clique e arraste
sobre o formulário, conforme a próxima figura :

CommandButton:Introduza dois botões de comando da mesma forma como fez para o


Label e para o ComboBox. O seu formulário deve estar parecido com o apresentado a
seguir. Se necessário, clique sobre os objetos e ajuste o tamanho e posição dos mesmos.
Alterando as propriedades dos objetos

Existem algumas diferenças visíveis entre o formulário que acabamos de criar e o


formulário que queremos que o programa exiba.

Além das descrições dos objetos também queremos alterar o tamanho e formato do
texto, sublinhar o “E” em “Encerrar” e o “A” em “Acessar”. Essas alterações são feitas
acessando-se as propriedades de cada objeto, como veremos a seguir.

Cada um dos objetos contidos no formulário possui propriedades que podem ser
alteradas. Vamos começar por “Label1”. Clique nesse objeto e examine o painel
“propriedades”. Cada uma das propriedades mostradas configura a aparência e o
comportamento do objeto. Vamos alterar a propriedade “Caption”.

A propriedade “Caption” modifica o texto exibido no formulário. Substitua a palavra


“Label1” que aparece na coluna ao lado da palavra “Caption” por “ Selecione o seu
nome:”, como mostra a figura ao lado. Clique em qualquer lugar fora do texto que
acabou de digitar para que o formulário seja atualizado.

Para fazer com que a borda ao redor do texto ajuste-se ao seu tamanho, primeiro arraste
a borda com o mouse até o ponto que julgar conveniente, arrumando o texto ao seu
gosto. Depois localize a propriedade “Autosize” e altere para “True”.

Outra propriedade que utilizo com muita freqüência é


“Font”. Essa propriedade permite alterarmos a maneira
como o texto é apresentado, tal como o seu tamanho, cor e
tipo. Com o texto selecionado no formulário, clique sobre
a propriedade “Font”. Dê duplo clique sobre o botão que
aparece ao lado direito para acessar o painel para alteração
da fonte.

Para efeito deste artigo, sempre que tivermos que alterar


uma propriedade, eu indicarei da seguinte forma:

• Nome do Objeto (identificação na tela)


o Propriedade: novo valor

Adotando essa notação para o “Label1”, como vimos acima, a notação fica da seguinte
forma:

• Label1 (Selecione o seu nome:)


o Caption: Selecione o seu nome:
o Font: Arial; Negrito;10

Para os outros elementos em “UserForm1”, altere as propriedades a seguir:

• UserForm1
o Caption: Medição de peças – Tela de acesso;
o Font: Arial; Negrito;14

• ComboBox1
o (Name): cbx_Usuarios
o Font: Arial; Negrito;10

• CommandButton1 (Encerrar)
o (Name): cmd_Encerrar
o Caption: Encerrar
o Font: Arial; Negrito;10
o Accelerator: E
• CommandButton2 (Acessar)
o (Name): cmd_Acessar
o Caption: Acessar
o Font: Arial; Negrito;10
o Accelerator: A

Duas observações são importantes neste ponto:

• A propriedade “Accelerator” faz com que surja um sublinhado abaixo da letra


que indicamos, portanto essa letra tem que estar contida na propriedade
“Caption” do objeto. Esse sublinhado significa que se o usuário, ao rodar o
programa, segurar a tecla “Alt” e apertar a tecla destacada, o comando será
executado da mesma forma como se tivéssemos clicado sobre o botão com o
mouse.
• A propriedade “(Name)” altera o nome do objeto, portanto ao mudarmos essa
propriedade o objeto com o nome anterior “deixa” de existir e precisamos nos
referenciar ao mesmo como o novo nome dado. Significa que se procurarmos o
“Commandbutton1” não iremos encontrá-lo, em seu lugar teremos
“cmd_Encerrar”.

Criando o formulário 2

Completamos esta parte do artigo com a inserção do segundo formulário. Insira um


novo formulário (Inserir > UserForm). Ele receberá o nome padrão de UserForm2.
Examine a figura ao lado e crie os controles mostrados, alterando as suas propriedades
conforme o indicado mais abaixo (para ver a imagem ampliada, clique sobre a mesma).
• UserForm2
o Caption: Medição de peças - tela de dados
o BackColor: &H8000000A&Amp;
o Font: Arial; Negrito;14

Nota: a propriedade “BackColor” altera a cor do


formulário. Ao acessá-la selecione uma cor em uma das duas paletas que vão aparecer.
O código acima é colocado na propriedade automaticamente, porém se preferir, pode
digitá-lo diretamente.

Altere a propriedade “Font” de todos os objetos para: Arial; Negrito; 10, exceto onde
indicado diferente.

• Label2 (29/07/2009)>
o Caption: Data

• Label1 (João Da Silva)>


o Caption: Nome

Altere todos os outros “Labels” dando à propriedade “Caption” o mesmo que aparece
na tela. Selecione todos os “Labels”, para isso selecione um “Label” qualquer e
mantenha a tecla “shift” apertada enquanto clica sobre os demais. Altere a propriedade
“Font”:

• Labels (todos)>
o Font: Arial; Negrito; 10
o BackColor: &H8000000A&

Nota: ao alterarmos a cor de um formulário temos que alterar também a cor de fundo
dos “Labels”, “Frames” e “OptionButtons”. Se não fizermos isso o aspecto do
formulário fica prejudicado.

• ComboBox1 (abaixo de Selecione o local de trabalho:)


o (Name): cbx_Local

• ComboBox2
o (Name): cbx_Equipamentos
Selecione todas as caixas de texto e altere a propriedade “Font”:

• TextBox (todos)
o Font: Arial; Negrito; 10

• Frame1 (tipo de medição)


o Caption: Tipo de medição
o BackColor: &H8000000A&
o Font: Arial; Negrito; 12

• OptionButton1
o Caption: Setup
o BackColor: &H8000000A&

• OptionButton2
o Caption: Rotina
o BackColor: &H8000000A&

• OptionButton3
o Caption: Aprovado
o BackColor: &H8000000A&

• OptionButton4
o Caption: Reprovado
o BackColor: &H8000000A&

• CommandButton1 (Cancelar)
o Caption: Cancelar
o Accelerator: C

• CommandButton2 (Salvar)
o Caption: Salvar
o Accelerator: S

Na próxima parte deste artigo irei mostrar como inserir a programação nos comandos
que acabamos de criar.

Encerrando o programa

Abra nosso programa exemplo no Excel, acesse o Editor do Visual Basic e dê um clique
duplo sobre o ícone do “UserForm1” , no painel do "Project Explorer". Clique sobre o
formulário para selecioná-lo e em seguida clique no sinal de avançar, na barra de
ferramentas do menu principal, conforme a figura a seguir:
Observe que o formulário
deve estar selecionado, se
estiver, ao clicar no ícone
mostrado no destaque você
deverá ver o programa em
execução mostrando o
formulário aguardando um
comando, como mostrado ao
lado. Clique sobre os objetos,
ou seja, botão “Encerrar”,
botão “Acessar” e na seta do
“ComboBox” e veja o que
ocorre.

Perfeito. Você acabou de aprender que os objetos necessitam de códigos de programa


para poderem funcionar, ou seja, não executam nada por si só. O primeiro código que
iremos inserir neste formulário é o código para encerrar o programa, para isso siga os
passos:

• Saia do modo de execução clicando sobre o ícone representado por um “X” no


formulário.
• Dê duplo clique sobre o botão “Encerrar” para abrir o painel de codificação.

Muita atenção nesta hora! Observe que quando damos um duplo clique sobre um objeto
no formulário, aparece o painel de codificação e o cursor fica localizado no método
padrão para o objeto selecionado. Esse método é o método mais comum durante a
programação do objeto, não significa que temos que aceitá-lo. Vamos examinar o
método proposto pelo Visual Basic:
O método é identificado pelo nome “Click” que aparece na caixa de combinação à
direita do formulário, como mostrado em destaque na figura. A outra forma de
identificarmos o método é lendo o nome dado à rotina onde o cursor está piscando,
também mostrado em destaque. Existem muitos outros métodos e cada um tem um
comportamento diferente. Para nosso exemplo, o método “Click” é perfeito. Esse
método significa que o código que está escrito entre as palavras “Private Sub
cmd_Encerrar_Click()” e “End sub” será executado sempre que “Clicarmos” com o
mouse sobre esse objeto. Digite a palavra “END” no local onde o cursor está piscando.
Clique novamente no ícone de avançar para rodar o programa e clique sobre o botão
“Encerrar” para ver o que ocorre.

A palavra “End” é uma palavra reservada no Visual Basic e sua função é encerrar o
programa em execução.

Preenchendo um “Listbox” ou um “ComboBox”

“ComboBox” e “ListBox” são caixas de listagem que contém uma série de dados que
podem ser selecionados através de um click. Duas coisas devem ser consideradas ao se
utilizar esse tipo de objeto:

• Deve existir em algum lugar, a lista dos itens que irá popular o objeto, e...
• Os dados devem estar presentes e disponíveis ao usuário assim que o formulário
for exibido, sem a necessidade de clicarmos em coisa alguma;

No Excel, a forma mais prática de se definir a lista dos dados consiste em se deixar uma
das planilhas especificamente para conte-los, definindo as células ou grupos de células
que devem ser acessadas para obtê-los. Com isso a manutenção também fica bastante
simples, basta acessar a planilha e inserir, deletar ou alterar os dados.

Acesse a planilha “Plan2” e digite a seqüência de dados a seguir a partir da célula A1:

• UsrFrm1:Nomes dos Usuarios


• João dos Santos
• José Inácio
• Francelino Gonçalvez
• Jocimar da Cruz
• Ana Carina
• Bruna da Silva
• Débora dos Santos
• Camila Dias

O segundo item, deixar os dados disponíveis desde a abertura do formulário, é


facilmente obtido se declararmos o código para população do objeto no evento de
abertura do próprio formulário.

Vamos entender isso um pouco melhor. Quando um formulário qualquer, em Visual


Basic, é mostrado na tela uma parte do programa necessária para apresentar o
formulário é processada instante antes do mesmo ser exibido. Por exemplo, se
quisermos que a cor, o tamanho, o nome ou qualquer outra característica seja ajustado
ao exibi-lo, temos que declarar isso no evento “Activate”. Do mesmo modo, se
quisermos que objetos do tipo “ListBox” ou “ComboBox” estejam preenchidos assim
que o formulário for exibido, temos que declarar o código que irá preenche-los nesse
mesmo evento. Vamos ver como fazer:

Dê um duplo clique sobre uma área vazia do formulário. Verá que será exibido o
seguinte código:

Private Sub UserForm_Click()

End Sub

Já vimos que o evento “Click” foi útil ao definirmos o código para o botão “Encerrar”,
no entanto, no presente caso queremos inserir o código para preencher o “ComboBox”
“cbx_Usuários” antes que o formulário seja exibido. Também vimos que temos que
declarar esse código no evento “Activate”, portanto, clique na caixa de listagem no
canto superior direito do painel de codificação e selecione a palavra “Activate”, como
detalha a figura a seguir:

A sintaxe

A instrução do Visual Basic que insere um item em um “ComboBox” ou “ListBox” é


“AddItem”. A sintaxe deste comando é:
Objeto.Additem “descrição do item”

Nosso objeto é o “cbx_Usuarios”, portanto para inserirmos o nome do João dos Santos
temos que colocar na sintaxe:

cbx_Usuarios.Additem “João dos Santos”

Note que o nome veio entre aspas. Sempre que utilizarmos sentenças em atribuições
elas devem vir entre aspas. Uma forma de memorizar isso: dados alfanuméricos devem
ser fornecidos entre aspas. Esse tipo de dado é conhecido em Visual Basic como
“String”, ou seja, uma cadeia de caracteres.

Para inserirmos os oito nomes que temos cadastrados em nossa planilha existem ao
menos dois métodos. O mais imediato é a atribuição direta de todos os nomes, sendo
assim, teríamos que repetir a sentença acima para cada um dos itens do “ComboBox”:

• cbx_Usuarios.Additem “João dos Santos”


• cbx_Usuarios.Additem “José Inácio”
• cbx_Usuarios.Additem “Francelino Gonçalvez”
• cbx_Usuarios.Additem “Jocimar da Cruz”
• cbx_Usuarios.Additem “Ana Carina”
• cbx_Usuarios.Additem “Bruna da Silva”
• cbx_Usuarios.Additem “Débora dos Santos”
• cbx_Usuarios.Additem “Camila Dias”

Esse método apresenta algumas desvantagens:

• É trabalhoso, repetitivo e monótono, além disso...


• Se quisermos inserir novos nomes temos que alterar o código do programa.

Felizmente existe outra maneira muito mais interessante para podermos popular o
“ComboBox” utilizando uma estrutura lógica que irá repetir sempre o mesmo comando
“Additem”. Uma segunda estrutura lógica irá indicar que os nomes existentes na
planilha terminaram, encerrando a repetição dos comandos. Antes de fazermos isso
vamos conhecer como essas estruturas lógicas funcionam.

A estrutura lógica “Do While


As estruturas lógicas permitem que se dê “inteligência” aos programas. É através
dessas estruturas que decidimos entre várias opções, escolhemos um caminho, emitimos
mensagens e claro, executamos comandos repetitivos. A estrutura “Do While” se presta
exatamente a essa última tarefa.A sua sintaxe é:

Do While CONDIÇÃO LÓGICA


código...
Loop

Enquanto a condição lógica for satisfeita, tudo o que estiver entre o “Do While” e o
“Loop” será repetido. Podemos escrever o código da seguinte forma:

‘ A estrutura lógica será denominada Preencher, que pode receber o valor de ‘ True
(verdadeiro) ou False (falso)
Preencher = True
‘Selecionar a planilha onde estão os itens que irão popular o ComboBox:
Sheets(“Plan2”).select
‘Selecionar a célula inicial da listagem dos itens que irão popular o ComboBox.
‘Observe que selecionamos a célula que contém o cabeçalho e não o primeiro nome
Range(“A1”).select
‘Iniciar a execução da estrutura lógica
Do While Preencher = true
‘Selecionar a célula que está na linha imediatamente inferior
ActiveCell.offset(1,0) cbx_Usuarios.AddItem ActiveCell.value
Loop
Obs: as linhas iniciadas com um apóstrofe (cor verde) são linhas de comentário. O
Visual Basic ignora essas linhas durante a execução do programa e elas auxiliam na
compreensão da lógica.

Se tentarmos executar o código do jeito que está, o programa entrará no que chamamos
de “laço perpétuo”, ou seja, o código irá se repetir indefinidamente e o programa ficará
travado. Caso isso ocorra, segure a tecla ‘CTRL’ pressionada e aperte a tecla ‘BREAK’.
Com isso a execução será interrompida.

O “laço perpétuo” ocorre porque após incluir o valor da célula no “cbx_Usuarios”, o


Excel avança uma linha e repete o comando e vai fazendo isso eternamente porque a
condição “Preencher = True” não é alterada em nenhum momento. Para evitarmos que
isso aconteça, temos que avaliar o conteúdo da célula ativa. Se o conteúdo for vazio, ou
seja, sem conteúdo, temos que alterar a condição lógica de “True” para “False”,
fazendo com que o laço seja encerrado.

Private Sub UserForm_Activate()

' A estrutura lógica será denominada Preencher, que pode receber o valor de True
(verdadeiro) ou False (falso)

Preencher = True

'Selecionamos a planilha onde estão os dados a popularem o combobox:

Sheets("Plan2").Select

'Selecinamos a célula onde está o ínício dos dados. 'Note que selecionamos o
cabeçalho da lista e não o primeiro nome

Range("A1").Select

'Iniciamos a execução da estrutura lógica

Do While Preencher = True

'Seleciona a célula que está na linha imediatamente inferior

ActiveCell.Offset(1, 0).Select

'Testa o valor da célula e decide se o laço deve ou não continuar

If ActiveCell.Value = vbNullString Then

'Se a célula estiver vazia, altera a condição lógica

Preencher = False

ELSE
'se não estiver, acrescenta o item

cbx_Usuarios.AddItem ActiveCell.Value

End If

Loop

End Sub

Vamos testar nosso programa e fazer alguns comentários úteis. Clique na planilha
“Plan2” e depois selecione: Ferramentas> Macro> Editor do Visual Basic.
Dimensione a janela do editor de modo a poder ver a planilha ao fundo, para
acompanhar a execução do programa. Clique em qualquer lugar da rotina “Private Sub
UserForm_Activate()”, acesse então na barra do Menu Principal “Depurar” e
“Depuração Total”, conforme mostra a figura a seguir:

Note que a primeira linha da rotina está em destaque e uma pequena seta amarela marca
a posição do cursor. Tecle [F8] uma vez. Veja que o destaque e a seta passam para a
próxima linha válida, ignorando os comentários que fizemos ao colocar uma aspa
simples no início da frase.

Continue teclando [F8] e observe na planilha ao fundo a célula ativa deslocar-se até
atingir a última posição preenchida, “A9”. Pressione [F8] novamente até que a leitura
da célula “A10”, em branco, provocar a mudança do estado lógico, fazendo com que o
laço termine.

Neste ponto, tecle [F5] devolvendo o controle do programa ao computador. Minimize a


janela do Visual Basic e clique na seta do “ComboBox” para ver os nomes adicionados,
como a seguir:
Explicando o código

Existem vários tipos de dados no Visual Basic, neste exemplo tivemos a oportunidade
de conhecer o tipo “Boolean”. Este tipo de dado pode ter apenas dois valores:
Verdadeiro ou Falso. Sempre que utilizarmos uma estrutura lógica do tipo “Do While”
temos que iniciar uma variável deste tipo como verdadeira e é exatamente isso que faz a
linha:

Preencher = True

O nome da variável, neste caso, é “Preencher” e claro, o valor atribuído é “True” ou


verdadeiro.

No código chamamos atenção para a seleção da planilha onde estão contidos os dados
que queremos obter para popular o “ComboBox”:

Sheets(“Plan2”).Select

Essa regra é muito importante porque se não fizer isso e testar a rotina com a planilha
selecionada por você através do mouse, o programa irá funcionar normalmente, porém
ao rodá-lo a partir de um botão ele tentará executar a mesma coisa, qualquer que seja a
planilha selecionada pelo usuário no momento, causando erros.

A instrução:

Range(“A1”).Select

remete o cursor do Excel para a primeira célula onde o conteúdo é apenas o cabeçalho
dos dados, ou seja, não é um dado que queremos incluir no “ComboBox” por isso, ao
iniciarmos o preenchimento do mesmo, avançamos uma linha. Esse avanço é dado pela
instrução:

ActiveCell.Offset(1,0).Select
Esse comando é muito útil. Ele diz ao Excel que, à partir da célula onde o cursor está
atualmente, deslocar-se em 1 linha e Zero colunas e então selecionar essa posição,
tornando-a ativa. A sintaxe deste comando é
“ActiveCell.Offset(LINHAS,COLUNAS)”. Como no exemplo temos (1,0), a célula se
desloca uma linha e nenhuma coluna. Números negativos também podem ser utilizados.
Veja as referencias na figura a seguir:

Finalmente, para este formulário, vamos dar uma olhadinha na instrução:

If condiçao Then

executa algo

Else

executa algo diferente

End if

Essa estrutura lógica verifica se a condição logo após a palavra chave “IF” é verdadeira
ou falsa. Se for verdadeira, executa a instrução logo abaixo, se não for verdadeira,
executa a instrução abaixo da palavra “ELSE”. Em nosso exemplo a condição testada é
“A célula que estamos examinando está vazia” traduzida para “ActiveCell.Value =
vbNullString”. Sendo isso verdadeiro, ou seja, se a célula estiver realmente vazia, é
atribuído o valor “False” para a variável “Preencher”, encerrando a repetição dos
comandos, caso contrário, acrescenta o conteúdo da célula no “ComboBox” através do
comando que já vimos: cbx_Usuarios.AddItem ActiveCell.Value.

Algumas observações a respeito do “ComboBox” que acabamos de preencher:

1. Os nomes não estão dispostos em ordem alfabética.

Para resolver isso, coloque o cursor em qualquer lugar da planilha “Plan3”,


inicie o gravador de macros, nomeie a macro como “OrdenarNomes” e ordene
os nomes para que fique em ordem crescente. Finalize a gravação, acesse
novamente o formulário 1 através do Editor do Visual Basic e acrescente a
seguinte linha de código no evento “UserForm_Activate()”:
'Ordena os nomes da lista

Call Módulo1.OrdenarNomes

2. Ao apresentar o formulário o “ComboBox” estará mostrando uma linha vazia


até clicarmos na seta.

Para que ele inicie já mostrando o primeiro nome, após o seu preenchimento
inclua a seguinte linha após a palavra “Loop”:

cbx_Usuarios.ListIndex = 0

3. Para evitar que, durante programas mais complexos onde temos que acessar um
mesmo formulário varias vezes, o “ComboBox” seja populado com os mesmos
dados repetindo-os, utilize a instrução “Clear” antes de iniciar o seu
preechimento.

O código completo para o formulário é exibido a seguir:

----------------------------------------------------------------------------------------------
------------

Private Sub cmd_Encerrar_Click()

End

End Sub

----------------------------------------------------------------------
------------------------------------
Private Sub UserForm_Activate()

' A estrutura lógica será denominada Preencher, que pode receber o ‘valor de True
(verdadeiro) ou False (falso)

Preencher = True

'Ordena os nomes

Call Módulo1.OrdenarNomes

'Esvazia o ComboBox,caso já esteja preenchido:

cbx_Usuarios.Clear

'Selecionamos a planilha onde estão os dados a popularem o combobox:


Sheets("Plan2").Select

'Selecinamos a célula onde está o ínício dos dados.

'Note que selecionamos o cabeçalho da lista e não o primeiro nome

Range("A1").Select

'Iniciamos a execução da estrutura lógica

Do While Preencher = True

'Seleciona a célula que está na linha imediatamente inferior

ActiveCell.Offset(1, 0).Select

'Testa o valor da célula e decide se o laço deve ou não continuar

If ActiveCell.Value = vbNullString Then

'Se a célula estiver vazia, altera a condição lógica

Preencher = False

Else

'se não estiver, acrescenta o item

cbx_Usuarios.AddItem ActiveCell.Value

End If

Loop

'Coloca o ComboBox na primeira posição válida:

cbx_Usuarios.ListIndex = 0

End Sub ---------------------------------------------------------------------------------------------


-------------

Alterando as propriedades de "Labels"

Abra o editor do VBA, selecione o UserForm1 e dê dois cliques sobre o botão


“Acessar”.

Digite o código como mostrado a seguir:


Private Sub cmd_Acessar_Click()

UserForm2.Label1 = cbx_Usuarios.Text

UserForm2.Label2 = Date

UserForm2.Show

End Sub

O formulário 1 está pronto para ser utilizado, no entanto necessitamos de um modo para
fazer com que o mesmo seja exibido assim que a planilha do Excel for aberta, ou seja,
quando o usuário clicar no ícone da planilha, o Excel inicia e apresenta o formulário
sem intervenção do usuário.

Iniciando uma macro automaticamente ao abrir o Excel

Felizmente os desenvolvedores do Excel previram que isso seria interessante e criaram


um método bastante simples: Crie uma macro com o nome de Auto_Open(). Tudo o que
estiver nesta macro será executado automaticamente quando a planilha for exibida.

Abra o módulo1, clique em: Inserir> Procedimento. Dê o nome de “Auto_Open” e


digite a frase: UserForm1.show. O código deve ficar como a seguir:

Public Sub Auto_Open()

UserForm1.Show

End Sub
Salve a planilha. Feche o Excel. Localize o arquivo através do Windows Explorer e dê
duplo clique sobre o nome do mesmo. Você irá notar que a planilha irá se abrir,
apresentando o formulário.

Selecione um nome no ComboBox e clique no botão “Acessar”. O UserForm2 será


apresentado conforme a figura ao lado:

Fica fácil de entender que ao fazermos referência ao UserForm2, estando ainda no


UserForm1, podemos alterar as propriedades de seus componentes. Foi isso que fizemos
com o “Label1” e “Label2” que agora apresentam o nome do usuário que acessou a
rotina e a data de acesso:

UserForm2.Label1 = cbx_Usuarios.Text

UserForm2.Label2 = Date

Inserindo os dados para preenchimento dos


"ComboBox"

Vamos preencher os ComboBox referentes ao local de trabalho e aos equipamentos


utilizados. Acesse a planilha onde colocou o nome dos usuários (“Plan2”).

Siga cuidadosamente as instruções a seguir:

Célula Digite

B1 UsrFrm2:Laboratórios

B2 Sala de Medições MHDT

B3 Gear Lab MHDT

B4 Sala de Medições LHDT

B5 Gear Lab LHDT

Célula Digite

C1 UsrFrm2:Equipamentos

C2 Circularímetro

C3 Estudo de deformações
C4 Gear Lab

C5 Perfilômetro

C6 Quality Gate

C7 Parada de forno

C8 Batidas

O código para preencher os "ComboBox"

Abra o Editor do Visual Basic e acesse o “UserForm2”. Selecione o método “Activate”


e digite o código a seguir:

Private Sub UserForm_Activate()

'Preenche o ComboBox cbx_Local:

'Esvazia o ComboBox,caso já esteja preenchido:

cbx_Local.Clear

'Selecionamos a planilha onde estão os dados a popularem o combobox:

Sheets("Plan2").Select

'Selecinamos a célula onde está o ínício dos dados.

'Note que selecionamos o cabeçalho da lista e não o primeiro nome

Range("B1").Select

Preencher = True

'Iniciamos a execução da estrutura lógica

Do While Preencher = True

'Seleciona a célula que está na linha imediatamente inferior

ActiveCell.Offset(1, 0).Select

'Testa o valor da célula e decide se o laço deve ou não continuar

If ActiveCell.Value = vbNullString Then

'Se a célula estiver vazia, altera a condição lógica


Preencher = False

Else

'se não estiver, acrescenta o item

cbx_Local.AddItem ActiveCell.Value

End If

Loop

'Coloca o ComboBox na primeira posição válida:

cbx_Local.ListIndex = 0

'=========================================================

'Preenche o ComboBox cbx_eqptos

'Esvazia o ComboBox,caso já esteja preenchido:

cbx_eqptos.Clear

'Selecionamos a planilha onde estão os dados a popularem o combobox:

Sheets("Plan2").Select

'Selecinamos a célula onde está o ínício dos dados.

'Note que selecionamos o cabeçalho da lista e não o primeiro nome

Range("C1").Select

Preencher = True

'Iniciamos a execução da estrutura lógica

Do While Preencher = True

'Seleciona a célula que está na linha imediatamente inferior

ActiveCell.Offset(1, 0).Select

'Testa o valor da célula e decide se o laço deve ou não continuar

If ActiveCell.Value = vbNullString Then

'Se a célula estiver vazia, altera a condição lógica


Preencher = False

Else

'se não estiver, acrescenta o item

cbx_eqptos.AddItem ActiveCell.Value

End If

Loop

'Coloca o ComboBox na primeira posição válida:

cbx_eqptos.ListIndex = 0

End Sub

Se estiver curioso, pode rodar o programa através da macro “Auto_Open()” e ver o


funcionamento dos “ComboBox”.

Botão “Cancelar”

Acionando esse botão o usuário irá “limpar” todos os lançamentos feitos no formulário
2 e retornar ao formulário 1.

Abra o “Editor do Visual Basic”, acesse o “UserForm2” e dê dois cliques sobre o botão
“Cancelar”. O evento padrão é “Click” e é esse evento que iremos utilizar. Digite o
código a seguir :

Private Sub CommandButton1_Click()

'Esse comando irá limpar os dados do UserForm2 e retornar ao UserForm1

'Faz com que as informações dos text box sejam canceladas

TextBox1.Text = vbNullString

TextBox2.Text = vbNullString

TextBox3.Text = vbNullString

TextBox4.Text = vbNullString

TextBox5.Text = vbNullString
'Desativa a exibição do UserForm2

Unload Me

'Ativa a exibição do UserForm1

UserForm1.Show

End Sub

Botão “Salvar”

A função deste botão é colocar toda a informação existente no “UserForm2” em uma


planilha de modo a podermos acessá-la quando for conveniente. Vamos utilizar a
“Plan3” para armazenar os dados.

Acesse a “Plan3” e digite conforme a seguir:

Célula Digite

A1 Data

B1 Usuário

C1 Local

D1 Equipamento

E1 Peça No

F1 Peça Desc

G1 Qtd

H1 Inicio

I1 Fim

J1 Total

K1 Tipo

L1 Resultado
Abra o “Editor do Visual Basic”, acesse o “UserForm2” e dê dois cliques sobre o botão
“Salvar”. O evento padrão é “Click” e é esse evento que iremos utilizar. Digite o código
a seguir :

Private Sub CommandButton2_Click()

'Insere as informações no banco de dados

'Seleciona a planilha

Sheets("Plan3").Activate

'Posiciona o cursor na primeira linha da planilha

Range("3:3").Select

'Insere uma nova linha de dados (registro)

Selection.Insert Shift:=xlDown

'Seleciona a primeira célula da nova linha e informa a data

Range("A3").Select

ActiveCell.Value = Label2.Caption

'Informa o nome do usuário:

ActiveCell.Offset(0, 1).Value = Label1.Caption

'Informa o local onde foi feito o trabalho:

ActiveCell.Offset(0, 2).Value = cbx_Local.Text

'Informa o equipamento que foi utilizado

ActiveCell.Offset(0, 3).Value = cbx_eqptos.Text

'Informa o número da peça

ActiveCell.Offset(0, 4).Value = TextBox1.Text

'Informa a descrição da peça

ActiveCell.Offset(0, 5).Value = TextBox2.Text

'Informa a quantidade de peças

ActiveCell.Offset(0, 6).Value = TextBox3.Text


'Informa a hora de inicio

ActiveCell.Offset(0, 7).Value = TextBox4.Text

Inicio = CDate(TextBox4.Text)

'Informa a hora de fim

ActiveCell.Offset(0, 8).Value = TextBox5.Text

Fim = CDate(TextBox5.Text)

'Calcula o total

total = CDate(Fim - Inicio)

ActiveCell.OffSet(0,9).Value = total

'Informa o tipo de trabalho

If OptionButton1.Value = True Then

ActiveCell.Offset(0, 10).Value = "Set-Up"

Else

ActiveCell.Offset(0, 10).Value = "Rotina"

End If

'Informa o resultado da medição

If OptionButton3.Value = True Then

ActiveCell.Offset(0, 11).Value = "Aprovado"

Else

ActiveCell.Offset(0, 11).Value = "Reprovado"

End If

'Limpa os dados para nova entrada

'Limpa as caixas de texto

TextBox1.Text = vbNullString

TextBox2.Text = vbNullString
TextBox3.Text = vbNullString

TextBox4.Text = vbNullString

TextBox5.Text = vbNullString

'Posiciona cbx_local e cbx_eqptos na primeira posição

cbx_Local.ListIndex = 0

cbx_eqptos.ListIndex = 0

End Sub

Inserindo dados

Vamos executar alguns exemplos. Saia do “Editor Do Visual Basic” e acione a macro
“Auto_open”.

Selecione um usuário e clique sobre o botão “Acessar”. Selecione ou digite os dados


abaixo, conforme o caso:

Clique no botão “Salvar”.

Entre com novos exemplos a sua vontade. O importante é testar todas as condições do
“ComboBox” “cbx_Local” e se estiver disposto, também todas as possibilidade do
“cbx_eqptos”. Se preferir utilize os dados presentes na figura a seguir.

“Plan3” após a inserção dos dados de exemplo (clique para ampliar):


O programa, cada vez que um registro é salvo, insere uma linha na posição 3,
deslocando as outras linhas para baixo. Deste modo, as inserções mais recentes ocupam
as linhas de números mais baixos.

Atualizando o relatório

Já temos os dados salvos, tudo o que temos que fazer para finalizar o programa é
atualizar o relatório de saída.

Já colocamos um botão na planilha "Plan1", abaixo do relatório, que ao ser clicado irá
atualizar os lançamentos.

Vamos entender como a rotina neste botão irá atualizar o relatório.

O relatório está dividido em três partes principais, a primeira corresponde ao local


MHDT, a segunda ao local LHDT e a terceira parte é o resumo, ou soma, dos tempos
despendidos nesses locais e equipamentos.

Vamos traçar o fluxo passo a passo:

• Selecionamos a planilha “Plan3”, onde estão os dados e colocamos o cursor na


célula de referência “A3”.

• Atribuímos a uma variável de controle o valor “True”.

• Iniciamos um laço lógico para atualizar o relatório, até que encontremos uma
linha vazia para mudar o estado da variável lógica e encerrar o laço.
• Á medida que lemos os dados armazenados, verificamos o local, o tipo e o
resultado do trabalho, em função dessas leituras definimos duas linhas para o
lançamento do total de horas gastas: Linha1 para o tipo de trabalho e Linha2 para o
resultado.

• A data de execução define a coluna. Como “Janeiro” corresponde à coluna “D”,


temos que somar 3 ao mês informado nos dados, por exemplo, se a medição foi feita em
“Fevereiro”, mês 02, então somamos 2+3 = 5, ou coluna “E”. Veja que o mês é obtido
através de uma função específica no Excel.

• Definidos as linhas e a coluna, antes de lançar as horas temos que verificar se já


existe algum lançamento anterior. Fazemos isso atribuindo o valor que já estão nas
células a uma variável. Esse valor é somado ao valor do registro e lançado novamente
na célula.

Abra o Editor do Visual Basic, Módulo1 para inserir essa rotina.

Inserindo o código

O código completo fica conforme a seguir:

Public Sub Atualizar()

'Atualiza os lançamentos no relatório

'Antes de iniciar os dados existentes no relatório devem

'ser zerados para evitar que sejam somados novamente

Sheets("Plan1").Select

'Limpa Rotinas e setup da Sala de Medição MHDT

Range("D11:O12").Select

Selection.Clear

'Limpa Aprovadas e Reprovadas da Sala de Medição MHDT

Range("D14:O15").Select

Selection.Clear

'Limpa Rotinas e Setup da Sala de Gear Labs MHDT


Range("D16:O17").Select

Selection.Clear

'Limpa Aprovadas e Reprovadas da Sala de Gear Labs MHDT

Range("D19:O20").Select

Selection.Clear

'Limpa Rotinas e setup da Sala de Medição LHDT

Range("D28:O29").Select

Selection.Clear

'Limpa Aprovadas e Reprovadas da Sala de Medição LHDT

Range("D31:O32").Select

Selection.Clear

'Limpa Rotinas e Setup da Sala de Gear Labs LHDT

Range("D33:O34").Select

Selection.Clear

'Limpa Aprovadas e Reprovadas da Sala de Gear Labs LHDT

Range("D36:O37").Select

Selection.Clear

'Seleciona a planilha onde estão os dados (Plan3)

Sheets("Plan3").Select

'Posiciona o cursor na célula de referência (A3)

Range("A3").Select

'Ajusta o valor da variável lógica para True

AtualizaDados = True

'Inicia o laço

Do While AtualizaDados = True


'Lê o conteudo de "Local"

LabLocal = ActiveCell.Offset(0, 2).Value

'Obtem o total de horas gastas

Total = CDate(ActiveCell.Offset(0, 9).Value)

Trabalho = ActiveCell.Offset(0, 10).Value

Resultado = ActiveCell.Offset(0, 11).Value

'Em função de LOCAL determina o número de Linha1 e Linha2

Select Case LabLocal

'========================================================

Case Is = "Sala de Medições MHDT."

'Selecina por tipo de trabalho: rotina ou setup

Select Case Trabalho

Case Is = "Rotina"

Linha1 = 11

Case Is = "Set-Up"

Linha1 = 12

End Select

'Seleciona em função do resultado: Aprovado ou reprovado

Select Case Resultado

Case Is = "Aprovado"

linha2 = 14

Case Is = "Reprovado"

linha2 = 15

End Select

'========================================================
Case Is = "Gear Lab MHDT"

'Selecina por tipo de trabalho: rotina ou setup

Select Case Trabalho

Case Is = "Rotina"

Linha1 = 16

Case Is = "Set-Up"

Linha1 = 17

End Select

'Seleciona em função do resultado: Aprovado ou reprovado

Select Case Resultado

Case Is = "Aprovado"

linha2 = 19

Case Is = "Reprovado"

linha2 = 20

End Select

'========================================================

Case Is = "Sala de Medições LHDT"

'Selecina por tipo de trabalho: rotina ou setup

Select Case Trabalho

Case Is = "Rotina"

Linha1 = 28

Case Is = "Set-Up"

Linha1 = 29

End Select

'Seleciona em função do resultado: Aprovado ou reprovado


Select Case Resultado

Case Is = "Aprovado"

linha2 = 31

Case Is = "Reprovado"

linha2 = 32

End Select

'========================================================

Case Is = "Gear Lab LHDT."

'Selecina por tipo de trabalho: rotina ou setup

Select Case Trabalho

Case Is = "Rotina"

Linha1 = 33

Case Is = "Set-Up"

Linha1 = 34

End Select

'Seleciona em função do resultado: Aprovado ou reprovado

Select Case Resultado

Case Is = "Aprovado"

linha2 = 36

Case Is = "Reprovado"

linha2 = 37

End Select

'========================================================

End Select

'Em função da data, determina a coluna


coluna = Month(ActiveCell.Value) + 2

'Lança dados no relatorio:

'Primeiro seleciona a planilha onde está: (Plan1)

Sheets("Plan1").Select

Linha1 = Linha1 - 1

linha2 = linha2 - 1

'Posiciona na célula de referência A1

Range("A1").Select

'Obtem valor do tipo de trabalho = Linha1

Valor = CDate(ActiveCell.Offset(Linha1, coluna).Value)

'Atualiza

ActiveCell.Offset(Linha1, coluna).Value = CDate(Valor + Total)

'Faz a mesma coisa para o resultado:

Valor = ActiveCell.Offset(linha2, coluna).Value

ActiveCell.Offset(linha2, coluna).Value = Valor + Total

'Retorna à planilha onde estão os dados e avança uma linha

Sheets("Plan3").Select

ActiveCell.Offset(1, 0).Activate

'Verifica se a célula é vazia. Se for altera a condição lógica

If ActiveCell.Value = vbNullString Then

AtualizaDados = False

Else

AtualizaDados = True

End If

'Encerra o laço
Loop

'Formata as células

Sheets("Plan1").Select

Range("D11:P48").Select

Selection.NumberFormat = "h:mm;@"

End Sub

A estrutura lógica "Select Case"

Note a estrutura lógica “Select Case”. Essa estrutura é mais versátil que a estrutura
“IF..Then...Else” quando se tem muitas opções, como é o caso. A sintaxe desta estrutura
é:

Select Case VARIAVEL

Case VARIAVEL is = Teste1

Codigo

Case VARIAVEL is = Teste2

Codigo

Case VARIAVEL is = Teste3

Codigo

End Select

Se a variável especificada coincidir com um dos valores testados, o código que segue o
teste será executado e os outros ignorados. O cuidado aqui é fazer com que os nomes
dados aos testes sejam exatamente iguais ao que a variável irá receber porque se a
coincidência não for completa o código será pulado.

Você também pode gostar