Você está na página 1de 64

Srie Como Fazer

Formulrios no Excel Utilizando VBA:


Multipage e TabStrip

Parte 2

por Robert Friedrick Martim

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip i

Nota sobre direitos autorais


Este eBook de autoria de Robert F Martim, sendo comercializado atravs do site
www.juliobattisti.com.br ou atravs do site de leiles Mercado Livre:
www.mercadolivre.com.br.

Ao adquirir este eBook voc tem o direito de l-lo na tela do seu computador e de imprimir
quantas cpias desejar, desde que sejam para uso pessoal. vetada a distribuio deste eBook,
mediante cpia ou qualquer outro meio de reproduo, para outras pessoas. Se voc recebeu
este eBook atravs de e-mail ou via FTP de algum site da Internet, ou atravs de CD de Revista,
saiba que voc est com uma cpia pirata, no autorizada. Se for este o seu caso entre em
contato com o autor atravs do e-mail rm@faircourt.com ou comunique diretamente ao nosso
site atravs do e-mail webmaster@juliobattisti.com.br.

Ao regularizar a sua cpia, voc estar remunerando, mediante uma pequena quantia, o trabalho
do autor e incentivando que novos trabalhos sejam disponibilizados.

Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades!

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
ii Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Pr-requisitos
Para completar este curso necessrio um conhecimento mdio do ambiente de trabalho do
Excel em especial do VBE (Visual Basic Editor). Porm, quanto melhor o seu conhecimento deste
ambiente melhor ser o aproveitamento deste curso, pois no somente veremos manipulaes
diretamente no Excel como tambm acesso a banco de dados.

Este mdulo visa a criao de formulrios contendo os controles MultiPage e Tabstrip. Porm,
em certas situaes outros controles sero utilizados em conjunto para resolver problemas
encontrados no nosso dia-a-dia.

Este cursos a segunda parte do curso sobre formulrios no Excel. Se voc ainda no possui o
primeiro curso ele pode ser adquirido no seguinte endereo
http://www.juliobattisti.com.br/cursos/excelvbaforms/default.asp.

Os leitores interessados podem adquirir o curso bsico de Excel em 120 lies no seguinte
endereo: www.juliobattisti.com.br/excel120/excel120.asp que servir como trampolim
para um melhor aproveitamento e desenvolvimento deste mdulo.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip iii

Objetivos deste eBook


Este eBook foi dividido em mdulos. Este mdulo visa a manipulao dos controles MultiPage e
TabStrip no VBA do Excel.

O trabalho foi desenvolvido a partir da demanda dos usurios do site www.juliobattisti.com.br. O


material procura analisar questes pertinentes ao dia-a-dia de seu trabalho. Vrios exemplos so
retirados das dvidas colocadas no frum do site ou enviadas diretamente para o autor pelos
assinantes do site.

A linguagem utilizada descontrada e com o mnimo de jargo possvel. O objetivo ter um


eBook com contedo relevante e de fcil compreenso.

Qualquer dvida referente a este mdulo podem ser colocadas diretamente no frum Excel
avanado no endereo: http://www.juliobattisti.com.br/forum/default.asp

Comentrios e sugestes para melhora do material podem ser enviados diretamente para o autor
no endereo rm@faircourt.com

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
iv Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

NDICE ANALTICO

Introduo ........................................................................................................................................ 1
Bem-vindo a srie Como Fazer. ........................................................................................... 1
Antes de continuar .................................................................................................................. 1

1. O que so e a diferena entre os controles MultiPage e TabStrip.......................................... 2

2. Devo utilizar um MultiPage ou um TabStrip?.......................................................................... 5

3. Utilizando o controle Multipage ............................................................................................... 7


3.1. Viso geral das principais propriedades e exemplo de uso do MultiPage ..................... 7

4. Utilizando o controle TabStrip ............................................................................................... 12


4.1. Viso geral das principais propriedades e exemplo de uso do TabStrip ..................... 12

5. Criando um sistema de navegao inteligente ..................................................................... 15

6. Criando um sistema de navegao para avaliar um financiamento ..................................... 19

7. Carregando informaes de banco de dados para os controles .......................................... 29

8. Como atualizar o banco de dados central a partir do formulrio .......................................... 34

9. Removendo/adicionando informaes no banco de dados e criando um sistema de


navegao de registros.........................................................................................................37

10. Criando uma mini prova utilizando um sistema de navegao............................................. 46

11. Criando um formulrio em diferentes idiomas em tempo de execuo ................................ 52

12. Sobre o autor ........................................................................................................................ 59

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 1

SRIES: COMO FAZER

Formulrios no Excel Utilizando VBA:


MultiPage e TabStrip
por Robert Friedrick Martim

Introduo

Bem-vindo a srie Como Fazer.

Nas sries que sero escritas estaremos olhando aspectos distintos do Excel de acordo com a
demanda do frum Excel Jlio Battisti (http://www.juliobattisti.com.br). A inteno principal
fornecer ao internauta uma ferramenta que concentre a ateno na soluo de um problema
especfico.

Esta a segunda parte da srie sobre formulrios no Excel. A primeira parte lida com os controles
Listbox e Combobox. Se voc no possui a primeira parte ela pode ser adquira em
http://www.juliobattisti.com.br/cursos/excelvbaforms/default.asp. Aqui, veremos
como manipular os controles MultiPage e TabStrip de forma eficiente no Excel. Estaremos
olhando a maneira como o Excel manipula estes controles e como utilizar este conhecimento para
resolver problemas.

Antes de continuar

O trabalho foi desenvolvido no Excel 2003. Devido rpida mudana em termos de tecnologia de
software, ateno sempre ser dada s verses mais recentes do aplicativo Excel.

No existe um pr-requisito per se; porm, o leitor deve estar ciente de que com o conhecimento
bsico em dia, o aproveitamento do material ser muito melhor. Sem o devido conhecimento de
algumas partes bsicas que envolvem funes, este mdulo se tornar mais laborioso e difcil do
que realmente para aqueles sem o conhecimento bsico.

Sugestes sero sempre bem-vindas e esperamos que o leitor participe pro-ativamente no


desenvolvimento do material aqui apresentado.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
2 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

1. O que so e a diferena entre os controles MultiPage e TabStrip


Neste primeiro tpico, veremos as diferenas bsicas entre um MultiPage e TabStrip. Embora
eles sejam visualmente iguais, estes dois controles so bastante diferentes no que fazem.

Um MultiPage, por exemplo, ser bastante til quando precisamos trabalhar com uma grande
volume de informaes que podem ser classificadas em diversas categorias. Isto geralmente
ocorre quando trabalhamos com banco de dados. Vamos supor que estamos lidando com
informaes cadastrais de funcionrios. Utilizando o MultiPage podemos agrupar as informaes
por categorias: uma pgina poderia conter informaes pessoais; outra pgina relacionaria os
interesses do funcionrio e assim por diante. A vantagem neste caso que podemos manter
todas as informaes sobre o funcionrio em um nico formulrio onde as informaes so
agrupadas por pginas.

Um TabStrip por outro lado contm as mesmas guias (tabulaes) que o MultiPage, porm os
objetos colocados em uma guia so compartilhados com todas as outras guias. Em outras,
palavras se voc colocar uma caixa de texto na primeira guia do MultiPage, esta caixa somente
estar disponvel nesta guia. J no TabStrip a mesma caixa de texto estar presente em todas
as guias e exatamente na mesma posio.

Ambos os controles podem ser acessados a partir da caixa de ferramentas do VBE. Caso estes
controles no estejam presentes na caixa de ferramentas, voc poder inclu-los da seguinte
forma:

1. Clique com o boto direito do mouse sobre a caixa de ferramentas e escolhas a opo
Controles adicionais;

2. Selecione o controle da lista. Os dois controles so:

o Microsoft Forms X.x MultiPage

o Microsoft Forms X.x TabStrip

A figura abaixo mostra a seleo dos dois controles:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 3

Figura 1-1

Por padro tanto o MultiPage quanto o TabStrip inserem 2 tabulaes. Tabulaes adicionais
podem ser acrescentadas atravs de um clique-direito sobre o objeto em questo. Por exemplo,
para acrescentar uma pgina extra ao MultiPage:

Figura 1-2

Observe que a caixa de propriedades mostra as propriedades para cada pgina quando ela
selecionada. Se voc deseja modificar o Name ou Caption de uma pgina qualquer, basta
selecionar a pgina em questo e modificar as propriedades. Se a caixa de propriedades no
estiver visvel, pressione F4 para ativ-la.

Alm da opo Nova pgina, podemos no mesmo menu de atalho selecionar as seguintes
opes:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
4 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Excluir pgina

Renomear

Mover

A primeira opo simplesmente remove a pgina em questo. A opo Mover utilizada para
modificar a posio relativa da pgina, em outras palavras, a Page2 pode ser movida para ficar
antes da Page1 e assim sucessivamente.

A opo Renomear tem outras opes que precisamos desvendar:

Figura 1-3

A propriedade Legenda a propriedade Caption na caixa de propriedades e no VBA. A Tecla


de acelerao serve para criar um atalho de acesso guia do controle. Neste caso, ao definir a
tecla como sendo P, a letra P na legenda de nossa pgina ser sublinhada indicando que a
pgina pode ser acessada atravs da combinao ALT+P. Este mesmo tipo de tecla de
acelerao voc encontra nos menus de diversos aplicativos para o Windows.

Em termos de propriedades, ficarei por aqui. O motivo para no entrar nos detalhes das
propriedades e que explicaes podem ser encontradas no Ajuda (Help) que acompanha o VBA.
Em outras palavras, seria repetir aqui o que voc encontra gratuitamente no Ajuda.

No caso do uso de propriedades especficas e que necessitem explicaes sobre o procedimento,


devida ateno ser dada ao funcionamento e utilizao da propriedade.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 5

2. Devo utilizar um MultiPage ou um TabStrip?


Se voc alguma vez tentou criar um aplicativo que requer mltiplas pginas, voc deve ter
encontrado tal dilema, mas como resolv-lo?

A primeira coisa que precisamos entender como cada controle funciona. Como observado no
tpico anterior, um controle colocado dentro do TabStrip estar disponvel em todas as
tabulaes do controle TabStrip. Isso significa que o controle no est sendo colocado na guia,
mas no container das guias, isto , no controle TabStrip.

Por outro lado, quando voc adiciona um controle qualquer em um MultiPage, o controle
somente estar visvel na pgina onde ele foi adicionado.

Esta diferena indica como devemos escolher entre MultiPage e TabStrip. Vamos supor que o
layout de todas as pginas igual, mas cada pgina (guia) mostra valore diferentes. Neste caso,
estaremos interessados em um TabStrip, pois o layout estar disponvel em todas as guias
uniformemente.

Porm, se estamos interessados em layouts diferentes em cada guia onde os dados apresentado
esto ligados de uma forma ou de outra, estamos interessados em um MultiPage.

A figura abaixo mostra a diferena crucial entre os dois controles

Figura 2-1

Na figura esquerda temos a seleo na guia 1 (Page1 e Tabulao1)1 e na figura direita a


seleo da segunda guia. Na segunda pgina do MultiPage tenho uma caixa de texto que

1
Voc deve estar se perguntando o motivo para a no traduo de Page e a traduo dos Tabs. Esta uma incgnita que somente os
tradutores dos controles podero sanar, pois no tenho idia dos motivos para a inconsistncia.
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
6 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

somente ficar visvel quando a guia for selecionada. Por outro lado, a caixa de texto presente no
TabStrip compartilhada nas guias.

Com esta diferena definida a deciso sobre qual escolher comea a tomar forma.

Antes de partirmos para assuntos mais avanados, nos dois prximos tpicos veremos como cada
controle separadamente.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 7

3. Utilizando o controle Multipage


Para avaliar a utilizao destes controles, irei criar alguns exemplos bsicos para cada um
separadamente.

Acredito que o maior potencial do controle MultiPage est em sua versatilidade, isto , em como
podemos criar diversas pginas contendo informaes relacionadas sem a necessidade de vrios
formulrios.

Neste primeiro caso, carregaremos dados contidos em nossa planilha para criar nossas pginas.
No decorrer do mdulo, veremos como carregar estas informaes de um banco de dados e
manipul-las.

J vi formulrios com vrios controles onde a propriedade visible passada para true ou false
para simular um MultiPage. desnecessrio dizer que alm de criar cdigo desnecessrio
controlar tudo isso em um lugar s com tudo amontoado realmente complicado.

Sem dvida que nosso conceito do que bom est sempre em movimento. Hoje, encontramos a
soluo acima e amanha inventamos uma forma nova de fazer algo.

Se voc alguma vez trabalhou com o Access talvez tenha tido contato com um destes controles.
No Excel, ele realmente pouco conhecido e utilizado.

Nossa primeira para como mover as tabulaes via cdigo.

3.1. Viso geral das principais propriedades e exemplo de uso do MultiPage

Algo que voc certamente precisa saber para manipular um MultiPage da melhor forma possvel
diz respeito navegao pelas tabulaes do MultiPage.

A chave para isso est na propriedade Value. Esta propriedade ser revista mais adiante quando
construiremos formulrios mais avanados.

Cada pgina de um MultiPage recebe uma numerao que vai de zero at o nmero de pginas
inseridas no controle. A figura abaixo mostra um formulrio contendo um MultiPage com quatro
pginas:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
8 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 3-1

Como a quarta pgina a selecionada, se este formulrio iniciado esta ser a pgina ativa.
Porm, em um sistema de navegao voc certamente deseja que a pgina inicial seja a Page1.

A numerao das pginas iniciada em zero (0) e no caso acima a pgina quatro recebe o valor
3. Para forar a inicializao pela primeira pgina, basta definir o seguinte cdigo em seu
formulrio:

Private Sub UserForm_Activate()


MultiPage1.Value = 0 'inicia o MultiPage na 1a. pgina
End Sub

Ou ainda:

Private Sub UserForm_Initialize()


MultiPage1.Value = 0 'inicia o MultiPage na 1a. pgina
End Sub

Uma opo ou outra forar o incio pela Page1.

Se voc est criando um sistema de navegao no formulrio acima com certeza voc quer que o
formulrio seja iniciado pela pgina um. Alm disso, provvel que voc queira omitir as
tabulaes tambm.

Para omitir as tabulaes utilizamos a propriedade Style. Est propriedade pode receber os
argumentos fmTabStyleTabs, fmTabStyleButtons ou fmTabStyleNone. A primeira opo
a mostrada na figura acima. A segunda bem similar ao boto de alternncia (Toggle
Button) e a terceira a completa remoo das tabulaes.

A figura abaixo mostra o controle como botes:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 9

Figura 3-2

Observe que a moldura do MultiPage no est mais presente. Se os botes fossem removidos
(utilizando a ltima opo de estilo) o que voc obtm um formulrio em branco. Ao carregar o
formulrio, se no houver nenhum outro controle na pgina do MultiPage a impresso que temos
que no h nada no formulrio.

A prxima pergunta ser: se no h nenhuma tabulao, ento, como navegar pelas pginas?

Esta pergunta foi respondida quando definimos a pgina inicial.

Private Sub cmdAvancar_Click()


On Error Resume Next
MultiPage1.Value = MultiPage1.Value + 1
End Sub

O novo valor do MultiPage em caso de avano ser o valor atual do MultiPage mais um. A linha
On Error Resume Next colocada, pois ao atingirmos o final do controle, no caso acima pgina
quatro valor trs, o prximo valor no poder ser passado para o controle e haver um erro.
Observe a figura:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
10 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 3-3

Com a linha comentada ocorre um erro durante o avano. O exemplo acima com o On Error
Resume Next apenas um paliativo. Nos tpicos que seguem mostrarei como contar o
problema de outra forma.

Por analogia, para voltar uma pgina subtramos um do valor atual da pgina:

Private Sub cmdVoltar_Click()


On Error Resume Next
MultiPage1.Value = MultiPage1.Value - 1
End Sub

Uma propriedade que pode ser bastante til a MultiRow. Se voc j utilizou o caixa de opes
do Excel voc certamente j viu isso:

Figura 3-4

A figura acima mostra a caixa de opes do Excel com seu MultiPage com tabulaes como se
fossem as abas de etiquetas de uma pasta de arquivo. Este efeito conseguido quando
modificamos a propriedade MultiRow para True (verdadeiro):

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 11

Figura 3-5

A figura acima mostra o que ocorre ao modificarmos esta propriedade. Como pode ser observado,
o resultado final dependente do tamanho do MultiPage e de cada tabulao dentro do
MultiPage.

Se o objetivo de seu MultiPage similar ao opes do Excel interessante utilizar este


propriedade para que voc possa fazer melhor proveito do espao em seu formulrio.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
12 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

4. Utilizando o controle TabStrip


O controle TabStrip, como observado inicialmente, bem similar ao MultiPage. A diferena
que um controle colocado em um pgina do TabStrip estar presente em todas as outras
pginas.

Esta caracterstica pode representar uma grande vantagem. Supondo que os campos so
exatamente os mesmos para duas pginas onde somente os dados mudam, ento, devemos usar
um TabStrip ao invs de um MultiPage, pois o design constante em todas as pginas.

Um exemplo interessante o exemplo padro dado pela prpria Microsoft. O exemplo consiste
em um formulrio com um TabStrip com trs tabulaes com o nome de trs cores. No TabStrip
h uma moldura de imagem e a moldura muda de cor conforme selecionamos uma tabulao
diferente.

Este exemplo, de domnio pblico, acompanha este mdulo, mas estarei mostrando o meu prprio
exemplo.

4.1. Viso geral das principais propriedades e exemplo de uso do TabStrip

Tanto o MultiPage quanto o TabStrip possuem vrias propriedades em comum e a diferena


ser notada quando voc seleciona um pgina no TabStrip e outra no MultiPage. Esta diferena
ocorre pela prpria natureza de um TabStrip. Se fosse construir um formulrio contendo vrios
botes no topo simulando um TabStrip, voc ver que o resultado basicamente o mesmo, pois
o TabStrip no funciona como um contentor do objeto como o MultiPage.

Para iniciar o seu formulrio com o ndice do TabStrip na primeira pgina, voc deve utilizar o
mesmo esquema que o MultiPage:

Private Sub UserForm_Activate()


TabStrip1.Value = 0 'inicia o TabStrip na 1a. pgina
End Sub

Ou ainda:

Private Sub UserForm_Initialize()


TabStrip1.Value = 0 'inicia o MultiPage na 1a. pgina
End Sub

Uma opo ou outra forar o incio pela Tab1.

O exemplo a seguir mostra como utilizar o TabStrip em uma situao onde voc tem vrias
planilhas que representam estantes onde produtos so guardados. Cada estante possui suas
prateleiras onde os produtos so guardados.
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 13

O nosso formulrio possui um TabStrip com trs tabulaes. Cada tabulao representa uma
planilha. Dentro do TabStrip temos duas caixas de texto onde cada uma recebe a prateleira onde
se encontra o produto e o nome do produto. Dentro do mesmo TabStrip h dois botes para
navegao dentro da estante, isto , navegao pelos produtos.

O layout geral do formulrio ser:

Figura 4-1

Com o layout do formulrio pronto, podemos iniciar o nosso cdigo:

Private Sub UserForm_Activate()


tbsEstantes.Value = 0
txtPrateleira = Sheets("Estante 1").Range("A2")
txtProduto = Sheets("Estante 1").Range("B2")
End Sub

Private Sub tbsEstantes_Change()


On Error Resume Next
Call atualizar(tbsEstantes.SelectedItem.Caption, 2)
End Sub

Private Sub cmdAvancar_Click()


On Error Resume Next
' Move para a prxima estante
tbsEstantes.Value = tbsEstantes.Value + 1
' Pega o primeiro item da estante e mostra-os na caixa de texto
Call atualizar(tbsEstantes.SelectedItem.Caption, 2)
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
14 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Private Sub cmdAvancarPrateleira_Click()


' Procura pelo valor atual na lista
' A lista vai de B1 a B100. Voc pode usar um nome
' dinmico se preferir
lin = WorksheetFunction.Match(txtProduto, _
Sheets(tbsEstantes.SelectedItem.Caption).Range("B1:B100"), 0) + 1

' Se a prxima linha no for vazia, ento


If Not Range("B" & lin) = "" Then
' Atualizar os dados
Call atualizar(tbsEstantes.SelectedItem.Caption, lin)
Else:
' Se a prxima linha for vazia, os registros terminaram
' Avisar o usurio e ...
MsgBox "Este foi o ltimo registro encontrado. " _
& "Voltando ao primeiro registro.", vbInformation + vbOKOnly
' ... voltar para o primeiro item.
Call atualizar(tbsEstantes.SelectedItem.Caption, 2)
End If
End Sub

Private Sub cmdVoltar_Click()


On Error Resume Next
tbsEstantes.Value = tbsEstantes.Value - 1
Call atualizar(tbsEstantes.SelectedItem.Caption, 2)
End Sub

Private Sub atualizar(plan As String, ByVal lin As Long)


' Recebe os parmetros dos cliques e atualiza o registro
txtProduto = Sheets(plan).Range("B" & lin)
txtPrateleira = Sheets(plan).Range("A" & lin)
End Sub

Private Sub cmdVoltarPrateleira_Click()


lin = WorksheetFunction.Match(txtProduto, _
Sheets(tbsEstantes.SelectedItem.Caption).Range("B1:B100"), 0) - 1
If Not lin = 1 Then
Call atualizar(tbsEstantes.SelectedItem.Caption, lin)
Else:
MsgBox "Este o primeiro registro da lista.", _
vbInformation + vbOKOnly
Call atualizar(tbsEstantes.SelectedItem.Caption, 2)
End If
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 15

5. Criando um sistema de navegao inteligente


Se voc trabalha com Excel em algum ponto voc deve ter passado por uma situao que requer
a criao de um Assistente. Assistentes so extremamente teis, pois eles nos permitem guiar o
usurio para que a resposta final seja realmente o que desejamos. Para o usurio, o Assistente
benfico por tornar a construo do problema mais fcil.

Nesta parte estarei demonstrando como criar um sistema de navegao inteligente.


Primeiramente, estarei demonstrando os passos principais e no final de tpico apresentarei uma
soluo que pode ser aplicada ao problema de avaliao de crdito.

Para iniciar crie um novo formulrio e acrescente um MultiPage (acrescentando controles


adicionais em cada pgina) e dois botes2, conforme a figura abaixo:

Figura 5-1

Com as pginas criadas, podemos passar a propriedade Style para fmTabStyleNone para
remover as tabulaes das pginas. Voc pode modificar esta propriedade a qualquer momento,
mas o ideal remover as tabulaes ao terminar todo o cdigo e design para facilitar acesso s
pginas em caso de necessidade durante o desenvolvimento.

Iniciarei pelo cdigo do formulrio, isto , quando o formulrio for ativado algo acontecer:

Private Sub UserForm_Activate()


MultiPage1.Value = 0 'inicia o MultiPage na 1a. pgina
chkPaginao 'checa as condies
End Sub

2
Se desejar, acrescente um valor para a propriedade Accelerator dos botes. Neste caso, utilizo a letra V e n para acelerar o
acesso aos dois controles via teclado.
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
16 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

A primeira coisa a ser feita assegurar que iniciamos na primeira pgina. Em seguida, rodamos a
rotina chkPaginao. O que esta rotina faz bastante simples. Imagine a situao onde estamos
no limite do MultiPage? Se voc clicar no boto Voltar haver um erro, pois no h mais nada
para a esquerda. Por outro lado, se voc deseja avanar e no h mais pginas para avanarmos;
ento, haver um erro tambm.

A soluo encontrar o fim da paginao desativar o boto em questo, isto , se estamos no


limite esquerdo desativamos o boto Voltar e se estamos no limite direito desativamos o boto
Avanar. Abaixo apresento duas formas distintas de se fazer a mesma coisa:

Sub chkPaginao()
ndice = MultiPage1.Value
fim = MultiPage1.Pages.Count - 1

Select Case ndice


Case 0
cmdVoltar.Enabled = False
cmdAvanar.Enabled = True

Case fim
cmdVoltar.Enabled = True
cmdAvanar.Enabled = False

Case Else
cmdVoltar.Enabled = True
cmdAvanar.Enabled = True
End Select

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' VOCE PODE UTILIZAR AS CONDICOES ABAIXO PARA SIMULAR '
' AS CONDICOES DO BLOCO SELECT CASE-END SELECT '
' APRESENTADAS ACIMA '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'If ndice = 0 Then
' cmdVoltar.Enabled = False
' cmdAvanar.Enabled = True
' Exit Sub
'End If

'If ndice = fim Then


' cmdVoltar.Enabled = True
' cmdAvanar.Enabled = False
'Else:
' cmdVoltar.Enabled = True
' cmdAvanar.Enabled = True
'End If

End Sub

Aqui, avalio o caso referente ao ndice atual do MultiPage. Cada pgina representada por um
nmero e este nmero passado para varivel ndice. Uma outra varivel importante a
referente ao final da paginao. A varivel fim encontrada contando-se o nmero total de
pginas e subtraindo um deste total. Isto necessrio porque a primeira pgina tem ndice 0
(zero); portanto a contagem resultar no nmero correto de pginas, mas com um ndice a mais.
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 17

Resolvido este problema, passamos para os botes de navegao.

Private Sub cmdAvanar_Click()


'Denife o novo valor do MultiPage como sendo
'o valor atual MAIS 1
MultiPage1.Value = MultiPage1.Value + 1

'checa a paginao para definir o estado dos


'botes de navegao
chkPaginao
End Sub

Private Sub cmdVoltar_Click()


'Denife o novo valor do MultiPage como sendo
'o valor atual MENOS 1
MultiPage1.Value = MultiPage1.Value - 1

'checa a paginao para definir o estado dos


'botes de navegao
chkPaginao
End Sub

Com estes dois ltimos cdigos prontos, terminamos o nosso sistema de navegao. A figura
abaixo mostra a situao onde nos encontramos nos extremos de nosso formulrio:

Figura 5-2

Ao iniciar o boto Voltar desativado por no haver mais pginas esquerda. No outro extremo,
o boto avanar desativado por no haver mais pginas para avanarmos. Ao removermos as
tabulaes o efeito criado pelo sistema ainda melhor:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
18 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 5-3

Na figura acima, naveguei at a terceira pgina. Como o MultiPage encontra-se dentro de uma
Moldura a transio entre pginas acontece sutilmente e todos os controles parecem estar
dentro da Moldura.

A nossa prxima tarefa criar um Assistente para avaliao de crdito. No problema que definirei,
ns estamos interessados em saber informaes pessoais do indivduo, informaes de trabalho,
informaes sobre ganhos e produto a ser comprado e financiado.

Tudo isso ocorre diretamente no MultiPage onde utilizamos o sistema de navegao


apresentado anteriormente. No ltimo passo retornada uma tabela contendo os valores que
foram calculados do financiamento.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 19

6. Criando um sistema de navegao para avaliar um financiamento


Depois de mostrar como um sistema de navegao pode ser criado, chegou a hora de criar um
pequeno sistema para avaliao de crdito utilizando o que foi aprendido.

Aqui, estou assumindo que voc possui certo conhecimento de matemtica financeira. Porm,
mesmo no tendo o desenvolvimento do problema bastante simples e fcil de acompanhar.

Para iniciar crie trs planilhas. Nomeie uma de Input, onde inseriremos os dados de entrada do
formulrio e a outra de Resultados, onde os resultados dos clculos sero colocados.

A primeira ter os seguintes dados (veja pasta de trabalho que acompanha este tpico):

Figura 6-1

E a planilha de resultados:

Figura 6-2

Os resultados so inseridos pelo clculo e a figura acima apenas ilustrativa.

Crie um formulrio e adicione um MultiPage com cinco pginas. Cada pgina dever conter os
controles conforme as figuras:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
20 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 6-3 Pgina 1

Figura 6-4 Pgina 2

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 21

Figura 6-5 Pgina 3

Figura 6-6 Pgina 4

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
22 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 6-7 Pgina 5

Para a pgina 5, o controle a ser acrescentado uma ListBox (Caixa de Listagem) que ser
utilizada para colocar o resultado de nossos clculos.

Os controles de navegao devem estar fora do Multipage e para dar um ar melhor ao nosso
projeto, utilize uma Moldura (Frame) para agrupar os controles de cada pgina.

Aps posicionar todos os seus controles e estiver satisfeito com o layout geral de seu formulrio e
pginas do MultiPage, modifique a propriedade Style do MultiPage para fmTabStyleNone
para esconder as tabulaes, obtendo um resultado final como mostra a figura abaixo:

Figura 6-8

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 23

O layout final fica, obviamente, a critrio do leitor. Ele no precisa ser exatamente como
apresentado. D o seu prprio toque pessoal ao formulrio. O melhor brincar com diferentes
layouts para ver qual se encaixa melhor na mensagem e ajuda que voc deseja passar e dar ao
usurio de seu formulrio.

Dito isso, estamos prontos para olhar o cdigo de nosso formulrio.

Private Sub UserForm_Activate()


'Ao ativar o formulrio, ativar primeira pgina do MultiPage
pageAssistente.Value = 0

'Deixar a UF em branco na pgina de dados pessoais


cboUF.ListIndex = 0

'Deixar a UF em branco na pgina de dados de emprego


cboUFEmpresa.ListIndex = 0

'Checar os controles
chkControles
End Sub

Private Sub cmdCancelar_Click()


'Descarrega o formulrio
Unload Me
End Sub

Private Sub cmdAvanar_Click()


'avana uma pgina do MultiPage
pageAssistente.Value = pageAssistente.Value + 1

'Checa a condio do controle


chkControles
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
24 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Private Sub cmdVoltar_Click()


'Volta uma pgina do MultiPage
pageAssistente.Value = pageAssistente.Value - 1

'Checa a condio do controle


chkControles
End Sub

Sub chkControles()
'guarda o ndice atual do MultiPage
ndice = pageAssistente.Value

'guard a ltima pgina do MultiPage


fim = pageAssistente.Pages.Count - 1

'Verifica cada caso dos ndices do MultiPage


Select Case ndice
Case 0
'Se for a primeira pgina, inibe o boto "Voltar"
cmdVoltar.Enabled = False
'Habilita o boto "Avanar"
cmdAvanar.Enabled = True

Case fim
'Se for a ltima pgina, inibe o boto "Avanar"
cmdAvanar.Enabled = False
'Habilita o boto "Voltar"
cmdVoltar.Enabled = True
'Habilita o boto "Concluir"
cmdConcluir.Enabled = True

Case Else
'Para casos diferentes de incio e final das
'pginas, habilitar os botes de "Avanar" e "Voltar"
cmdVoltar.Enabled = True
cmdAvanar.Enabled = True
'Desabilitar o boto de "Concluir"
cmdConcluir.Enabled = False

End Select

'Insere um "caption" no formulrio referente a pgina atual do Assistente


frmAssistente.Caption = "Pgina " & ndice + 1 & " de " & fim + 1

End Sub

Private Sub cboProdutoPreco_Change()


'Pega o salrio disponvel da pgina anterior
txtDisp.Value = Format(txt30pct.Value, "Currency")

'Habilita os frames da pgina atual


fraCondicoes.Enabled = True
fraResultados.Enabled = True
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 25

Private Sub opt6Meses_Click()


'Pega a varivel referente ao prazo de pagamento.
'Esta varivel encontra-se na propriedade "Tag" do
'boto de opo
n = Val(opt6Meses.Tag)

'Passa a varivel para a Sub que calcular os valores


'das prestaes do produto em questo
clculos (n)
End Sub

Private Sub opt12Meses_Click()


'Pega a varivel referente ao prazo de pagamento.
'Esta varivel encontra-se na propriedade "Tag" do
'boto de opo
n = Val(opt12Meses.Tag)

'Passa a varivel para a Sub que calcular os valores


'das prestaes do produto em questo
clculos (n)
End Sub

Private Sub opt18Meses_Click()


'Pega a varivel referente ao prazo de pagamento.
'Esta varivel encontra-se na propriedade "Tag" do
'boto de opo
n = Val(opt18Meses.Tag)

'Passa a varivel para a Sub que calcular os valores


'das prestaes do produto em questo
clculos (n)
End Sub

Private Sub opt24Meses_Click()


'Pega a varivel referente ao prazo de pagamento.
'Esta varivel encontra-se na propriedade "Tag" do
'boto de opo
n = Val(opt24Meses.Tag)

'Passa a varivel para a Sub que calcular os valores


'das prestaes do produto em questo
clculos (n)
End Sub

Private Sub opt36Meses_Click()


'Pega a varivel referente ao prazo de pagamento.
'Esta varivel encontra-se na propriedade "Tag" do
'boto de opo
n = Val(opt36Meses.Tag)

'Passa a varivel para a Sub que calcular os valores


'das prestaes do produto em questo
clculos (n)
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
26 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Private Sub opt48Meses_Click()


'Pega a varivel referente ao prazo de pagamento.
'Esta varivel encontra-se na propriedade "Tag" do
'boto de opo
n = Val(opt48Meses.Tag)

'Passa a varivel para a Sub que calcular os valores


'das prestaes do produto em questo
clculos (n)
End Sub

Sub clculos(ByVal nper)

'Dimensionamento das variveis a serem utilizadas no clculo


Dim taxa As Double
Dim VP As Double
Dim pgtoTotal As Double
Dim ws As Worksheet

'Define o objeto ws (worksheet) como sendo a planilha "Resultados"


Set ws = ThisWorkbook.Sheets("Resultados")

'Limpa o contedo da rea que receber os resultados do cdigo


ws.Range("A2:E50").ClearContents

'Proporciona a taxa pelo valor do controle "Spin"


taxa = spinJuros.Value / 400

'Define o valor presente (VP) do produto


VP = cboProdutoPreco.Value

'Caso haja um erro, continua o processamento


On Error Resume Next

'Utiliza a funo PMT de planilha (WorksheetFunction) para


'calcular o valor de cada prestao
pgtoTotal = WorksheetFunction.Pmt(taxa, nper, -VP, 0, 0)

'Formata o pagamento total. Voc pode fazer isso no passo anterior


'se desejar
txtPgto = Format(pgtoTotal, "currency")

'Pega o quanto a pessoal tem disponvel para gastar no ms


totalDisp = CDbl(txt30pct.Value)

'Se a parcela for maior do que o saltio disponvel;


If pgtoTotal > totalDisp Then
'ento, o emprstimo no autorizado.
lblFinanciamentoOK.Caption = "Financiamento no autorizado."
'Se for menor;
Else:
'ento, o emprstimo autorizado.
lblFinanciamentoOK.Caption = "Financiamento autorizado."
End If

'Coloca o valor presente na clula E2


ws.Range("E2") = VP

'Clula A2 = 0
ws.Range("A2") = 0

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 27

'Para = 1 at nper
For i = 1 To nper
'na planilha ws (Resultados)
With ws
'Clula ("A" & i + 2) = nper
.Range("A" & i + 2) = i

'Clula ("B" & i + 2) = ao pagamento total


.Range("B" & i + 2) = pgtoTotal

'Clula ("C" & i + 2) = juros pagos sobre o financiamento


.Range("C" & i + 2) = .Range("E" & i + 1) * taxa

'Clula ("D" & i + 2) = pgt do valor principal do financiamento


.Range("D" & i + 2) = .Range("B" & i + 2) - .Range("C" & i + 2)

'Clula ("E" & i + 2) = Balano sobre o financiamento original


.Range("E" & i + 2) = .Range("E" & i + 1) - .Range("D" & i + 2)
End With
Next

'Passa a lista de resultados para a listbox do formulrio.


'Utilizo um "nome dinmico" para isso. Veja frmula em:
'Inserir --> Nomes --> Definir e clique sobre "pgtos"
lstPgtos.RowSource = "pgtos"

End Sub

Private Sub spinJuros_Change()


'Dimensiona a varivel "juros"
Dim juros As Double

'Proporciona o juros
juros = spinJuros.Value / 400

'Desabilita os botes de opo e passa seus valores


'para zero
opt6Meses.Value = False: opt6Meses.Enabled = False
opt12Meses.Value = False: opt12Meses.Enabled = False
opt18Meses.Value = False: opt18Meses.Enabled = False
opt24Meses.Value = False: opt24Meses.Enabled = False
opt36Meses.Value = False: opt36Meses.Enabled = False
opt48Meses.Value = False: opt48Meses.Enabled = False

'Caso o valor da caixa de texto seja maior que zero


'habilitar os botes de opo
If juros > 0 Then
opt6Meses.Enabled = True
opt12Meses.Enabled = True
opt18Meses.Enabled = True
opt24Meses.Enabled = True
opt36Meses.Enabled = True
opt48Meses.Enabled = True
End If

'Formata os juros para percentuais


txtJuros = Format(juros, "percent")

'Calcula o pgto para nper = 0 (zero o resultado)


clculos (0)
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
28 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Private Sub txtDescontos_Change()


'Verifica o tipo de dado entrado no campo "descontos"
If Len(txtDescontos) > 0 And IsNumeric(txtDescontos) = False Then
txtDescontos.Text = ""
MsgBox "O valor precisa ser numrico...", vbInformation
End If

'Em caso de erro continuar processamento


On Error Resume Next

'Calcula o valor lquido


txtLquido = Val(txtSalBruto) - Val(txtDescontos)

'Do valor lquido, apenas 30% pode ser comprometido com o financiamento
txt30pct = Val(txtLquido) * 0.3
End Sub

Private Sub txtSalBruto_Change()


'Verifica o tipo de dado entrado no campo "Salrio Bruto"
If Len(txtSalBruto) > 0 And IsNumeric(txtSalBruto) = False Then
txtSalBruto.Text = ""
MsgBox "O valor presica ser numrico...", vbInformation
End If

'Em caso de erro continuar processamento


On Error Resume Next

'Calcula o valor lquido


txtLquido = Val(txtSalBruto) - Val(txtDescontos)

'Do valor lquido, apenas 30% pode ser comprometido com o financiamento
txt30pct = Val(txtLquido) * 0.3
End Sub

E nosso Assistente de Anlise de Crdito est pronto para ser rodado. Na ltima pgina, voc
dever obter um resultado similar a este:

Figura 6-9

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 29

7. Carregando informaes de banco de dados para os controles


Muitas vezes os usurios de Excel tendem a criar mega planilha para armazenamento e leitura de
dados. Contudo, este mtodo pode causar srios problemas quanto a integridade dos dados.

No primeiro mdulo sobre formulrio, mostrei como carregar informaes de um banco de dados e
forma aqui apresentada ligeiramente diferente. A inteno ir construindo os modelos da base
at o topo, isto , iniciamos com um exemplo simples e vamos aumentando a complexidade at
atingirmos um aplicativo que seja o mais robusto possvel.

Uma questo que vez ou outra aparece no frum sobre como carregar imagens para um
formulrio. No exemplo que segue, mostrarei como carregar as informaes de um banco de
dados e como carregar uma foto tambm.

Os dados utilizados so do banco de dados Northwind. Para evitar problemas com fotos de
pessoas, utilizo fotos numeradas para que voc possa visualizar a mudana. Apenas uma tabela
do banco de dados Northwind utilizada.

As figuras abaixo mostram o que o nosso MultiPage deve conter e como ele ficar aps o
carregamento dos dados.

Figura 7-1

O formulrio contm duas pginas em um MultiPage. A primeira pgina mostra informaes


sobre o funcionrio em relao a empresa e segunda pgina mostra informaes pessoais.

Os botes Voltar e Avanar so utilizados para navegar os registros dos funcionrios.


Diferentemente dos exemplos anteriores eles no so utilizados para avanar nas tabulaes do
MultiPage.
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
30 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Para completar o exerccio voc precisar:

Um MultiPage com duas pginas

Um formulrio

Trs botes de comando

Sete caixas de texto

Uma moldura de imagem

Um mdulo

O formulrio ser carregado assim que o documento Excel for aberto. Assim sendo, precisamos
inserir o cdigo no pasta de trabalho para a execuo:

Private Sub Workbook_Open()


' Mostra o formulrio quando a planilha aberta
frmBD.Show
End Sub

Feito isso, o nosso prximo passo inserir o cdigo no formulrio.

Assegure-se que os nomes utilizados so os mesmos que no exemplo dado. Se eles forem
diferentes ocorrer um erro:

Private Sub cmdAvanar_Click()


Call prximo
End Sub

Private Sub cmdVoltar_Click()


Call anterior
End Sub

Private Sub cmdFechar_Click()


Unload Me
End Sub

Private Sub UserForm_Initialize()


' Inicia o MultiPage sempre na primeira pgina
MultiPage1.Value = 0
' Chama a sub-rotina para carregar os dados
Call carregarInfo
End Sub

Os trs primeiros casos so bem simples. O primeiro avana um registro e o segundo volta um
registro. J o terceiro simplesmente descarrega o formulrio. A quarta rotina chamada quando o
formulrio iniciado assegurando que estamos sempre na primeira pgina do MultiPage e que o
primeiro registro do BD carregado.

Caso no haja dado algum o formulrio carregado em branco.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 31

O prximo passo definir as variveis que usaremos. Antes de continuar, porm, instale as
referncias ao Microsoft ActiveX Data Object x.x. Library. Para tanto, no VBE, v at
Ferramentas Referncias, selecione o item acima e instale-o.

Com as referncias instaladas, abra o mdulo que voc criou e entre as seguintes variveis logo
no topo:

Public Const Tabela As String = "funcionrios"


Public Const IDInicial As Byte = 1

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim nomeBD As String
Dim IDFunc As Long

A primeira constante o nome da tabela. A segunda constante o primeiro registro da tabela. O


segundo grupo de variveis inclui uma conexo Active Data Object (ADO), um Recordset,
uma String para guardar o endereo e nome do banco de dados e um nmero longo (long) para
armazenar o nmero do registro.

Se voc deixou de instalar as referncias ao ADO, voc no conseguir dimensionar as variveis


cn e rs.

Algo que precisamos observar que a forma como os dados so carregados igual para o incio
de formulrio, avano e retrocesso dos registros, portanto, no h necessidade de repetir o
mesmo cdigo vrias vezes. Ao invs disso, o que faremos passar as variveis para o rotina que
carregar os dados.

Iniciamos por estas trs rotinas:

Sub carregarInfo()
geral ThisWorkbook.Path & "\BD\bd2.mdb", IDInicial
End Sub

Sub prximo()
geral ThisWorkbook.Path & "\BD\bd2.mdb", Val(frmBD.txtIDFunc) + 1
End Sub

Sub anterior()
geral ThisWorkbook.Path & "\BD\bd2.mdb", Val(frmBD.txtIDFunc) - 1
End Sub

A rotina que carrega os dados para o formulrio chamada de geral e recebe o endereo
completo do banco de dados (incluindo o nome) e o ndice do funcionrio. Conforme for digita o
nome desta rotina ela lhe apresentar com os argumentos necessrios:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
32 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 7-2

Os quais, como dito, so o endereo do banco de dados (incluindo o nome) e o nmero serial do
funcionrio. exatamente este nmero serial que a chave para a navegao nos registros do
banco de dados.

Com isso em mente ns podemos partir para a construo do ltimo cdigo. As explicaes
acompanham o cdigo:

Sub geral(nomeBD As String, IDFunc As Long)


'Cria a conexo
Set cn = New ADODB.Connection

'Abre a conexo utilizando o "Driver" correto e nome do BD


'passado como parmetro para esta sub-rotina
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & nomeBD & ";"

'Cria o conjunto de registros (recordset)


Set rs = New ADODB.Recordset

'Abre o conjunto de registros da tabela passada


'como parmetro para esta sub-rotina
rs.Open "Select * FROM " & Tabela & " WHERE IDFunc=" & IDFunc, cn

'Em caso de erro continuar execuo


On Error Resume Next
With rs
' A caixa de texto para o telefone igual ao campo "FoneRes" no BD
frmBD.txtFone = .Fields("FoneRes")

' A caixa de texto para o nome igual a concatenao dos campos


' "PrimeiroNome" e "Sobrenome" (incluindo um espao entre os dois)
frmBD.txtNome = .Fields("Ttulo") & " " & .Fields("PrimeiroNome") _
& " " & .Fields("Sobrenome")

' A mesma coisa para a caixa na segunda pgina do MultiPage


frmBD.txtNome2 = .Fields("Ttulo") & " " & .Fields("PrimeiroNome") _
& " " & .Fields("Sobrenome")

' A caixa de texto para o ramal igual ao campo "Ramal" no BD


frmBD.txtRamal = .Fields("Ramal")

' A caixa de texto para o ID igual ao campo "IDFunc" no BD


frmBD.txtIDFunc = .Fields("IDFunc")

' A caixa de texto para o Cargo igual ao campo "Cargo" no BD


frmBD.txtCargo = .Fields("Cargo")

' A caixa de texto para as anotaes igual ao campo "Notas" no BD


frmBD.txtNotas = .Fields("Notas")

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 33

' Busca o texto referente a foto do funcionrio no BD e entra como


' argumento para o carregamento da foto. O "On Error Resume Next"
' direcionado a esta linha, pois se uma foto no for encontrada
' haver um erro nesta linha
frmBD.fotoFunc.Picture = LoadPicture(ThisWorkbook.Path _
& "\pics\" & .Fields("Foto"))
frmBD.fotoFunc2.Picture = LoadPicture(ThisWorkbook.Path _
& "\pics\" & .Fields("Foto"))
End With

'Fecha o conjunto de registros


rs.Close
'Limpa o conjunto da memria
Set rs = Nothing

'Fecha a conexo ao BD
cn.Close
'Limpa a conexo da memria
Set cn = Nothing
End Sub

Terminado esta ltima rotina voc est pronto para rodar o seu formulrio. A nossa prxima para
como atualizar o banco de dados utilizando o mesmo modelo.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
34 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

8. Como atualizar o banco de dados central a partir do formulrio


A primeira parte mostra como carregar os dados de um banco de dados para os controles do
formulrio. A nossa parada agora como atualizar informaes no banco de dados.

O nosso banco de dados possui mais campos do que o nosso formulrio possui de controle,
contudo, deixo a adio de novos controles por conta do leitor. Isso forar voc, leitor, a criar
novas possibilidades em cima deste exerccio.

Aqui, utilizaremos o mesmo formulrio com a mesma conexo anterior, mas faremos algumas
pequenas alteraes para podermos efetuar as atualizaes no banco de dados.

Quando falamos em atualizar um banco de dados precisamos distinguir entre inserir um registro
novo e atualizar um registro existente. No caso que estudaremos, abordarei o segundo caso, pois
no primeiro mdulo sobre formulrios toquei no assunto de insero de registro.

Para atualizar um registro existente ns utilizamos o mtodo Execute de nossa conexo ao


banco de dados. Para que o mtodo funcione, precisamos montar a instruo SQL a ser
executada. Para facilitar a visualizao do problema quebrarei cada campo em uma linha no
cdigo e concatenarei cada instruo SQL.

Para completar o exerccio, adicione mais um boto ao formulrio como mostra a figura:

Figura 8-1

Ao boto Atualizar voc deve acrescentar o seguinte cdigo:

Sub atualizar()
geral ThisWorkbook.Path & "\BD\bd2.mdb", Val(frmBD.txtIDFunc), True
End Sub
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 35

Observe que continua chamar pela mesma rotina do tpico anterior. Contudo, esta rotina agora
contm mais um argumento. Este ltimo argumento booleano e recebe os valores True
(verdadeiro) ou False (Falso). Se o valor True, ento, estamos atualizando o banco de dados.
Se o argumento False, ento, estamos apenas lendo o banco de dados.

Ao passarmos este novo argumento estamos reduzindo o volume de cdigo e rotinas necessrias.

O que precisamos fazer agora distinguir o verdadeiro do falso para saber o que deve ser
executado. Como o cdigo baseado no tpico anterior somente as partes novas estaro
comentadas:

Sub geral(nomeBD As String, IDFunc As Long, atualizar As Boolean)

Set cn = New ADODB.Connection


cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & nomeBD & ";"

Set rs = New ADODB.Recordset

On Error Resume Next


' Se (IF) no (NOT) for atualizar, ento (THEN)
If Not atualizar Then
rs.Open "Select * FROM " & Tabela & " WHERE IDFunc=" & IDFunc, cn
With rs
frmBD.txtFone = .Fields("FoneRes")
frmBD.txtNome = .Fields("Ttulo") & " " & .Fields("PrimeiroNome") _
& " " & .Fields("Sobrenome")
frmBD.txtNome2 = frmBD.txtNome
frmBD.txtRamal = .Fields("Ramal")
frmBD.txtIDFunc = .Fields("IDFunc")
frmBD.txtCargo = .Fields("Cargo")
frmBD.txtNotas = .Fields("Notas")
frmBD.fotoFunc.Picture = LoadPicture _
(ThisWorkbook.Path & "\pics\" & .Fields("Foto"))
frmBD.fotoFunc2.Picture = LoadPicture _
(ThisWorkbook.Path & "\pics\" & .Fields("Foto"))
End With
' Caso contrrio (se for atualizar)
Else:

' Separa o nome nos componentes "Ttulo", "Primeiro nome" e "Sobrenome"


' A funo Split somente funciona a partir do Excel XP
nome = Split(frmBD.txtNome, " ")

' Inicia a construo da instruo SQL:


' Atualizar (UPDATE) Tabela e definir (SET) Cargo= frmBD.txtCargo ...
Sql = "UPDATE " & Tabela & " SET Cargo='" & frmBD.txtCargo & "'"
Sql = Sql & ", Ttulo='" & nome(0) & "'"
Sql = Sql & ", PrimeiroNome='" & nome(1) & "'"
Sql = Sql & ", Sobrenome='" & nome(2) & "'"
Sql = Sql & ", Ramal='" & frmBD.txtRamal & "'"
Sql = Sql & ", Notas='" & frmBD.txtNotas & "'"
Sql = Sql & ", FoneRes='" & frmBD.txtFone & "'"
' Onde (WHERE) IDFunc= IDFunc
Sql = Sql & " WHERE IDFunc=" & IDFunc

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
36 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

' Executar instruo SQL


cn.Execute Sql

End If

rs.Close
Set rs = Nothing

cn.Close
Set cn = Nothing

End Sub

Se voc utilizar uma verso anterior ao Excel XP a funo Split no cdigo no funcionar.
Observe tambm que a funo utiliza um espao para quebrar o texto em partes, portanto, sem o
espao a separao ser errada. Alm disso, no exemplo, estou assumindo apenas trs partes.
Se o nome for composto por primeiro nome, nome do meio e sobrenome a ltima parte
(sobrenome) ser omitida.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 37

9. Removendo/adicionando informaes no banco de dados e criando


um sistema de navegao de registros
Este captulo dedicado a adio e remoo de dados no banco de dados.

Se voc removeu e adicionou um item ao banco de dados anterior e tentou utilizar o sistema de
navegao voc certamente encontrou um erro. O cdigo anterior assume que no haver
insero ou remoo de registro no cdigo e funcionar muito bem se isso for verdade.

Porm, nesta parte o cdigo anterior no nos serve para muito. As partes comuns sero
reutilizadas, mas somente isso.

Um outro problema que se um campo encontra-se vazio no banco de dados, voc notar que o
valor na caixa de texto permanece o mesmo valor que o funcionrio anterior na hora que
navegamos pelos registros.

O primeiro passo remontar o nosso formulrio. Copie o formulrio do projeto anterior (salve a
pasta de trabalho com um nome diferente). Modifique o formulrio como segue:

Figura 9-1

O que precisaremos fazer:

Corrigir a navegao

Inserir um boto para criar um registro novo

Inserir um boto para excluir um registro

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
38 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Corrigir o problema de texto de outro registro misturado com outros registros durante a
navegao

Iniciamos pelo cdigo no formulrio. As explicaes so colocadas no cdigo:

Private Sub cmdAtualizar_Click()


' chama a rotina para atualizao
Call atualizar(CLng(txtIDFunc))
End Sub

Private Sub cmdAvanar_Click()


' Guarda o nmero do registro do funcionrio
IDFunc = CLng(txtIDFunc)
' Chama a rotina para limpar os controles textbox
Call limpar
' Chama a rotina que carrega o prximo registro
Call prximo(IDFunc)
End Sub

Private Sub cmdVoltar_Click()


' Guarda o nmero do registro do funcionrio
IDFunc = CLng(txtIDFunc)
' Chama a rotina para limpar os controles textbox
Call limpar
' Chama a rotina que carrega o registro anterior
Call anterior(IDFunc)
End Sub

Private Sub cmdNovo_Click()


' Guarda o nmero do registro do funcionrio
IDFunc = CLng(txtIDFunc)
' Verificar o rtulo atual do boto
' Se o rtulo for "Novo", ento
If cmdNovo.Caption = "Novo" Then
' Chamar a rotina limpar
Call limpar
' Muda o rtulo do boto para "Inserir"
cmdNovo.Caption = "Inserir"
' Avisa o usurio o que ele deve fazer
MsgBox "Digite os dados e clique 'Inserir' para continuar", _
vbInformation + vbOKOnly
Else:
' Se o rtulo do boto no for "Novo", ento
' Verificar se todas as caixas de texto foram preenchidas, seno
If Not preenchido Then
' avisar o usurio que ele deve preench-las
MsgBox "Preencha todos os campos antes de continuar.", _
vbInformation + vbOKOnly
' Sair da rotina
Exit Sub
End If
' Se todos os dados foram preenchidos, chamar a rotina "geral"
' A rotina "geral" recebe 5 argumentos: "nome do BD",
' "ID do Funcionrio",
' "atualizar", "excluir" e "novo".
' Se "atualizar" for verdadeiro, ento "excluir"
' e novo so ignorados.
' A mesma lgica segue para os argumentos "excluir" e "novo"
Call geral(ThisWorkbook.Path & "\BD\bd3.mdb", IDFunc, _
False, False, True)
' Passa o rtulo do boto para o valor original, isto , "Novo"
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 39

cmdNovo.Caption = "Novo"
End If
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
40 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Private Sub cmdExcluir_Click()


' Verificar com o usurio se ele realmente deseja excluir o registro
resposta = MsgBox("Voc deseja realmente excluir este registro?" _
& " A excluso no pode ser desfeita!", _
vbQuestion + vbYesNo, "Excluir registro...")

' Se ele apertou o boto por engano e no confirma a excluso, ento


' sair da rotina
If Not resposta = vbYes Then Exit Sub

' Se for confirmada a excluso, chama a rotina excluir


' A rotina excluir recebe um argumento que o nmero serial
' do funcionrio
Call excluir(CLng(txtIDFunc))

End Sub

Private Sub cmdFechar_Click()


' Fecha o formulrio
Unload Me
End Sub

Private Sub MultiPage1_Change()


' Define a caixa de texto 2 como sendo igual a caixa de texto 1
txtNome2.Text = txtNome.Text
End Sub

Private Sub UserForm_Initialize()


' Inicia o MultiPage sempre na primeira pgina
MultiPage1.Value = 0
' Chama a sub-rotina para carregar os dados
Call carregarInfo
End Sub

Private Sub limpar()


' Dimensiona o controle
Dim ctl As Control
' Procura pelos controles que contm um "tag"
' igual a "txt". Veja a propriedade Tag das
' caixas de texto.
' Para cada (For Each) controle (ctl)
' nos controles do formulrio (Me.Controls)
For Each ctl In Me.Controls
' Se o tag (If ctl.Tag) for igual a "txt", ento
If ctl.Tag = "txt" Then
' o texto do controle (ctl.Text = "")
ctl.Text = ""
' Fecha IF
End If
' Prximo controle
Next
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 41

Private Function preenchido() As Boolean

' Dimensiona o controle


Dim ctl As Control

' Assume que todos os controles esto preenchidos e,


' portanto , verdadeiro
preenchido = True

' Para cada (For Each) controle (ctl)


' nos controles do formulrio (Me.Controls)
For Each ctl In Me.Controls
' Se o tag (If ctl.Tag) for igual a "txt", ento
If ctl.Tag = "txt" Then
' Se (If) o comprimento do texto do controle (Len(ctl.Texto)
' for zero, ento
If Len(ctl.Text) = 0 Then
' nem todos os controles no foram preenchidos
' E a funo retorna falso (False)
preenchido = False
Exit Function
End If
End If
Next
End Function

O boto de atualizar no possui um teste para saber se o usurio realmente deseja atualizar os
dados. Voc pode adaptar esta pequena rotina utilizando o mtodo da rotina de excluso de
registro.

O nosso prximo passo montar o cdigo no mdulo. No novo mdulo inicie pela declarao das
variveis:

Public Const Tabela As String = "funcionrios"


Public Const IDInicial As Byte = 1

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim nomeBD As String
Dim IDFunc As Long

A seguir, ns construiremos as rotinas que so chamadas pelo formulrio. Como as rotinas


possuem pontos em comum, a parte a seguir deixar claro o uso dos argumentos falsos e
verdadeiros colocados nas rotinas.

Iniciarei pelas rotinas gerais as quais dispensam comentrios:

Sub carregarInfo()
moverRegistro ThisWorkbook.Path & "\BD\bd3.mdb", IDInicial, True, False
End Sub

Sub prximo(ByVal IDFunc As Long)


moverRegistro ThisWorkbook.Path & "\BD\bd3.mdb", IDFunc, False, False
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
42 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Sub anterior(ByVal IDFunc As Long)


moverRegistro ThisWorkbook.Path & "\BD\bd3.mdb", IDFunc, False, True
End Sub
Sub excluir(ByVal IDFunc As Long)
geral ThisWorkbook.Path & "\BD\bd3.mdb", IDFunc, False, True, False
End Sub

Sub atualizar(ByVal IDFunc As Long)


geral ThisWorkbook.Path & "\BD\bd3.mdb", IDFunc, True, False, False
End Sub

Quando lemos, inserimos, atualizamos ou exclumos registros algumas partes so comuns a


todas as rotinas acima. Desta forma, ao invs de criar uma rotina para cada uma ns criamos uma
rotina geral que recebe os argumentos que necessitados. Esta rotina avaliar se o que deve ser
feito excluir, adicionar ou atualizar um registro e isto feito pelos argumentos True e False que
so passados pelas rotinas acima para a rotina geral.

Sub geral(nomeBD As String, ByVal IDFunc As Long, atualizar As Boolean, _


excluir As Boolean, novo As Boolean)

Set cn = New ADODB.Connection


cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & nomeBD & ";"

Set rs = New ADODB.Recordset

On Error Resume Next

' Separa o nome nos componentes "Ttulo", "Primeiro nome" e "Sobrenome"


' A funo Split somente funciona a partir do Excel XP
nome = Split(frmBD.txtNome, " ")

If atualizar = True And excluir = False And novo = False Then

' Inicia a construo da instruo SQL:


' Atualizar (UPDATE) Tabela e definir (SET) Cargo= frmBD.txtCargo ...
Sql = "UPDATE " & Tabela & " SET Cargo='" & frmBD.txtCargo & "'"
Sql = Sql & ", Ttulo='" & nome(0) & "'"
Sql = Sql & ", PrimeiroNome='" & nome(1) & "'"
Sql = Sql & ", Sobrenome='" & nome(2) & "'"
Sql = Sql & ", Ramal='" & frmBD.txtRamal & "'"
Sql = Sql & ", Notas='" & frmBD.txtNotas & "'"
Sql = Sql & ", FoneRes='" & frmBD.txtFone & "'"
' Onde (WHERE) IDFunc= IDFunc
Sql = Sql & " WHERE IDFunc=" & IDFunc
' Executar instruo
cn.Execute Sql

' Se a condio acima no for verdadeira, ento avaliar esta


' condio. Se esta condio for verdadeira, ento, remover
' registro atual
ElseIf atualizar = False And excluir = True And novo = False Then
' String SQL usada no mtodo Execute da conexo
Sql = "DELETE * FROM " & Tabela & " WHERE IDFunc=" & IDFunc
' Executar o comando SQL
cn.Execute Sql
' Recarregar as informaes do formulrio
Call carregarInfo

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 43

' Se a condio acima no for verdadeira, ento avaliar esta


' condio. Se esta condio for verdadeira, ento, adicionar
' registro.
ElseIf atualizar = False And excluir = False And novo = True Then
With rs
.Open Tabela, cn, adOpenKeyset, adLockOptimistic, adCmdTable
.AddNew
.Fields("Sobrenome") = nome(2)
.Fields("PrimeiroNome") = nome(1)
.Fields("Ttulo") = nome(0)
.Fields("FoneRes") = frmBD.txtFone
.Fields("Ramal") = frmBD.txtRamal
.Fields("Cargo") = frmBD.txtCargo
.Fields("Notas") = frmBD.txtNotas
.Update
End With
Call carregarInfo
End If

rs.Close
Set rs = Nothing

cn.Close
Set cn = Nothing

End Sub

Nas instrues SQL apresentadas no cdigo acima importante observar:

Espaamento. Se voc observar a situao Sql = "DELETE * FROM " & Tabela &
"WHERE IDFunc=" onde "WHERE IDFunc=" no possui um espaamento entre as
aspas e WHERE, haver um erro, pois a palavra WHERE estar colada no nome da
tabela;

Na instruo de atualizao (UPDATE) voc deve ter notado o pequeno apstrofo. O


apstrofo utilizado para separar o argumento a ser atualizado do campo onde a
atualizao ocorrer;

O nmero referente a chave primria do funcionrio (IDFunc) no deve ser envelopada


por apstrofo como na observao anterior. Se isso for feito ocorrer um erro e os dados
no podero ser atualizados, porque o tipo de dado passado pela instruo diferente do
contido no banco de dados

Feitas as ressalvas acima, estamos prontos para passar para a segunda parte do problema. Voc
deve ter observado que ao remover um registro do banco de dados o sistema de navegao pelos
registros falha. Ele falha por partir do pressuposto que a numerao serial, contnua, bastando
apenas adicionar/subtrair 1 ao/do nmero serial atual.

Infelizmente, este nem sempre ser o caso e precisamos encontrar um outra soluo para o
nosso problema. Quando criamos o objeto recordset ele nos d vrias propriedades e mtodos.

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
44 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Dos mtodos, quatro so cruciais quando movemos dentro de um conjunto de registros


(recordset). Estes mtodos so MoveFirst (ir para o primeiro registro) MoveLast (ir para o
ltimo registro), MoveNext (ir para o prximo registro) e MovePrevious (ir para o registro
anterior). O problema que encontramos com os mtodos acima que no caso do nosso
formulrio, uma vez que os dados foram carregados, no mais sabemos qual o registro atual alm
do nmero serial (chave primria) do usurio.

Portanto, teremos que usar este nmero serial para nos guiar dentro dos registros. Para fazer
isso, utilizaremos um loop para mover os registros at que o nmero serial no banco de dados
seja igual ao nmero serial no formulrio. Este ser o registro atual. A partir da basta mover para
frente ou para trs utilizando os mtodos MoveNext e MovePrevious.

Com os devidos comentrios feitos, podemos partir para o nosso cdigo. Todas as instrues
esto contidas no cdigo:

Sub moverRegistro(nomeBD As String, IDFunc As Long, iniciar As Boolean, _


prximo As Boolean)

Set cn = New ADODB.Connection


cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & nomeBD & ";"

Set rs = New ADODB.Recordset

With rs
'Se a chama a esta rotina foi a inicial, ento
If iniciar = True Then
' Define o tipo de cursor a ser utilizado
.CursorType = adOpenKeyset
' Abre os registro
.Open "Select * FROM " & Tabela, cn
' Se no for o incio do arquivo...
If Not .BOF Then
' ...mover para o primeiro registro
.MoveFirst
End If
' Ir para "Cont" (continuao)
GoTo Cont
End If

' Define o tipo de cursor a ser utilizado


' Por padro o cursor zero. Utilize cursor 1
' (adOpenKeyset) para poder utilizar o mtodo
' MovePrevious. O mtodo MovePrevious no pode ser
' utilizado com o cursor 0 (adOpenForwardOnly).
.CursorType = adOpenKeyset
.Open "Select * FROM " & Tabela, cn

' Mover para o prximo registro at que o IDFunc


' no registro seja igual ao valor no formulrio
Do Until .Fields.Item("IDFunc") = IDFunc
' Quando os dois valores forem iguais,
' o loop termina e a condio If abaixo avaliada
.MoveNext
Loop

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 45

' Se for para mover para o prximo registro


' (observe que o argumento "prximo" passado como false,
' neste caso If Not prximo, passa o argumento para True e
' a linha abaixo pode ser lida como If prximo = True)
If Not prximo Then
' Move um registro para frente a partir do registro atual
.MoveNext
' Se for o ltimo registro, ento...
If .EOF = True Then
' ...avisar o usurio e...
MsgBox "Este o ltimo registro! O primeiro registro " _
& "ser mostrado", _
vbInformation + vbOKOnly, "ltimo registro..."
' ... mover para o primeiro registro.
.MoveFirst
End If
' Se no for para mover para o prximo registro, ento...
Else:
' ...mover para o registro anterior...
.MovePrevious
' Se for o primeiro do registro, ento...
If .BOF = True Then
' ...avisar o usurio e...
MsgBox "Este o primeiro registro! O ltimo registro " _
& "ser mostrado", _
vbInformation + vbOKOnly, "ltimo registro..."
' ... mover para o ltimo registro.
.MoveLast
End If
End If

'Atualiza os valores no formulrio


Cont:
On Error Resume Next
frmBD.txtFone = .Fields("FoneRes")
frmBD.txtNome = .Fields("Ttulo") & " " & .Fields("PrimeiroNome") _
& " " & .Fields("Sobrenome")
frmBD.txtNome2 = frmBD.txtNome
frmBD.txtRamal = .Fields("Ramal")
frmBD.txtIDFunc = .Fields("IDFunc")
frmBD.txtCargo = .Fields("Cargo")
frmBD.txtNotas = .Fields("Notas")
frmBD.fotoFunc.Picture = LoadPicture(ThisWorkbook.Path _
& "\pics\" & .Fields("Foto"))
frmBD.fotoFunc2.Picture = LoadPicture(ThisWorkbook.Path _
& "\pics\" & .Fields("Foto"))
End With

End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
46 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

10. Criando uma mini prova utilizando um sistema de navegao


O prximo exemplo mostra como criar uma mini prova utilizando um sistema de navegao com
um MultiPage.

Existem vrias formas de se levar a cabo tal proposio, porm, aqui farei esta combinao para
demonstrar como o sistema de navegao pode ser utilizado para diversas finalidades.

Esta parte ser bem curta, pois tudo que necessitamos j foi desenvolvido anteriormente. Estarei
apenas mostrando como se colocar em prtica o que foi ensinado.

Para iniciar, podemos colocar as perguntas e respostas na planilha ou digit-las diretamente no


formulrio. Digitaremos as perguntas diretamente no formulrio e as respostas na planilha.
Primeiramente, iremos criar esta planilha contendo as informaes que precisaremos. O formato
geral ser:

Figura 10-1

No intervalo A1:A4 encontra-se a letra da resposta correta em nosso formulrio. No intervalo


C1:C4 colocaremos as respostas do usurio. O percentual de acerto a proporo dos acertos
em relao ao nmero de perguntas e calculado na clula C6. O intervalo E1:E5 refere-se ao
percentuais de acerto e F1:F5 contm o texto que ser mostrado aps a marcao da prova.

Com esta parte pronto, precisamos apenas construir o nosso formulrio que servir para prova. O
formulrio possui um MultiPage com quatro pginas e deve ter um visual similar a este:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 47

Figura 10-2

Para os botes Cancela, Voltar, Avanar e Concluir, ns utilizaremos os seguintes cdigos3:

Private Sub cmdCancelar_Click()


resp = MsgBox("Voc tem certeza que deseja cancelar?", _
vbYesNo + vbQuestion)
If resp = vbYes Then
Unload Me
End If
End Sub

Private Sub cmdAvanar_Click()


pageAssistente.Value = pageAssistente.Value + 1
chkControles
End Sub

Private Sub cmdVoltar_Click()


MultiPage1.Value = MultiPage1.Value - 1
chkPaginao
End Sub

3
Incluso no esquema tambm esto o cdigo de verificao de paginao.
Autor: Robert F Martim Criado em: 01/02/2005
Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
48 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Sub chkControles()

ndice = pageAssistente.Value
Fim = pageAssistente.Pages.Count - 1

Select Case ndice


Case 0
cmdVoltar.Enabled = False
cmdAvanar.Enabled = True

Case Fim
cmdVoltar.Enabled = True
cmdAvanar.Enabled = False
cmdConcluir.Enabled = True

Case Else
cmdVoltar.Enabled = True
cmdAvanar.Enabled = True
cmdConcluir.Enabled = False

End Select

frmAssistente.Caption = "Pgina " & ndice + 1 & " de " & Fim + 1

End Sub

Como sistema de navegao pronto, podemos partir para a soluo dos prximos problemas.
Primeiramente, precisamos nos atentar para a planilha onde colocaremos as respostas que o
usurio der.

A propriedade Visible ser passada para xlSheetVeryHidden para evitar acesso pelo usurio.
Porm, precisamos lembrar que os dados so inseridos nesta planilha, portanto, precisamos de
uma varivel que representa a nossa planilha. Fora de qualquer procedimento dentro do
formulrio entraremos a seguinte linha de cdigo (no topo da janela de cdigo):

Dim ws As Worksheet

A varivel ws refere-se a uma planilha qualquer. O nosso prximo trabalho instanciar esta
varivel como sendo a planilha que contm os dados que utilizaremos e na qual escreveremos as
respostas do usurio:

Private Sub UserForm_Activate()


'"Seta" a planilha correspondente s respostas
Set ws = ThisWorkbook.Sheets("Respostas")

'Vai para a primeira pgina do assistente


pageAssistente.Value = 0

'checa os controles
chkControles

'Limpa a rea contendo as respostas


ws.Range("C1:C4").Clear
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 49

Cada boto de opo tem um valor prprio que passado para a planilha conforme o clique de
quem est fazendo a prova:

'Passa os valores de cada boto de opo para


'a planilha dos resultados
Private Sub optQ1A_Click()
ws.Range("C1") = 0
End Sub

Private Sub optQ1B_Click()


ws.Range("C1") = 0
End Sub

Private Sub optQ1C_Click()


ws.Range("C1") = 1
End Sub

Private Sub optQ1D_Click()


ws.Range("C1") = 0
End Sub

Private Sub optQ2A_Click()


ws.Range("C2") = 0
End Sub

Private Sub optQ2B_Click()


ws.Range("C2") = 1
End Sub

Private Sub optQ2C_Click()


ws.Range("C2") = 0
End Sub

Private Sub optQ2D_Click()


ws.Range("C2") = 0
End Sub

Private Sub optQ3A_Click()


ws.Range("C3") = 0
End Sub

Private Sub optQ3B_Click()


ws.Range("C3") = 0
End Sub

Private Sub optQ3C_Click()


ws.Range("C3") = 0
End Sub

Private Sub optQ3D_Click()


ws.Range("C3") = 1
End Sub

Private Sub optQ4A_Click()


ws.Range("C4") = 0
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
50 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Private Sub optQ4B_Click()


ws.Range("C4") = 1
End Sub

Private Sub optQ4C_Click()


ws.Range("C4") = 0
End Sub

Private Sub optQ4D_Click()


ws.Range("C4") = 0
End Sub

O ltimo passo o cdigo para o boto de concluso da prova:

Private Sub cmdConcluir_Click()

j = 0
'Faz um loop pelas clulas que contm as respostas
For i = 1 To 4
'Se no houver resposta
If ws.Cells(i, 3) = "" Then
'ento, compile as perguntas no respondidas
txt = txt & i & ", "
j = j + 1
End If
Next

'Se a varivel j > 0


If j > 0 Then
'ento, h perguntas no respondidas
resposta = MsgBox("Voc no respondeu a(s) pergunta(s): " & _
txt & "voc realmente deseja marcar a prova?", _
vbYesNo + vbQuestion)
'Se o aluno no deseja terminar, sair da Sub-rotina
'e continuar prova
If resposta = vbNo Then Exit Sub
End If

'Resultado em percentuais
res = Format(ws.Range("C6"), "Percent")

'Procura o tipo de parabenizao para mostrar ao aluno.


txt = WorksheetFunction.VLookup(ws.Range("C6"), ws.Range("E1:F5"), 2, 0)

'Mostra ao aluno uma mensagem com o percentual de acerto


MsgBox "Voce acertou " & res & " da prova! " & txt, vbInformation

'Descarrega o formulrio
Unload Me

End Sub

Ao concluir a prova o aluno recebe sua nota final atravs de uma caixa de mensagens:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 51

Figura 10-3 Resultado final da prova

No meu caso, no fui muito bem na prova, tendo um aproveitamento igual a zero!

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
52 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

11. Criando um formulrio em diferentes idiomas em tempo de


execuo
Se voc alguma vez desenvolveu algo para usurios que falam diferentes idiomas, voc deve ter
esbarrado no problema da criao de um projeto multi-idiomas.

Obviamente que o pr-requisito da criao de um projeto em vrios idiomas o conhecimento dos


idiomas em questo. Sem isso, no temos como continuar! Ou ser que temos? Hoje, com as
facilidades proporcionadas pela tecnologia, ns podemos utilizar tradutores eletrnicos para
resolver nosso problema.

Como estamos interessados em saber apenas palavras-chave, tradutores eletrnicos resolvem


bem o nosso caso. No exemplo que darei, ser criado um formulrio em trs idiomas: Portugus,
Ingls e Alemo. Para referncia do leitor, as tradues para o Alemo foram feitas no site
http://www.worldlingo.com/en/products_services/worldlingo_translator.html.

O que ser necessrio para este exerccio:

Criar um banco de dados no Access contendo uma tabela e os seguintes campos:

o Nome do controle

o Portugus

o Ingls

o Alemo

Um formulrio no Excel

O campo para o nome do controle conter o nome de cada controle que contm um caption em
nosso formulrio. Os nomes entrados neste campo devem ser exatamente iguais aos nomes dos
controles no formulrio.

Ao lado de cada nome conter a traduo do caption do controle como mostra a figura abaixo:

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 53

Figura 11-1

No banco de dados que acompanha este mdulo h tambm o campo cdItem, como mostra a
figura acima. Este campo desnecessrio ao nosso exerccio. Eu apenas o acrescento por fora
de hbito, pois chaves-primrias so vitais em bancos de dados.

A construo do layout geral do formulrio fica a critrio do leitor. O formulrio que utilizarei feito
sobre um MultiPage. A primeira pgina do MultiPage contm os idiomas disponveis:

Figura 11-2

As tabulaes do MultiPage so removidas para deixar o visual geral mais belo.

Observe que a grande vantagem deste sistema que os recursos so externos. Se voc precisa
inserir mais controles e necessita de mais tradues, no h porque esquentar a cabea. Os
dados inseridos no banco de dados independem de ordem. Tudo que precisamos entrar o nome

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
54 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

do controle no banco de dados e a respectiva traduo. No precisamos nem modificar o caption


padro do controle (ou at mesmo o nome, se voc desejar).

O idioma padro o portugus e todos os rtulos (labels) j esto escritos em portugus. A


segunda pgina do MultiPage tem a seguinte aparncia e acessada pelo boto Prximo:

Figura 11-3

Com o layout geral pronto, podemos iniciar a escrita do cdigo. Antes de iniciar, porm,
necessrio instalar Microsoft ActiveX Data Object xx Library. Para instala-lo, no VBE,
v at Ferramentas Referncias e da lista que aparecer, procure pela referncia acima e
a instale.

Cdigo na Pasta de Trabalho

Private Sub Workbook_Open()


'Mostra o formulrio quando a planilha aberta
frmDB.Show
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 55

Cdigo no Formulrio

Private Sub UserForm_Activate()


'Seleciona a pgina inicial do MultiPage
MultiPage1.Value = 0
End Sub

Private Sub cmdProx_Click()


'Move para a segunda pgina do MultiPage
MultiPage1.Value = MultiPage1.Value + 1
End Sub

Private Sub imgBrasil_Click()


'Chama a sub-rotina para carregar as tradues
'A sub-rotina recebe 3 argumentos:path e nome BD, _
'nome da tabela e o idioma
traduzir ThisWorkbook.Path & "\BD\bd1.mdb", "ctlidiomas", _
"Portugues"
End Sub

Private Sub imgAle_Click()


'Chama a sub-rotina para carregar as tradues
'A sub-rotina recebe 3 argumentos:path e nome BD, _
'nome da tabela e o idioma
traduzir ThisWorkbook.Path & "\BD\bd1.mdb", "ctlidiomas", "Alemao"
End Sub

Private Sub imgEUA_Click()


'Chama a sub-rotina para carregar as tradues
'A sub-rotina recebe 3 argumentos:path e nome BD, _
'nome da tabela e o idioma
traduzir ThisWorkbook.Path & "\BD\bd1.mdb", "ctlidiomas", "Ingles"
End Sub

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
56 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Cdigo no Mdulo

Sub traduzir(nomeBD As String, Tabela As String, Idioma As String)

'Define a varivel (objeto) da conexo ao banco de dados


Dim conn As ADODB.Connection

'Define a varivel (objeto) do conjunto de registros


Dim rs As ADODB.Recordset

'Define o controle (objeto) a ser traduzido


Dim ctl As Control

'Cria a conexo
Set conn = New ADODB.Connection

'Abre a conexo utilizando o "Driver" correto e nome do BD


'passado como parmetro para esta sub-rotina
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & nomeBD & ";"

'Cria o conjunto de registros (recordset)


Set rs = New ADODB.Recordset

'Abre o conjunto de registros da tabela passada


'como parmetro para esta sub-rotina
rs.Open "Select * FROM " & Tabela, conn

'Faz o loop para cada controle no formulrio


For Each ctl In frmDB.Controls

'Move para o primeiro registro do BD


rs.MoveFirst
'Em caso de erro, a sub-rotina continua
'a execuo do cdigo
On Error Resume Next
'Verifica se o "caption" no est vazio
If ctl.Caption <> "" Then
'Se no estiver, ento inicia o processo
'de traduo
With rs
'Faz um loop enquando nao chegar ao
'fim do recordset (EOF=End of File)
'End of File = Fim do Arquivo
While Not .EOF
'Compara o nome do controle com o
'nome no banco de dados
If ctl.Name = .Fields("NomeCtl") Then
'Se nomes so iguais; ento, traduz
ctl.Caption = .Fields(Idioma)
'E sai do loop para evitar perda
'de tempo com excesso de loop
GoTo cont
End If
'Move para o prximo registro
.MoveNext
Wend
End With
End If
cont:
Next

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 57

'Fecha o conjunto de registros


rs.Close
'Limpa o conjunto da memria
Set rs = Nothing

'Fecha a conexo ao BD
conn.Close
'Limpa a conexo da memria
Set conn = Nothing
End Sub

Agora, basta rodar o nosso pequeno aplicativo e selecionar o idioma desejado:

Figura 11-4 Portugus

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
58 Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip

Figura 11-5 Alemo

Figura 11-6 Ingls

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com
Srie Como Fazer: Formulrios no Excel Utilizando VBA: Multipage e TabStrip 59

12. Sobre o autor


Abaixo o leitor encontra um pequeno resumo do currculo e atividades do autor deste mdulo:

FORMAO ACADMICA:

Formado e Ps-Graduado em Finanas pela Universidade de Londres, Reino Unido


Membro da Sociedade Brasileira de Econometria

LINGUAGENS DE PROGRAMAO E PLATAFORMAS:

Visual Basic, Calculadores Programveis Casio e Sharp


BDs: MS Access and Lotus Approach
Plataformas: Windows NT, 2000, XP, Linux Red Hat

EXPERINCIA PROFISSIONAL

outubro 02- FAIRCOURT CAPITAL LIMITED (REINO UNIDO)


Diretor TI
fev96-maio02 MELVALE GROUP (REINO UNIDO)
Gerente de Exportao para a frica Ocidental
Gerente de TI

OUTRAS ESPECIALIZAES

Inspeo e regulamentaes Nigerianas para importao e exportao


(Nigerian-British Chamber of Commerce & Cotecna International)
Procedimentos de exportao no Reino Unido (The Institute of Export, Reino Unido)
ICC 500 e Incoterms (The Institute of Export, Reino Unido)

OUTRAS ATIVIDADES

Fornece suporte pro bono em TI entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora
Organisation Europe) desde 2001. Participou ativamente na organizao da conferncia sobre
Boa Governana e Responsabilidade Fiscal promovida pelo ONG em Abuja, Nigria, em
Novembro 2003. Foi um dos principais colaboradores na elaborao do relatrio final sobre a
conferncia entregue a presidncia da Repblica Nigeriana em maio de 2004.

Autor do livro Access e VBA na Modelagem Financeira: Uma abordagem prtica (no
prelo). Editora Axcel Books, 2005.

Colaborador ativo do frum Access Avanado do site www.juliobattisti.com.br, onde divide seu
conhecimento e experincia com outros membros do espao.

Colunista dos sites www.linhadecodigo.com.br e www.ativoaccess.com.br

Autor: Robert F Martim Criado em: 01/02/2005


Publicado: www.juliobattisti.com.br ltima edio: 22/3/2005 19:49:00
Contato: rm@faircourt.com