Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
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:
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.
• Um formulário de nome
"UserForm1" será exibido,
• uma nova janela, denominada "Caixa de ferramentas" deve aparecer.
A caixa de ferramentas
Criando o formulário 1
Insira um formulário. Por padrão ele irá receber o nome de “UserForm1”. Vamos
manter este nome.
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”.
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”.
Adotando essa notação para o “Label1”, como vimos acima, a notação fica da seguinte
forma:
• 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
Criando o formulário 2
Altere a propriedade “Font” de todos os objetos para: Arial; Negrito; 10, exceto onde
indicado diferente.
• Label2 (29/07/2009)>
o Caption: Data
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.
• ComboBox2
o (Name): cbx_Equipamentos
Selecione todas as caixas de texto e altere a propriedade “Font”:
• TextBox (todos)
o Font: Arial; Negrito; 10
• 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.
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.
“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:
Dê um duplo clique sobre uma área vazia do formulário. Verá que será exibido o
seguinte código:
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
Nosso objeto é o “cbx_Usuarios”, portanto para inserirmos o nome do João dos Santos
temos que colocar na sintaxe:
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”:
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.
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.
' A estrutura lógica será denominada Preencher, que pode receber o valor de True
(verdadeiro) ou False (falso)
Preencher = True
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
ActiveCell.Offset(1, 0).Select
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.
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
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:
If condiçao Then
executa algo
Else
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.
Call Módulo1.OrdenarNomes
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.
----------------------------------------------------------------------------------------------
------------
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
cbx_Usuarios.Clear
Range("A1").Select
ActiveCell.Offset(1, 0).Select
Preencher = False
Else
cbx_Usuarios.AddItem ActiveCell.Value
End If
Loop
cbx_Usuarios.ListIndex = 0
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.
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.
UserForm2.Label1 = cbx_Usuarios.Text
UserForm2.Label2 = Date
Célula Digite
B1 UsrFrm2:Laboratórios
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
cbx_Local.Clear
Sheets("Plan2").Select
Range("B1").Select
Preencher = True
ActiveCell.Offset(1, 0).Select
Else
cbx_Local.AddItem ActiveCell.Value
End If
Loop
cbx_Local.ListIndex = 0
'=========================================================
cbx_eqptos.Clear
Sheets("Plan2").Select
Range("C1").Select
Preencher = True
ActiveCell.Offset(1, 0).Select
Else
cbx_eqptos.AddItem ActiveCell.Value
End If
Loop
cbx_eqptos.ListIndex = 0
End Sub
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 :
TextBox1.Text = vbNullString
TextBox2.Text = vbNullString
TextBox3.Text = vbNullString
TextBox4.Text = vbNullString
TextBox5.Text = vbNullString
'Desativa a exibição do UserForm2
Unload Me
UserForm1.Show
End Sub
Botão “Salvar”
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 :
'Seleciona a planilha
Sheets("Plan3").Activate
Range("3:3").Select
Selection.Insert Shift:=xlDown
Range("A3").Select
ActiveCell.Value = Label2.Caption
Inicio = CDate(TextBox4.Text)
Fim = CDate(TextBox5.Text)
'Calcula o total
ActiveCell.OffSet(0,9).Value = total
Else
End If
Else
End If
TextBox1.Text = vbNullString
TextBox2.Text = vbNullString
TextBox3.Text = vbNullString
TextBox4.Text = vbNullString
TextBox5.Text = vbNullString
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”.
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.
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.
• 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.
Inserindo o código
Sheets("Plan1").Select
Range("D11:O12").Select
Selection.Clear
Range("D14:O15").Select
Selection.Clear
Selection.Clear
Range("D19:O20").Select
Selection.Clear
Range("D28:O29").Select
Selection.Clear
Range("D31:O32").Select
Selection.Clear
Range("D33:O34").Select
Selection.Clear
Range("D36:O37").Select
Selection.Clear
Sheets("Plan3").Select
Range("A3").Select
AtualizaDados = True
'Inicia o laço
'========================================================
Case Is = "Rotina"
Linha1 = 11
Case Is = "Set-Up"
Linha1 = 12
End Select
Case Is = "Aprovado"
linha2 = 14
Case Is = "Reprovado"
linha2 = 15
End Select
'========================================================
Case Is = "Gear Lab MHDT"
Case Is = "Rotina"
Linha1 = 16
Case Is = "Set-Up"
Linha1 = 17
End Select
Case Is = "Aprovado"
linha2 = 19
Case Is = "Reprovado"
linha2 = 20
End Select
'========================================================
Case Is = "Rotina"
Linha1 = 28
Case Is = "Set-Up"
Linha1 = 29
End Select
Case Is = "Aprovado"
linha2 = 31
Case Is = "Reprovado"
linha2 = 32
End Select
'========================================================
Case Is = "Rotina"
Linha1 = 33
Case Is = "Set-Up"
Linha1 = 34
End Select
Case Is = "Aprovado"
linha2 = 36
Case Is = "Reprovado"
linha2 = 37
End Select
'========================================================
End Select
Sheets("Plan1").Select
Linha1 = Linha1 - 1
linha2 = linha2 - 1
Range("A1").Select
'Atualiza
Sheets("Plan3").Select
ActiveCell.Offset(1, 0).Activate
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
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
é:
Codigo
Codigo
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.