Você está na página 1de 0

Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00

Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00


Contato: r m@f ai r cour t . com


Srie Como Fazer











Formulrios no Excel Utilizando VBA:
Listbox e Combobox

Parte 1


por Robert Friedrick Martim
Srie Como Fazer: Criando menus, barras de comando e botes personalizados no Excel
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
i
Nota sobre direitos autorais
Este eBook de autoria de Robert F Martim, sendo comercializado atravs do site
www. j ul i obat t i st i . 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 esta com uma cpia pirata, no autorizada. Se for este o seu caso entre em
contato com o autor atravs do e-mail r m@f ai r cour t . com ou comunique diretamente ao nosso
site atravs do e-mail webmast er @j ul i obat t i st i . 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. j ul i obat t i st i . com. br para ficar por dentro das novidades!
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
ii
Pr-requisitos
Para completar este curso necessrio um conhecimento intermedirio de VBA, funes de
planilha (tais como PROCV) e estar familiarizado com os controles bsicos da caixa de
ferramentas do VBA tais como boto de comando (CommandBut t on), caixa de texto (Text Box) e
rtulo (Label ). Embora boa parte do material envolva VBA mais avanado um grande esforo foi
feito para que mesmo com um conhecimento mnimo, o leitor possa tirar grande proveito do
material.
Como este curso no tem por objetivo ensinar qualquer outra coisa a no ser l i st box e
combobox em formulrios utilizando VBA, qualquer outro controle utilizado no ter prioridade
nas explicaes. Entre os controles que aparecero no decorrer deste mdulo esto l abel
(rtulo), t ext box (caixa de texto), CommandButton (boto de comando) e Frame (moldura). O
mdulo vai do mais simples ao mais complexo estilo de l i st box e combobox que pode ter
diversas utilidades em seu trabalho dirio.
Como formulrios no param somente aqui, este assunto precisou ser dividido em partes onde
controles similares sero discutidos em conjunto.
Os leitores interessados podem adquirir o curso bsico de Excel em 120 lies no seguinte
endereo: www. j ul i obat t i st i . com. br / excel 120/ excel 120. asp que servir como trampolim
para um melhor aproveitamento e desenvolvimento deste mdulo.
Este curso pode ser adquirido em conjunto com outros cursos do CD04. Para maiores
informaes, visite www.juliobattisti.com.br ou envie um e-mail para
webmaster@juliobasttisti.com.br.
Srie Como Fazer: Criando menus, barras de comando e botes personalizados no Excel
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
iii
Objetivos deste eBook
Este eBook foi dividido em mdulos. Este mdulo visita a utilizao de listbox e combobox em
formulrio no Excel usando o Vi sual Basi c f or Appl i cat i on (VBA).
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


Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
iv
NDICE ANALTICO
Introduo........................................................................................................................................1
Bem-vindo a srie Como Fazer. ...........................................................................................1
Antes de continuar..................................................................................................................1
1. O que so listbox e combobox................................................................................................2
2. Viso geral dos controles........................................................................................................4
3. Adicionando itens....................................................................................................................7
4. Adicionando eventos.............................................................................................................12
5. Classificando itens em uma combobox e listbox..................................................................22
6. Adicionando itens nicos ......................................................................................................27
7. Passando itens entre listboxes .............................................................................................31
7.1. Movendo itens dentro de listboxes...............................................................................34
8. Conectando e interagindo com o MS Outlook ......................................................................38
9. Conectando e interagindo com o MS Access .......................................................................45
10. Sobre o autor ........................................................................................................................60


Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
1
SRIES: COMO FAZER
Formulrios no Excel Utilizando VBA:
Listbox e Combobox
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 J lio Battisti (http://www.juliobattisti.com.br). A inteno principal
fornecer ao internauta uma ferramenta que concentre a ateno na soluo de um problema
especfico.
Nesta srie estaremos vendo a criao de diversos listbox e combobox. Iremos utilizar
mtodos manuais e dinmicos para criar e manipular estes controles. Estaremos olhando os
elementos que compem estes dois controles e como podemos utiliz-los para nosso benefcio de
forma dinmica e eficiente.
Antes de continuar
O trabalho desenvolvido foi testado para compatibilidade com Excel 2002 e 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 do que foi dito na parte de
pr-requisito no incio deste mdulo. Sem o devido conhecimento de algumas partes bsicas 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 de forma proativa no
desenvolvimento do material aqui apresentado.
Finalmente, quando objetos e variveis so dimensionados nesta apostila utilizada a conveno
de dimensionamento dos objetos e variveis. Por exemplo, um boto dimensionado como Dim
btn.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
2
1. O que so listbox e combobox
Caixa de Combinao (ComboBox) e Caixa de Listagem (ListBox). Caixa de Combinao e
Caixa de Listagem so controles fornecidos atravs da "caixa de ferramentas de controle"
(Cont r ol s Tool box) do Vi sual Basi c f or Appl i cat i on (VBA) disponvel nos produtos
que compem o Microsoft Office.
Caixa de listagem, como o nome sugere, uma caixa contendo uma lista de itens. Estes itens
podem estar listados em uma ou mais colunas e conter diversas linhas, por exemplo. Dependendo
do tamanho da caixa de listagem vrios itens podem ser mostrados simultaneamente. Caso os
itens excedam o tamanho da caixa, barras de rolagem so disponibilizadas para que o usurio
possa navegar pelos itens.
Caixa de combinao (combobox -tambm referido como dr opdown l i st ) mostra,
diferentemente da caixa de listagem, apenas um item por vez. Para acessar os itens da lista
precisamos abrir a lista, como mostra a figura abaixo:

Figura 1-1
Cada um dos controles possui os seus nomes na figura acima.
Nesta figura, podemos ver uma utilidade destes controles. Vamos supor que para cada item da
combobox existe uma lista. E para cada item da lista exista uma descrio. O que faremos
construir o formulrio de forma que quando um item for selecionado na combobox os itens da lista
mudem para refletir esta mudana. Da mesma forma, criaremos cdigo para lidar com a seleo
de um item na listbox de forma que a l abel (rtulo) passe a descrio do item.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
3
Como o mdulo no se preocupar com formatos e layout de formulrio, o leitor deve estudar a
estrutura do formulrio acima antes de continuar.
Para todos os formulrios desenvolvidos ser boa prtica analisar a estrutura e cdigos antes de
continuar para uma melhor compreenso.
O formulrio acima pode ser acessado na planilha For m1. xl s.
O trabalho que desenvolveremos a seguir ser construdo em cima deste primeiro formulrio.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
4
2. Viso geral dos controles
Antes de nos aprofundarmos em combobox e listbox, precisamos passar por uma introduo
aos dois objetos (controles) que estaremos utilizando. Combobox e listbox so controles. Estes
dois controles possuem vrias propriedades e mtodos iguais; e cada um possui seus prprios
mtodos e propriedades distintas. A figura abaixo mostra algumas destas propriedades:

Figura 2-1
Algumas propriedades podem ser consideradas mais importantes do que outras, porm, cada
uma desempenha um papel na programao. Veja, por exemplo, a propriedade BoundCol umn.
Esta propriedade instrui o VBA a amarrar os dados a coluna um. Obviamente, ela no tem
nenhuma utilidade se temos apenas uma coluna (como na figura acima). Porm, ao modificarmos
a propriedade referente ao nmero de colunas (Col umnCount ), ela passa a ter significado.
A propriedade name outra de grande importncia. Muitas vezes fcil simplesmente aceitar o
nome sugerido; contudo, quando o nmero de controles aumenta se os nomes no tm um
significado alm de Li st Box ou Combobox, ficar difcil compreender o papel de cada um em
nosso cdigo. Como conveno, o nome de uma l i st box vem prefixada com l st e combobox
com cbo. O fato que no formulrio bvio quem quem, isto , o que uma combobox e uma
listbox. J no cdigo, sem o prefixo, pode ser complicado saber quem quem. Por exemplo, se
temos uma t ext box, uma l i st box e uma combobox em um formulrio, sem o prefixo, e o
nome do objeto t est e. No cdigo temos que t est e. t ext = t est e. Bom, sem o prefixo
precisamos ver quem o tal t est e, pois todos os trs controles possuem a propriedade t ext . Se
ao invs tivssemos t xt Test e. t ext = t est e, saberamos que o controle uma t ext box.
Pode parecer um detalhe e querer ser pedante, mas somente apreciamos a importncia destes
detalhes quando o volume de cdigo cresce.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
5
A propriedade Col umnHeads comumente utilizada em l i st boxes. Ela retorna o cabealho das
colunas, como mostra a figura:

Figura 2-2
Infelizmente, esta propriedade somente funciona com dados de um r ange na planilha. Quando os
dados so carregados atravs de loops ou mtodos dinmicos o cabealho fica em branco.
Portanto, se voc pretende utilizar cabealhos em seu projeto tenha isso em mente.
Uma propriedade que aparece na Figura 2-1 e que pode causar confuso a Cont r ol Sour ce.
Cont r ol Sour ce, diferentemente do que o nome pode sugerir, retorna o ndice do valor
selecionado. Como a l i st box uma matriz cuja base zero, o primeiro item selecionado na
matriz retorna um ndice igual a zero. Ao anexarmos este ndice a uma clula na planilha, esta
clula assume o ndice atual selecionado.
Continuando a descer, a propriedade Li st tem o formato de uma matriz-tabela. Em outras
palavras, se temos um conjunto de dados dentro de uma Ar r ay (tabela) os valores podem ser
descarregados de uma s vez para esta propriedade.
A seguir temos a propriedade Mul t i Sel ect . Esta propriedade permite a mltipla seleo de
itens em uma l i st box. Esta propriedade til quando desejamos passar itens de uma l i st box
para outra (ou para uma localidade qualquer) com um clique apenas.
Logo abaixo de Mul t i Sel ect vem a propriedade RowSour ce. RowSour ce indica a fonte de
dados que preencher a l i st box ou combobox. RowSour ce pode receber como argumentos
um r ange, ie A1:E10, um nome referente a um r ange, ou uma referncia a um range em uma
planilha qualquer.
RowSour ce funciona muito bem quando utilizamos nomes dinmicos. Caso contrrio, ficamos
presos ao tamanho da matriz que contm os dados.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
6
Alm do formato bsico, l i st box e combobox podem possuir botes de opo e caixas de
seleo. A diferena entre os dois est na propriedade Mul t i Sel ect . Se a propriedade for para
seleo simples, o boto ser de opo e se houver multi-seleo o boto ser de seleo. Este
estilo pode ser modificado na propriedade Li st St yl e.

Figura 2-3
Na figura acima, na primeira l i st box somente podemos selecionar um item por vez. Na segunda
l i st box, podemos selecionar um ou mais itens por vez (A pasta de trabalho contendo este
modelo pode ser acessada em For m1. 1. xl s)


Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
7
3. Adicionando itens
H diversas formas de se adicionar itens a combobox e l i st box. Estaremos vendo cada uma
destas formas separadamente. Quando as formas esto relacionadas, elas ficaro sob o mesmo
ttulo do tpico. Quando a construo for completamente diferente, elas sero tratadas sob ttulos
diferentes.
A maneira mais fcil de adicionar um item a uma combobox ou l i st box utilizar o mtodo
AddI t em:
Pr i vat e Sub User For m_Act i vat e( )
cbo. AddI t em" Adi ci onando i t ens a combobox"
l st . AddI t em" Adi ci onando i t ens a l i st box "
End Sub
Os itens acima so inseridos quando o User For m ativado (Act i vat e). Quando o formulrio
carregado os itens so adicionados (este formulrio est na pasta For m2. xl s):

Figura 3-1
Podemos adicionar quantos itens forem necessrios utilizando este mtodo, porm, como o leitor
reconhecer depois de algumas tentativas que adicionar uma lista no cdigo atravs deste
mtodo pode representar um problema se a lista for muito grande.
Para solucionar este problema podemos utilizar a propriedade RowSour ce para carregar os itens
(este formulrio est na pasta For m3. xl s). Esta propriedade pode ser resolvida de duas formas:
a) diretamente na caixa de propriedade do controle que desejamos alocar a lista (ie l i st box ou
combobox) e b) diretamente no cdigo onde fazemos a referncia ao controle. A figura abaixo
mostra como isso pode ser feito:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
8

Figura 3-2
Na figura acima, modificamos a propriedade RowSour ce do controle combobox para carregar os
itens contidos na planilha cboI t ens que se encontram nas clulas A1, A2 e A3 (no intervalo
A1: A3). Como l i st box e combobox tm esta propriedade em comum, se desejamos criar uma
lista para a l i st box, basta modificar a propriedade RowSour ce como feito acima.
A alternativa utilizar uma linha de comando para preencher a lista:
Pr i vat e Sub User For m_Act i vat e( )
Cbo. RowSour ce = " cboI t ens! A1: A3"
End Sub
Independentemente do mtodo utilizado o resultado o mesmo:

Figura 3-3
Alm do mtodo AddI t eme da propriedade RowSour ce, podemos utilizar a propriedade Li st
para obter o mesmo resultado. A propriedade List recebe uma matriz contendo todos os itens.
Estes itens so, ento, descarregados de uma s vez para o controle. Novamente, tanto a
l i st box quando a combobox compartilham esta propriedade e ambos so, portanto, carregados
da mesma forma.
Para que esse mtodo seja vivel precisamos construir a matriz contendo os dados. O exemplo a
seguir mostra como isso pode ser feito:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
9
Pr i vat e Sub User For m_Act i vat e( )
Di mws As Wor ksheet
Di mmat r i z( )

Set ws = Thi sWor kbook. Sheet s( " l st I t ens" )
l t i maLi nha = ws. Range( " A65536" ) . End( xl Up) . Row

ReDi mmat r i z( l t i maLi nha)

Wi t h ws
For i = 0 To l t i maLi nha - 1
mat r i z( i ) = . Cel l s( i + 1, 1)
Next
End Wi t h

l st . Li st = mat r i z
End Sub
Primeiramente, precisamos dizer ao programa onde os dados esto. Assim como no RowSour ce
dizemos que os dados esto na planilha cboI t ens, aqui definimos a planilha como sendo
l st I t ens. Se isso no for feito o programa carregar as linhas da planilha que estiver ativa
quando chamamos o formulrio.
A definio da matriz deixada em aberto, isto mat r i z( ) , porque no sabemos quantos itens
sero carregados. Aps descobrimos qual a ltima linha (l t i maLi nha =
ws. Range( " A65536" ) . End( xl Up) . Row) redimensionamos a matriz (ReDi m
mat r i z( l t i maLi nha) ).
A partir da criamos o loop que preencher a matriz com as informaes que desejamos e
finalmente preenchemos a l i st box (l st . Li st = mat r i z).
O processo pode parecer complicado, mas no . Na verdade, o processo representa uma grande
vantagem sobre o RowSour ce ou AddI t em. Observe que se a lista aumentar ou diminuir,
precisamos modificar a propriedade RowSour ce para levar isso em conta. J com o mtodo
AddI t emprecisamos remover/adicionar diretamente no cdigo. Contudo, o mtodo utilizando a
matriz no apresenta este problema.
Se uma linha adicionada ou removida, no importa. Ao localizar a ltima linha no vazia, sempre
teremos o nmero correto de itens em nossa combobox ou l i st box no redimensionamento da
matriz.
Alm disso, podemos preencher a l i st box e combobox simultaneamente, bastando apenas
criar uma matriz para a combobox e uma para l i st box.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
10
Os itens carregados por este mtodo:

Figura 3-4
Se a criao do cdigo uma dor de cabea para voc, ainda h uma soluo atravs de
frmulas da planilha combinada com RowSour ce.
Para isso, precisamos criar um nome dinmico para a rea que representar nosso RowSour ce.
Utilizaremos uma combinao das funes Desl oc e Cont . Val or es para criar esta frmula
mgica. Vamos supor que o RowSour ce esteja na planilha cboItens na coluna A. Selecione uma
clula qualquer na coluna A e v at Nomes Def i ni r . D um nome qualquer sua rea de
dados e para a rea contendo os dados entre a seguinte frmula:
=DESLOC( cboI t ens! $A$1, 0, 0, CONT. VALORES( cboI t ens! $A: $A) , 1)
A figura abaixo mostra como isso feito:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
11

Figura 3-5
Observe que no desejamos um deslocamento lateral, apenas vertical. A funo
Cont . Val or es( ) define este tamanho vertical. No ltimo argumento da funo podemos definir
a largura da matriz retornada pela funo DESLOC. Por exemplo, se desejamos uma matriz com
quatro colunas, basta modificar o nmero 1 para 4
1
.
Agora, precisamos modificar o cdigo. Na linha referente ao RowSour ce o definimos como:
Pr i vat e Sub User For m_Act i vat e( )
Cbo. RowSour ce = " cbot I t em"
End Sub
Com a utilizao das funes Desl oc e Cont . Val or es quando itens so acrescentados o nome
automaticamente atualizado para incluir ou excluir valores na coluna A. Se o usurio acrescenta
um item ele adicionado ao RowSour ce e se um item removido no nome este item removido
do RowSour ce.
A beleza deste mtodo que no mais precisamos nos preocupar com o RowSour ce e o cdigo
fica bem mais leve com uma linha de cdigo apenas.
Este exemplo encontra-se na pasta de trabalho For m3. xl s.
Partimos, agora, para a criao de eventos.

1
Ao modificar o nmero de colunas no nome, no esquecer de modificar a propriedade ColumnCount para o nmero
de colunas desejadas.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
12
4. Adicionando eventos
At agora vimos o que so e como preencher estes dois controles. Nesta parte estamos
interessados em controlar os eventos destes controles. Os cdigos desenvolvidos nesta parte
podem ser acessados na pasta de trabalho For m4. xl s. Esta pasta de trabalho contm 3
planilhas, cujas guias so mostradas abaixo:

Figura 4-1
A inteno utilizar estas guias para preencher a combobox. Para fazer isso bem simples:
Pr i vat e Sub User For m_Act i vat e( )
Di mws As Wor ksheet
Di mwb As Wor kbook

Set wb = Thi sWor kbook

For Each ws I n wb. Sheet s
cbo. AddI t emws. Name
Next
End Sub
Aps o l oop os itens so adicionados combobox:

Figura 4-2
A combobox carregada quando o evento Act i vat e do formulrio ocorre. Como desejamos que
a l i st box seja preenchida conforme selecionamos um item em nossa combobox, precisamos
utilizar o evento Change do combobox para fazer isso.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
13
Em cada planilha desta pasta de trabalho h itens para a l i st box e a descrio do item, em
suas respectivas planilhas. Como cada planilha contm os itens e respectivas descries e cada
planilha o nome na combobox, fica relativamente fcil resolver este problema atravs do evento
Change:
Pr i vat e Sub cbo_Change( )
Di mws As Wor ksheet
Di mwb As Wor kbook
Di mmat r i z( )

Set wb = Thi sWor kbook
Set ws = wb. Sheet s( cbo. Text )

' l i mpa a l i st a ant er i or ant es de adi ci onar uma nova
l st . Cl ear

' encont r a a l t i ma l i nha no- vazi a na col una A
l t i maLi nha = ws. Range( " A65536" ) . End( xl Up) . Row

n = l t i maLi nha - 1
ReDi mmat r i z( n)
Wi t h ws
' vamos at o " n - 1" por que a pr i mei r o i t emda mat r i z 0
For i = 0 To n - 1
mat r i z( i ) = . Cel l s( i + 2, 1) & " da pl ani l ha " & ws. Name
Next
End Wi t h

l st . Li st = mat r i z
End Sub
A matriz preenchida iniciando-se na linha i +2, pois a primeira linha contm o cabealho dos
itens e das descries. Caso contrrio, o cabealho ser includo na matriz.
Quando um item selecionado na combobox os respectivos itens da l i st box so preenchidos:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
14

Figura 4-3
A mesma lgica segue para a descrio dos itens. Quando um item selecionado na l i st box o
rtulo mostra a descrio do item. Portanto, o nosso cdigo no evento Cl i ck da l i st box fica:
Pr i vat e Sub l st _Cl i ck( )
Di mws As Wor ksheet
Di mwb As Wor kbook

Set wb = Thi sWor kbook
Set ws = wb. Sheet s( cbo. Text )

l bl . Capt i on = ws. Cel l s( l st . Li st I ndex + 2, 2) _
& " da pl ani l ha " & cbo. Text
End Sub
O cdigo neste caso bem mais simples do que o anterior. Apenas definimos em qual planilha
encontram-se as informaes da lista e depois passamos o valor da descrio para o rtulo.
Como o Li st I ndex inicia-se em 0 (zero) e as informaes iniciam-se na segunda linha,
precisamos ajustar isso. As descries encontram-se na coluna 2 de cada planilha.
Ao clicar em um item qualquer em nossa lista a respectiva descrio apresentada no rtulo,
como mostra a figura:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
15

Figura 4-4
Este exemplo mostra como passar o valor em um clula da planilha para um rtulo (l abel ).
Contudo, esta mesma lgica pode ser aplicada para preencher t ext box, por exemplo.
Vamos supor que tenhamos uma lista de clientes em uma planilha. Esta planilha contm os
nomes dos clientes e dados pessoais como endereo, telefone, fax, CPF, etc. Queremos
selecionar um nome em uma combobox e todos os detalhes serem preenchidos em t ext boxes
no formulrio.
O nosso formulrio ter a seguinte aparncia (este formulrio pode ser acessado na pasta de
trabalho For m5. xl s):

Figura 4-5
Neste exemplo, estarei utilizando frmulas, ao invs de cdigo, para preencher os valores das
t ext boxes. Os valores para a combobox so carregados utilizando um nome como foi
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
16
mostrado anteriormente. Porm, a nossa frmula para o nome mudar, pois neste caso ns temos
um cabealho o qual no queremos em nossa combobox. O nome deve se construdo desta
forma:
=DESLOC( Cl i ent es! $A$2, 0, 0, CONT. VALORES( Cl i ent es! $A: $A) - 1)
Neste caso estamos iniciando na segunda clula (A2) e subtraindo 1 (um) dos valores contados.
Ao subtrair 1, estamos removendo o cabealho, pois a contagem total inclui todos os valores na
coluna A.
Portanto, o cdigo que ser executado quando o formulrio aberto ser
2
:
Pr i vat e Sub User For m_I ni t i al i ze( )
cboNome. RowSour ce = " Cl i ent es"
cboNome. Li st I ndex = 0
End Sub
A linha referente ao Li st I ndex fora a seleo do primeiro item da lista, isto , o nome do cliente
cujo ndice zero:

Figura 4-6
Caso o leitor no queira ter nenhum nome selecionado, basta remover a linha de cdigo referente
ao ListIndex ou passar o valor para 1 (este valor refere-se ao valor que no existe na lista).
O nosso prximo passo preencher as t ext boxes conforme nomes sejam selecionados na
combobox. Novamente, utilizaremos o evento Change para isso. Contudo, ao invs de utilizarmos
cdigo, utilizaremos a funo PROCV para fazer isso. Em VBA a funes PROCV VLOOKUP.

2
O nome Clientes pode ser entrado diretamente na caixa de propriedades da combobox, bastando apenas digitar o
nome na caixa de propriedade, isto digitar Clientes (sem as aspas) para a propriedade RowSource.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
17
O cdigo a ser executado aps o evento Change :
Pr i vat e Sub cboNome_Change( )
t xt Ender eco = Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: D100" ) , 2, Fal se)
t xt Tel ef one = Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: D100" ) , 3, Fal se)
t xt Emai l = Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: D100" ) , 4, Fal se)
End Sub
O texto da combobox o valor procurado, o intervalo A2: D100 a rea onde a busca ocorrer, o
valor seguinte refere-se a coluna onde o valor deve ser procurado e o ltimo item diz que o valor
procurado deve ser exato. Aqui, preferi escrever Fal se. No obstante, Fal se tem o valor
numrico 0 (zero) . Quando frmulas so grandes prefervel utilizar o valor numrico ao valor
literal.
Os valores para as t ext boxes so os valores encontrados. Ao selecionar um cliente diferente na
lista, os dados so automaticamente preenchidos:

Figura 4-7
Para o boto atualizar, encontramos um pequeno problema. Se utilizarmos o ListIndex da
combobox para achar a linha onde os dados se encontram, iremos corrigir os dados para o
cliente errado. O que ocorre que quando modificamos o valor da combobox, como este valor
no se encontra na lista, o valor da combobox passa para 1 (Li st I ndex = 1). Ou seja,
precisamos encontrar uma outra soluo.
A soluo criar um ndice para os clientes. Neste exemplo, h um ndice na coluna E (veja a
pasta de trabalho referente a este exemplo). Porm, para o ndice tambm temos um pequeno
problema: e se o nmero for repetido? Se o nmero for repetido, temos mais uma dor de cabea.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
18
Para resolver isso, temos que criar uma validao nas clulas que recebero os ndices para
evitar a repetio dos ndices. No exemplo, o nmero de cliente foi limitado a 99. Portanto, para
criar a validao dos dados selecione a rea que vai de E2: E100 e entre a frmula conforme
mostra a figura:

Figura 4-8
O que a frmula faz contar todos os valores no intervalo E2: E100 que sejam iguais a clula
atual (na figura, a clula atual a E2). Se o resultado for igual a 1, o usurio pode continuar. Caso
contrrio, ele precisa entrar o valor novamente.
Feito isso, estamos prontos para criar o cdigo que atualizar os nossos dados. Primeiramente,
crie mais uma t ext box no formulrio (esta t ext box est para vi si bl e = f al se, neste
exemplo). Veja a figura abaixo:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
19

Figura 4-9
Com a t ext box, no evento Change da combobox, rearrumamos o cdigo para levar em
considerao este novo controle:
Pr i vat e Sub cboNome_Change( )
t xt Ender eco = Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: E100" ) , 2, Fal se)
t xt Tel ef one = Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: E100" ) , 3, Fal se)
t xt Emai l = Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: E100" ) , 4, Fal se)
t xt ndi ce= Wor ksheet Funct i on. Vl ookup _
( cboNome. Text , Range( " A2: E100" ) , 5, Fal se)
End Sub
Como o texto da t ext box conter o valor do ndice e como sabemos que os nomes esto em
uma linha a mais do que o ndice (o ndice inicia-se em 1). Isto , para ndice igual a um o cliente
est na linha ndice +1. Assim sendo, o cdigo para o boto de atualizao fica:
Pr i vat e Sub cmdAt ual i zar _Cl i ck( )
Di mws As Wor ksheet
Set ws = Thi sWor kbook. Sheet s( " Cl i ent es" )

l i nha = t xt ndi ce + 1
Wi t h ws
. Cel l s( l i nha, 1) = cboNome
. Cel l s( l i nha, 2) = t xt Ender eco
. Cel l s( l i nha, 3) = t xt Tel ef one
. Cel l s( l i nha, 4) = t xt Emai l
End Wi t h

cboNome. RowSour ce = " Cl i ent es"
cboNome. Li st I ndex = t xt ndi ce - 1
End Sub
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
20
Primeiramente, definimos a planilha onde o cdigo deve ser atualizado atravs do Set . A seguir,
definimos a linha como sendo o t xt ndi ce + 1. Com a planilha (ws) atualizamos os dados de
acordo com as informaes contidas nos t ext boxes.
O prximo passo atualizar o RowSour ce e finalmente definir o cliente a ser selecionado como
sendo o ndi ce 1, pois o Li st I ndex inicia-se em 1. Desta forma, o cliente com ndice igual a
1 , na verdade, o cliente 0 (zero) na combobox.
A figura abaixo mostra a atualizao sendo feita:

Figura 4-10
Os valores circundados no user f or mso os novos valores (antes de se pressionar o boto
Atualizar). Os valores circundados na planilha so os valores antigos. Aps a atualizao, temos:

Figura 4-11
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
21
O ndice, contido na coluna E, no mostrado na figura por falta de espao, porm, ele
mostrado na textbox. Na pasta contendo este exemplo, este controle est para vi si bl e =
f al se. O ndice, aqui, funciona de uma forma similar chave-primria de um banco de dados.
Porm, a eficincia e confiabilidade deste mtodo so muito mais limitadas.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
22
5. Classificando itens em uma combobox e listbox
Um problema encontrado por todos aqueles que utilizam l i st box e combobox ordenao,
alfabtica ou numrica, dos itens que sero adicionados aos dois controles.
Uma soluo bastante bvia gravar uma macro que coloque os itens na ordem que desejamos e
depois criar um l oop para carreg-los. Ainda na mesma lgica, seria copiar todos os itens, jog-
los em uma planilha temporria, orden-los, pass-los para o controle e limpar a planilha
temporria.
desnecessrio dizer que aps algumas tentativas com erros e acertos, chegaremos a concluso
que o mtodo no muito eficiente, embora ele resolva o nosso problema.
Para aqueles que leram o meu tutorial sobre este mesmo assunto, eles devem entender o porqu
da concluso do tutorial. L foram apresentadas formas de se preencher estes controles e aqui
existem formas mais eficientes e completamente diferentes das apresentadas no tutorial. Se voc
no possui o tutorial ele pode ser baixado gratuitamente em
http://www.juliobattisti.com.br/artigos/colunas/Robert/coluna01.asp
Primeiramente, no estaremos interessados em ordenar os itens diretamente nos controles.
Iremos, porm, analisar como isso feito. Faa uma busca no Ajuda do VBA por ASCII. Na lista,
veremos como os itens so tratados em ordem crescente. Na lista, veremos que A <B <C... Os
quais so menores que a <b <c...
Uma ordenao segue esta tabela. Portanto, uma classificao do maior para o menor analisar
os itens de trs para frente e vice versa, pois ou vamos a uma direo ou noutra. Este o nosso
primeiro passo para a compreenso de como a ordenao funciona.
O segundo requer entender como o Excel manipular os dados conforme eles so ordenados.
desnecessrio dizer que o Excel uma grande matriz. Como tal, tudo que manipulado
jogado em uma matriz. Como no sabemos de antemo o tamanho desta matriz, precisamos
deixar a parte superior da matriz (UBound) em aberto e calcular este valor em tempo de
execuo.
Aqui entra em cena a propriedades Li st . Como visto anteriormente, esta propriedade tem o
formato de uma matriz e os dados que ela recebe devem vir de uma matriz tambm. Como a
propriedade chamada de Li st , estaremos chamando a matriz que conter os itens de Li st ,
tambm.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
23
Iniciamos, ento, a construo de nossa funo:
Funct i on Or denar ( Li st a As Range) As Var i ant
Di mLi st ( )
n = Li st a. Count
ReDi mLi st ( n - 1)
End Funct i on
A nossa funo Var i ant porque no sabemos as dimenses que ela tomar ao resolver o
problema. A lista um r ange que vir de nossa planilha. A princpio a Li st aberta pois no
temos o tamanho da lista. Ao definirmos n como sendo o nmero de itens contido na lista,
redimensionamos a Li st como sendo n 1. Como a base Opt i on Base 0, o primeiro item
da matriz 0 (zero). Se no subtrairmos 1 de n, a matriz conter um item a mais do que o r ange.
No prximo passo, preenchemos a lista (Li st ):
Funct i on Or denar ( Li st a As Range) As Var i ant
i = 0
For Each I t emI n Li st a
Li st ( i ) = I t em
' Debug. Pr i nt I t em
i = i + 1
Next
End Funct i on
O Debug. Pr i nt I t emserve para jogar cada Item na janela imediata. Utilizei este mtodo de
depurao para visualizar os dados sendo carregados para a matriz. Com a Li st pronta,
podemos iniciar o processo de ordenao das variveis contidas na lista:
Funct i on Or denar ( Li st a As Range) As Var i ant
For i = 0 To UBound( Li st ) - 1
For j = i + 1 To UBound( Li st )
I f Li st ( i ) > Li st ( j ) Then
Temp = Li st ( j )
Li st ( j ) = Li st ( i )
Li st ( i ) = Temp
End I f
Next j
Next i
End Funct i on
Primeiramente, definimos os l oops. Como no sabemos o limite superior da matriz
3
, utilizamos a
funo UBound( mat r i z) para descobrir qual o ltimo valor da lista. A matriz inicia-se em 0
(zero), pois o estamos utilizando Option Base 0. Se voc deseja ser pedante, pode-se utilizar
LBound( Mat r i z) para achar o limite inferior da matriz, o qual retornar zero.

3
Na verdade, ns sabemos, pois a matriz redimensionada como sendo n 1. Porm, sempre boa idia utilizar este mtodo para
evitar erros.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
24
A seguir testamos (utilizando o formato da tabela ASCII), se o valor i maior do que o valor i +
1 ( j ) , pois queremos uma lista em ordem crescente. Se a lista for em ordem decrescente, basta
trocar o sinal de maior (>) pelo sinal de menor (<).
Finalmente, definimos a nossa funo como sendo igual a Li st . Contudo, ao construir a lista, a
matriz transposta, pois os itens so avaliados na vertical e colocados lado a lado (horizontal).
Assim sendo, precisamos devolver a matriz para o formato original. O cdigo final fica, portanto:
Funct i on Or denar ( Li st a As Range) As Var i ant
Di mLi st ( )
n = Li st a. Count

ReDi mLi st ( n - 1)
i = 0
For Each I t emI n Li st a
Li st ( i ) = I t em
' Debug. Pr i nt I t em
i = i + 1
Next

For i = 0 To UBound( Li st ) - 1
For j = i + 1 To UBound( Li st )
I f Li st ( i ) > Li st ( j ) Then
Temp = Li st ( j )
Li st ( j ) = Li st ( i )
Li st ( i ) = Temp
End I f
Next j
Next i

Or denar = Wor ksheet Funct i on. Tr anspose( Li st )
End Funct i on
A matriz Li st poderia ser transposta em um loop. No obstante, a funo Tr anspose faz a
mesma coisa com muito mais eficincia.
Como estamos falando de uma funo, ela pode ser colocada em um planilha para checarmos os
resultados. Como estamos falando de uma matriz-tabela importante selecionar a rea que
receber o resultado e apertar CTRL+SHI FT+ENTER aps entrar a frmula:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
25

Figura 5-1
Este primeiro exemplo mostrado para que o leitor entenda o que est ocorrendo. Para adicionar
os itens a uma l i st box, por exemplo, fica muito simples.
O arquivo For m5. 1. xl s contm o formulrio abaixo:

Figura 5-2
Como foi observado na lista ASCII, R < r; portanto, se voc ordenar os nomes robert1 e
ROBERT2 em ordem crescente ROBERT2 vir antes de robert1. Em ordem alfabtica crescente,
seria ao contrrio, pois estaramos ignorando maisculo/minsculo. Portanto, sem ter a lista em
mos, voc no entender a lgica por trs da ordenao.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
26
Se voc achou a parte de ordenao difcil demais. Para preencher a lista, voc achar
ridiculamente fcil:
Pr i vat e Sub User For m_Act i vat e( )
Li st Box1. Li st = Or denar ( Range( " A2: A21" ) )
End Sub
Como a ordenao requer matrizes, a operao fica complexa pelo fato de no podermos
visualizar a matriz. A melhor sada utilizar o Debug. Pr i nt para resolver isso.
Finalmente, a escolha por uma funo ao invs de uma sub-rotina foi apenas para mostrar como
ela pode ser utilizada na planilha e para visualizao do resultado antes de pass-lo para a
listbox. No h nada que impea a utilizao de uma sub-rotina para retornar a mesma matriz.

Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
27
6. Adicionando itens nicos
J passamos pela parte onde adicionamos itens ao combobox/l i st box e classificamos os itens.
Porm, h situaes especiais onde queremos que os valores sejam nicos.
Vamos supor que no exemplo anterior, alm dos dados j cadastrados tambm tenhamos a
Unidade Federativa (UF) de cada cliente. fcil ver que este valor se repetir na coluna referente
a UF. Esto-se passando este valor para uma textbox no h problemas, pois isso mesmo que
desejamos fazer. Contudo, estaremos analisando o mesmo problema de uma tica diferente.
Estaremos vendo como preencher uma combobox com valores nicos onde vrias cidades sob a
mesma UF so colocadas em uma l i st box a partir da UF selecionada.
Valores nicos podem ser adicionados de duas formas: 1) atravs de frmulas ou 2) uma funo
customizada (personalizada) pelo usurio. Em ambos os casos, porm, o resultado uma matriz
contendo todos os itens nicos. Primeiramente, avaliamos uma funo que retorna uma matriz
contendo todos os valores nicos. Esta matriz, como na caso da classificao, jogada de uma
s vez para a propriedade Li st do controle.
Para criarmos uma lista nica utilizaremos uma coleo (Col l ect i on). Ao utilizar uma nova
coleo (New Col l ect i on), podemos associar um item da lista a uma chave, evitando assim a
repetio do item.
Os modelos aqui desenvolvidos encontram-se na pasta de trabalho For m6. 2. xl s.
Como sempre, iniciamos com a declarao das variveis:
Pr i vat e Funct i on mat r i z( l i st a As Range) As Var i ant
Di mmat r i zSa da( ) As Var i ant
Di mI t em As Var i ant
Di mmat r i zni ca As New Col l ect i on
End Funct i on

Estaremos utilizando, primeiramente, uma funo para fazer o que desejamos. A matriz de sada
deixada em aberto porque desconhecemos o tamanho da lista. Uma vez que a lista tenha sido
passada para a funo, preenchemos o nova coleo de dados:.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
28
Pr i vat e Funct i on mat r i z( l i st a As Range) As Var i ant
On Er r or Resume Next
For Each I t emI n l i st a
I f I t em. For mul a <> " " Then
mat r i zni ca. Add I t em. Val ue, CSt r ( I t em. Val ue)
End I f
Next I t em
mat r i z = " "
End Funct i on
Aqui, acrescentamos os itens a nova coleo de dados (matriznica). A chave (similar a chave-
primria de um BD) dada como sendo a St r i ng do valor do Item atual. Observe que se a
chave for igual ocorrer um erro. Para evitar isso, utilizamos o On Er r or Resume Next (No erro
executar prximo comando). Ao executar o prximo comando o item onde o erro ocorreu pulado
e somente os itens que no retornam um erro so adicionados a nova coleo. A ltima linha
apenas define a matriz como sendo vazia.
Pr i vat e Funct i on mat r i z( l i st a As Range) As Var i ant
I f mat r i zni ca. Count > 0 Then
ReDi mmat r i zSa da( 1 To mat r i zni ca. Count )
For i = 1 To mat r i zni ca. Count
mat r i zSa da( i ) = mat r i zni ca( i )
Next i
mat r i z = mat r i zSa da
End I f
End Funct i on
Finalmente, checamos se o nmero de itens da coleo maior do que zero. Se for, redimensiona
a matriz de sada. Aqui, utilizo um forma diferente de se declarar o intervalo da matriz. Como
Option Base zero, teramos que subtrair 1 do nmero total de itens. Ao dimensionar a matriz
com sendo de 1 ao nmero total (1 To mat r i zni ca. Count ) no h necessidade de subtrao
a dimenso explcita, pois sabemos o limite inferior (LBound) e limite superior (UBound).
A funo completa:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
29
Pr i vat e Funct i on mat r i z( l i st a As Range) As Var i ant
Di mmat r i zSa da( ) As Var i ant
Di mI t em As Var i ant
Di mmat r i zni ca As New Col l ect i on

On Er r or Resume Next
For Each I t emI n l i st a
I f I t em. For mul a <> " " Then
mat r i zni ca. Add I t em. Val ue, CSt r ( I t em. Val ue)
End I f
Next I t em
mat r i z = " "
I f mat r i zni ca. Count > 0 Then
ReDi mmat r i zSa da( 1 To mat r i zni ca. Count )
For i = 1 To mat r i zni ca. Count
mat r i zSa da( i ) = mat r i zni ca( i )
Next i
mat r i z = mat r i zSa da
End I f
End Funct i on
O nosso prximo passo e preencher a combobox.
Pr i vat e Sub User For m_I ni t i al i ze( )
Li nha = Range( " A65536" ) . End( xl Up) . Row
Di mval or es As Var i ant
Di mi As Long

val or es = mat r i z( Range( " A2: A" & Li nha) )

Wi t h cbo1
For i = 1 To UBound( val or es)
. AddI t emval or es( i )
Next
End Wi t h
cbo1. Li st I ndex = 0
End Sub
Primeiramente, procuramos pela ltima linha na coluna A. Em seguida definimos a varivel
val or es como sendo o resultado da matriz anterior e finalmente damos um l oop em cada valor
e preenchemos a combobox. O primeiro item da combobox que selecionado aquele cujo
Li st I ndex zero.
Aperte o pause do VBA e pense um pouco... Ser que no h nada de estranho neste cdigo?
Para que criar uma matriz chamada valores e dizer que essa matriz igual a funo? Pior ainda,
para que fazer um l oop quando temos em mo a matriz completa!
O cdigo funciona bem, mas estamos repetindo o trabalho j feito pela funo.
Como a funo matriz resolvida, podemos facilmente preencher a combobox, com a seguinte
sub-rotina:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
30
Pr i vat e Sub User For m_I ni t i al i ze( )
Li nha = Range( " A65536" ) . End( xl Up) . Row
cbo1. Li st = mat r i z( Range( " A2: A" & Li nha) )
cbo1. Li st I ndex = 0
End Sub
Com apenas trs linhas resolvemos o problema!
Agora, d um rewind at a funo. Embora a funo seja ideal (por retornar valores que podem
ser divididos com outros procedimentos), o mesmo resultado poderia ter sido obtido diretamente
no evento I ni t i al i ze do formulrio.
Como o processo similar a criao da funo desnecessrio repetir todo o cdigo no papel.
Contudo, o material foi desenvolvido na pasta de trabalho e est disponvel para o leitor.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
31
7. Passando itens entre listboxes
Uma caracterstica interessante de l i st boxes que podemos passar itens de uma lista para
outra. Em algum ponto, o usurio j deve ter tido esta experincia. Por exemplo, quando
utilizamos o Outlook para enviar e-mails, temos uma l i st box e trs textboxes. Uma contm a
lista de e-mail em nosso computador e a outra recebe os e-mails das pessoas para as quais
desejamos enviar a mensagem.
Por incrvel que parea, transferir itens entre l i st boxes bem simples. Primeiramente, vamos
iniciar com a construo de nosso formulrio. O formulrio do usurio deve ter o formato a seguir:

Figura 7-1
A l i st box da esquerda conter a lista completa e a da direita receber os itens. Alm disso,
temos quatro botes de comando. O boto com duas setas para a direita insere na segunda
l i st box todos os itens da primeira l i st box. O boto com uma seta insere apenas o item
selecionado.
A mesma lgica serve para os botes de remover. Uma seta remove o item selecionado e duas
setas remove todos os itens. Ento, vamos iniciar pela parte mais fcil: passar/remover todos os
itens da lista.
Entre no cdigo do primeiro boto, onde entraremos o cdigo:
Private Sub cmdAdicionarTodos_Click()
On Error Resume Next
lstRecebeItens.List = lstItens.List
End Sub
Tudo que fazemos definir a List da listbox da direita (lstRecebeItens) como sendo igual
a lista dos da primeira l i st box. A linha On Error Resume Next apenas assegura que se
houver um erro o cdigo continuar a rodar.
Se passar toda a lista foi simples, remover todos os itens da segunda lista mais fcil ainda:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
32
Private Sub cmdRemoverTodos_Click()
On Error Resume Next
lstRecebeItens.Clear
End Sub
No precisamos da um loop em cada item da lista e remover um a um. Basta utilizar o mtodo
Clear e resolvido o problema!
A nossa prxima parada adicionar um item por vez, isto , adicionar o item selecionado. Abra a
rea de edio do cdigo para o boto de adicionar o item selecionado. O nosso cdigo, neste
caso, ficar:
Private Sub cmdAdicionarUm_Click()
On Error Resume Next
If lstItens.ListCount >= 1 Then
If lstItens.ListIndex = -1 Then
lstItens.ListIndex = _
lstItens.ListCount - 1
End If
lstRecebeItens.AddItem (lstItens.Text)
End If
n = lstItens.ListIndex + 1
If n >= lstItens.ListCount Then
lstItens.ListIndex = 0
Else: lstItens.ListIndex = n
End If
End Sub
O cdigo primeiramente checa se h algo na lista (lstItens.ListCount >= 1). Se sim, checa
o valor da seleo (lstItens.ListIndex = -1). Se o valor for -1, ento o ltimo item da lista
selecionado e o texto deste item passado para a segunda lista.
A seguir checamos qual o item atualmente selecionado. Aps este item ser passado para a
segunda listbox, o item seguinte selecionado. Se este for o ltimo item da lista; ento, o
primeiro item da lista selecionado.
Para remover um item apenas relativamente fcil. Tudo que precisamos saber o ndice do item
e utilizar o mtodo RemoveItem para fazer isso:
Private Sub cmdRemoverUm_Click()
On Error Resume Next
If lstRecebeItens.ListCount >= 1 Then
If lstRecebeItens.ListIndex = -1 Then
lstRecebeItens.ListIndex = _
lstRecebeItens.ListCount - 1
End If
lstRecebeItens.RemoveItem (lstRecebeItens.ListIndex)
End If
End Sub
Novamente checamos se h algum item na lista (lstRecebeItens.ListCount >= 1). Se
houver itens na lista, mas nenhum estiver selecionado, o ltimo item da lista removido. Se algum
item estiver selecionado, o item cujo ndice est selecionado removido.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
33

Figura 7-2
A imagem mostra um item sendo passado por vez. Aps passar o Item 1, o segundo item da
primeira lista automaticamente selecionado.
Alm de passarmos um item por vez, podemos habilitar a multi-seleo para passar todos os itens
selecionados de uma s vez. Tanto o exerccio anterior quanto este se encontram na pasta de
trabalho Form6.xls.
Antes de tudo precisamos modificar a propriedade da l i st box para que ela aceite mltipla
seleo de itens. Na caixa de propriedade, modifique como segue:

Figura 7-3
A propriedade Multiselect composta por trs estados:
frmMultiSelectSingle
frmMultiSelectMulti
frmMultiSelectExtended
O primeiro estado padro e permite apenas uma seleo por vez (como feito anteriormente). O
segundo, permite a seleo de vrios itens atravs do clique do mouse, isto , em cada item que o
usurio clicar ele ser selecionado. O terceiro, o qual estaremos utilizando, o usurio precisa
pressionar e segurar a tecla CTRL enquanto clica em cada item para efetuar uma mltipla seleo.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
34
No estaremos modificando o cdigo para adicionar e remover todos os itens da lista
simultaneamente.
Para se passar um item selecionado, precisamos utilizar a propriedade Sel ect ed. Esta
propriedade no opcional e, portanto, precisamos definir o item selecionado. Para passar os
itens selecionados, procederemos da seguinte forma:
Private Sub cmdAdicionarSel_Click()
On Error Resume Next
n = lstItens.ListCount - 1
If lstItens.ListCount >= 1 Then
If lstItens.ListIndex = -1 Then
lstItens.ListIndex = _
lstItens.ListCount - 1
End If
For i = 0 To n
If lstItens.Selected(i) = True Then
lstRecebeItens.AddItem lstItens.List(i)
End If
Next
End If
End Sub
Primeiramente, contamos todos os itens da lista. Como estamos utilizando Option Base 0
(opo padro para matrizes), o ndice sempre iniciado em zero. Assim sendo, o valor de n ser
igual a lstItens.ListCount - 1. Novamente, checamos se h algo selecionado para depois
fazer um loop nos itens selecionados.
Durante o loop checamos se o item i est selecionado e se este for o caso, acrescentamos o item
i da primeira lista a segunda lista.
7.1. Movendo itens dentro de listboxes
Acima vimos como passar um ou mais itens entre duas l i st boxes. Agora, nos voltamos para a
passagem de itens dentro de uma l i st box. Neste caso, o que estamos fazendo mover a
posio atual do item.
O nosso formulrio ter o seguinte aspecto:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
35

Figura 7-4
Com o nosso layout feito, estamos prontos para iniciar a nossa anlise do problema.
Como j sabemos, a propriedade List define a matriz contendo os itens de nossa lista. Embora os
itens tenham sido adicionados um a um, o resultado uma matriz. Portanto, para fazer o que
desejamos precisaremos manipular e reconstruir a matriz a cada passo.
Ao utilizarmos o Option Base padro (Option Base 0), temos que a propriedade ListIndex
= 0 para o Item 1, ListIndex = 1 para Item 2 e ListIndex = 2 para o Item 3.
Se construirmos uma matriz contendo os itens acima, ela ter o mesmo formato. Se capturarmos
o ListIndex e o texto do Item 1, temos: ListIndex = 0 e Text = Item 1. Portanto,
precisamos guardar estas duas variveis para movimentar os itens na nova matriz.
Vamos chamar nossa matriz de List. Ela redimensionada de acordo com o nmero de itens na
l i st box. O texto igual ao texto da posio atual em nossa nova lista. O Item 1 passa para a
posio do Item 2 da lista atual. A nossa lista tem o formato atual:
Item 1
Item 2
Item 3
Portanto, o Item 1 passa a ser igual a ListIndex + 1 (Item 2). E nossa matriz, passa a ser
Item 2
Item 2
Item 3
Como havamos guardado o Item 1 em Text, o Item 1 passa para posio onde ListIndex + 1.
Isto List(ListIndex + 1) e igual a Text. E a nova matriz fica:
Item 2
Item 1
Item 3
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
36
Observe que o itens no moveram. O que fizemos foi escrever Item 2 na posio onde se
encontrava o Item 1. E depois, escrevemos Item 1 sobre o segundo Item 2 (pois ficamos com o
Item 2 repetidos duas vezes nas posies 0 e 1).
O cdigo desenvolvido utiliza o Debug.Print para mostrar o processo durante a execuo:

Figura 7-5
O problema bastante simples. Talvez a parte mais difcil seja visualizar o processo conforme ele
ocorre. Com as explicaes dadas, podemos partir para a escrita de nosso cdigo:
Pr i vat e Sub i mgPar aBai xo_Cl i ck( )
Di mLi st ( )

I f l st I t ens. Li st I ndex = l st I t ens. Li st Count - 1 Then
Exi t Sub
End I f

n = l st I t ens. Li st Count
ReDi mLi st ( n - 1)

' Guar da a mat r i z or i gi nal na " Li st "
For i = 0 To n - 1
Li st ( i ) = l st I t ens. Li st ( i )
Next

' Guar da o ndi ce da sel eo at ual
I t emNm= l st I t ens. Li st I ndex

' I t emt empor r i o i gual ao i t emsel eci onado
TempI t em= Li st ( I t emNm)

' I t emat ual da l i st a passa ser o i t emsegui nt e
Li st ( I t emNm) = Li st ( I t emNm+ 1)

' Ut i l i ze o Debug. Pr i nt par a ver a mudanca na mat r i z
' Debug. Pr i nt " Pr i mei r o Debug na j anel a i medi at a: "
' For i = 0 To n - 1
' Debug. Pr i nt Li st ( i )
' Next

Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
37
' Aqui , t emos doi s i t ens r epet i dos. Umna posi o nova I t emNm- 1
' E out r o na posi o or i gi nal I t emNm
' Por t ant o, I t emNm+ 1 na nova l i st a i gual ao TempI t em
Li st ( I t emNm+ 1) = TempI t em

' Debug. Pr i nt vbCr & " Segundo Debug na j anel a i medi at a: "
' For i = 0 To n - 1
' Debug. Pr i nt Li st ( i )
' Next

' Def i ne a nova Li st da l i st box como sendo a Li st
l st I t ens. Li st = Li st

' Sel eci ona o i t emque est sendo movi do. Como a posi o or i gi nal
' Li st I ndex ( I t emNm) ao mover par a bai xo el e passa a ser I t emNm+ 1
l st I t ens. Li st I ndex = I t emNm+ 1
End Sub
Como utilizei uma imagem com a seta, o evento baseado no click sobre a figura. Se o
movimento para baixo envolve uma soma, o inverso verdadeiro para o movimento para cima.
Portanto, ao compreender como o mtodo acima funciona, criar o movimento inverso um
passeio no parque:
Pr i vat e Sub i mgPar aCi ma_Cl i ck( )
Di mLi st ( )

I f l st I t ens. Li st I ndex = 0 Then
Exi t Sub
End I f

n = l st I t ens. Li st Count
ReDi mLi st ( n - 1)

For i = 0 To n - 1
Li st ( i ) = l st I t ens. Li st ( i )
Next

I t emNum= l st I t ens. Li st I ndex

TempI t em= Li st ( I t emNum)
Li st ( I t emNum) = Li st ( I t emNum- 1)
Li st ( I t emNum- 1) = TempI t em
l st I t ens. Li st = Li st

l st I t ens. Li st I ndex = I t emNum- 1
End Sub
A pasta de trabalho contendo este exemplo pode ser acessada em For m6. 1. xl s.


Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
38
8. Conectando e interagindo com o MS Outlook
Para os usurio do MS Office, h vrias formas de se interagir com outros aplicativos deste
pacote. Neste tpico e no prximo estaremos vendo exatamente isso.
Neste primeiro tpico, estaremos vendo como carregar para uma l i st box os e-mails e nomes
dos contatos contidos em seu Outlook. Alm disso, como bnus, uma pasta de trabalho contendo
um pequeno aplicativo para envio de e-mail do Excel foi criado. No estaremos discutindo os
detalhes de como o programa foi feito ou como configurar a sua mquina para envio de e-mails.
Afinal, nosso foco est nas l i st boxes e comboboxes. Porm, o cdigo est aberto para anlise
e uso pelo usurio.
O formato de nosso formulrio ser o seguinte:

Figura 8-1
A caixa da esquerda uma l i st box e as trs caixas da direita so textboxes. Este layout foi
escolhido para manter um formato similar ao do Outlook 2002 (Outlook XP).
Como os botes Para, Cc e BCc passam os valores da l i st box para as respectivas caixas
de texto, no estaremos reconstruindo estes botes neste tpico, pois eles j foram tratados
anteriormente.
Os objetivos deste exerccio esto listados abaixo:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
39
1. Carregar o nome do contato e seu respectivo endereo de e-mail a partir da lista de
contatos do Outlook;
2. Passar da listbox somente o endereo de e-mail para a respectiva caixa de acordo com
o boto clicado;
3. Permitir que o usurio passe um item para o destinatrio atravs de um duplo-clique sobre
o nome do contato;
A primeira parte requer uma rotina que seja capaz de ler os dados contidos na pasta de contatos
do Outlook e passe os valores para uma matriz. Como estamos interessados no nome e e-mail,
precisamos modificar as propriedades da l i st box como segue:
1. Passar o valor da ColumnCount para 2 (duas colunas, uma para os nomes e outra para
os e-mails);
2. MultiSelect deve estar para frmMultiselectExtended para permitir mltipla
seleo de destinatrios que sero passados para as respectivas caixas de texto;
Para se acessar os objetos do Outlook podemos ir no escuro ou utilizar a referncia a biblioteca
do Outlook
4
. Embora a utilizao da biblioteca do Outlook facilite a nossa vida, estaremos criando
o nosso cdigo no escuro. O motivo por esta escolha para evitar incompatibilidade entre
sistemas dos leitores. Como no temos o benefcio da biblioteca, teremos que criar os objetos. Os
objetos que precisaremos neste caso so:
olApp (O aplicativo Outlook)
olNameSpace (NameSpace referente ao Outlook)
olContatos (os contatos)
olListaEnd (Lista de endereos)
olItensEnd (Itens da lista de endereos olListaEnd)
O prefixo ol para identificar os objetos relacionados ao Outlook Application (olApp).
Como o cdigo relativamente extenso, interessante utilizar Option Explicit
5
para evitar
erro em nossas variveis.
Primeiramente, vamos dimensionar os nossos objetos:
Private Sub UserForm_Initialize()
Dim olApp As Object 'Aplicativo
Dim olNameSpace As Object 'NameSpace
6

Dim olContatos As Object 'Itens
Dim olListaEnd As Object 'Lista de endereos

4
Pra se fazer uma referncia aos objetos do Outlook v at Ferramentas -->Referncias e selecione Microsoft Outlook
<verso>Object Library.
5
Para forar Option Explicit em todos os trabalhos v at Ferramentas -->Opes -->Editor e selecione Requer
Declarao de Variveis.
6
Namespace um conjunto de nomes no qual todos os nomes so nicos.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
40
Dim olItensEnd As Object 'Itens da lista de endereos
End Sub
Como no temos a biblioteca, todos os itens so tratados como objetos. Com os objetos,
dimensionados, precisamos cri-los para que o cdigo possa fazer sua mgica. O primeiro objeto
a ser criado o olApp (o cdigo segue a ordem de desenvolvimento e os cdigos anteriores no
sero repetidos):
Private Sub UserForm_Initialize()
'A declarao dos objetos entra aqui
Set olApp = CreateObject("Outlook.Application")
End Sub
Como o olApp pode ser qualquer objeto precisamos criar o objeto Outlook. Isto feito como
mostrado acima. Como os objetos seguintes so dependentes do primeiro objeto, podemos
continuar com o Set dos objetos:
Private Sub UserForm_Initialize()
'O NameSpace definido em cima do aplicativo
Set olNameSpace = olApp.GetNamespace("MAPI")

'A lista definida em cima do NameSpace
'nomeDaPasta refere-se ao nome da pasta AddressLists
'o nome pode ser modificado pelo ndice da pasta. O ndice para a
'pasta padro 1
Set olListaEnd = olNameSpace.AddressLists("nomeDaPasta")

'Os itens contidos na lista (Entries) so definidos em cima da lista
Set olItensEnd = olListaEnd.AddressEntries
End Sub
A lista de nossa l i st box ser carregada a partir de uma matriz (utilizaremos a propriedade List
para isso). Desta forma precisamos criar tal matriz. Como no sabemos o tamanho da matriz em
termos de linhas (sabemos que teremos 2 colunas, uma para o nome e outra para o e-mail),
precisamos dimensionar (Dim) e redimensionar (ReDim) a matriz:
Private Sub UserForm_Initialize()
Dim matriz()
n = olItensEnd.Count
ReDim matriz(n, 2)

'Faz um "loop" em cada cadastro do AddressBook
'e adiciona os itens "Name" e "Address" nossa matriz
For i = 0 To n - 1
Set olContatos = olItensEnd.Item(i + 1)
nome = olContatos.Name
endEmail = olContatos.Address
'Acrescenta o item "nome" a linha "i" na coluna 1 (ndice 0)
matriz(i, 0) = nome
'Acrescenta o item "endEmail" a linha "i" na coluna 2 (ndice 1)
matriz(i, 1) = endEmail
Next
'Carrega os valores na lista. Onde a propriedade "list" uma matriz
lstContatos.List = matriz
End Sub
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
41
Uma vez carregada a matriz, nosso trabalho est quase pronto. Como criamos vrios objetos na
memria de nosso computador, no uma boa idia deix-los consumindo a nossa preciosa
capacidade de processamento. Para cada objeto criado, faremos o seguinte:
Private Sub UserForm_Initialize()
Set nomeDoObjeto = Nothing
End Sub
O processo acima deve ser feito para cada objeto criado.
O cdigo completo fica, portanto:
Private Sub UserForm_Initialize()
Dim olApp As Object 'Aplicativo
Dim olNameSpace As Object 'NameSpace
Dim olContatos As Object 'Itens
Dim olListaEnd As Object 'Lista de endereos
Dim olItensEnd As Object 'Item da lista de endereos
Dim blnListaExiste As Boolean
Dim matriz()
Dim nome As String, endEmail As String, ndiceListEnd As Integer

Set olApp = CreateObject("Outlook.Application")
Set olNameSpace = olApp.GetNamespace("MAPI")
'O ndice 2 refere-se ao valor em meu PC. Modifique o ndice para 1
'para utilizar o AddressBook padro:
Set olListaEnd = olNameSpace.AddressLists(2)
Set olItensEnd = olListaEnd.AddressEntries

n = olItensEnd.Count

ReDim matriz(n, 2)

For i = 0 To n - 1
Set olContatos = olItensEnd.Item(i + 1)
nome = olContatos.Name
endEmail = olContatos.Address
matriz(i, 0) = nome
matriz(i, 1) = endEmail
Next
lstContatos.List = matriz

Set olContatos = Nothing
Set olListaEnd = Nothing
Set olItensEnd = Nothing
Set olNameSpace = Nothing
Set olApp = Nothing
End Sub
O nosso formulrio, aps rodarmos o cdigo, carrega os dados de todos os contatos em nosso
AddressBook:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
42

Figura 8-2
Para evitar problemas com a minha lista de e-mails, foi necessrio obliterar os detalhes.
O cdigo final utilizado neste exemplo contem rotinas para lidar com erros e d a flexibilidade de
se escolher o AddressBook a ser utilizado.
Esta pasta de trabalho contm um outro formulrio que permite o usurio escrever e enviar um e-
mail. Este aplicativo utiliza o IIS (Internet Information Services) com um servidor SMTP virtual. O
aplicativo pode ser adaptado para enviar e-mail via Outlook. Contudo, ao enviar pelo Outlook
precisamos permisso para cada mensagem enviada. A utilizao do servidor SMTP virtual
resolve o DNS (Domain Name Server) e envia a mensagem sem a necessidade do prompt do
Outlook.
Se voc tem algum dvida sobre como instalar e configurar o IIS, uma boa pedida o livro
Windows Server 2003 Curso Completo de J lio Battisti, captulos 22, 23 e 24. Para os usurios
de Windows XP Professional, veja o livro Windows XP Home & Professional, tambm de J lio
Battisti.
O aplicativo (se que podemos cham-lo disso) para envio de e-mail mostrado abaixo:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
43

Figura 8-3
Ele no nenhuma Brastemp, mas quando estamos trabalhando com diversas planilhas e
precisamos envi-las sem a chata mensagem do Outlook que apreciamos a versatilidade deste
mtodo. O cdigo extremamente fcil e o aplicativo pode ser adaptado para enviar anexos
tambm.
Ao utilizar a biblioteca do Outlook possvel criar um aplicativo de e-mail bem profissional no
Excel; porm, este assunto vai alm do escopo deste mdulo.
A aplicativo somente funciona se o IIS estiver instalado e o servidor virtual SMTP estiver
resolvendo DNS corretamente.
Uma ltima palavra sobre o envio de e-mails utilizando um servidor SMTP que existe um
diferena entre o mtodo utilizado no WinXP Pro e em um servidor Windows.
O WinXP Pro utiliza CDO.Message para criar a mensagem e servidor Windows 2000 utiliza
CDONTS. J para o servidor Windows 2003, CDOSYS o mtodo utilizado para criar o objeto.
Neste dois ltimos casos necessrio referenciar o servidor para que a mensagem seja criada.

Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
44


Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
45
9. Conectando e interagindo com o MS Access
Para aqueles que participam do frum J lio Battisti (www.juliobattisti.com.br/forum/default.asp),
todos j sabem o que eu penso: Excel no banco de dados. Se voc possui informaes que
precisam de um armazenamento mais avanado dos dados, utilize um Bando de Dados. Se voc
trabalha com o Office, utilize o Access. Afinal, o Excel para anlise de dados e no para a coleta
de dados.
Contudo sempre existe aquela pergunta sobre como utilizar o Excel para acessar dados em um
BD. H vrias formas de se fazer isso. A mais simples criar uma consulta que traz os dados
para um planilha do Excel. Feito isso, podemos manipular estas informaes e fazer nossas
anlises.
No obstante, a consulta passiva. Vamos supor que desejamos ler e escrever para o banco de
dados. Uma consulta no resolve este problema. Nesta parte, estaremos vendo exatamente isso,
isto , como coletar informaes de uma forma ativa em nosso banco de dados de forma que
possamos modificar ou acrescentar informaes diretamente no BD. Obviamente, no temos
como modificar a estrutura do BD, mas com esta flexibilidade, podemos acrescentar mais um item
importante em nossa busca por um entendimento melhor de como estes programas interagem.
Embora o Excel venha com as classes que utilizaremos para construir a conexo ao BD do
Access, elas no so automaticamente referenciadas. Estaremos utilizando a biblioteca ADO
neste caso. Para referenciar a esta biblioteca, v at (no VBE) Ferramentas -->Referncias e
selecione a verso mais recente do Mi cr osof t ActiveX Data Objects Library:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
46

Figura 9-1
Uma vez que a referncia esteja criada, estamos prontos para iniciar o nosso trabalho. Os nossos
objetivos esto relacionados abaixo:
Conectar ao BD
Extrair os dados de uma tabela qualquer
Passar os dados de um dos campos da tabela para uma combobox.
Ao selecionar um dos registros na combobox, passar os resultados para textboxes em
nosso formulrio
Este o primeiro exerccio que estaremos fazendo. Nele estamos apenas preocupados com a
leitura dos dados. Mais adiante veremos como modificar estas informaes no banco de dados.
Como sempre iniciamos pela declarao de nossas variveis. Estaremos precisando do seguinte:
Conexo ao Banco de Dados (o qual chamaremos de conn)
Recordset (registros, os quais chamaremos de r s)
Um contador (para contar os registros, linhas, colunas, etc.)
Aps a conexo ao banco de dados, o formulrio ter o seguinte aspecto:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
47

Figura 9-2
Os dados de cada textbox so modificados conforme escolhemos um funcionrio novo.
Quando conectamos a banco de dados, se o volume grande o desempenho da conexo cair.
Para tentar reduzir o problema, carregaremos o formulrio antes de ele ser mostrado. Ao fechar,
ao invs de descarregar o formulrio, simplesmente o esconderemos. Portanto, o primeiro cdigo
a ser escrito deve ser na pasta de trabalho:
Pr i vat e Sub Wor kbook_Open( )
Load f r mDB
End Sub
Os dados podem ser carregados atravs de uma funo ou sub-rotina. A escolha fica a critrio do
programador e no interfere com o resultado final. Estaremos utilizando uma sub-rotina para
resolver o nosso problema.
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
Di mconn As ADODB. Connect i on
Di mr s As ADODB. Recor dset
End Sub
Sem a referncia biblioteca ADO, no temos como dimensionar os objetos Connect i on e
Recor dset .
A nossa sub-rotina recebe dois argumentos (ambos textos) nomeDB e Tabel a. O nomeDB refere-
se no s ao nome como tambm ao caminho (path) onde o banco de dados de encontra. O
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
48
banco de dados sendo utilizado est na pasta BD e chamado FPNWI ND. MDB
7
. Portanto, este
argumento ser entrado como Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. MDB" .
Com os objetos dimensionados, passamos para o prximo item. Precisamos, agora, definir (Set )
os objetos.
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
Set conn = New ADODB. Connect i on
conn. Open " Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=" & nomeBD & " ; "
Set r s = New ADODB. Recor dset
End Sub
Primeiro criamos uma nova conexo (New ADODB. Connect i on) e em seguida abrimos a conexo
utilizando o Dr i ver apropriado e a fonte de dados (Dat a Sour ce). Feito isso, criamos um r s
(Recor set ) novo (New ADODB. Recor dset ). Assim como abrimos a conexo, precisamos agora
abrir o r s:
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
r s. Open " Sel ect * FROM " & Tabel a & " ORDER BY Fi r st Name" , conn
sobr enome = " Last Name" : pr i Nome = " Fi r st Name"
t t ul o = " Ti t l eOf Cour t esy"
End Sub
Aqui, utilizamos comando SQL para abrir (ler) as informaes. Ao abrir, ns selecionamos da
tabela (Sel ect * Fr om Tabel a) e ordenamos pelo primeiro nome da pessoa (Or der by
Fi r st Name).
Observe que campos (Last Name, Fi sr t Name e Ti t l eOf Cour t esy) so os nomes dos campos
mesmo! Com isso quero dizer que este no o cabealho do campo na tabela. Embora muitas
vezes estes sejam iguais, neste caso especfico eles no so e preciso entrar em modo de
edio da tabela no Access para saber o nome correto campo.
A seguir, definido trs variveis que correspondem aos campos que nos interessam: sobrenome
(Last Name), priNome (Fi r st Name) e ttulo (Ti t l eOf Cour t esy). Com estas variveis,
passamos para o prximo estgio:
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
Wi t h r s
I f Not . BOF Then . MoveFi r st
Whi l e Not . EOF
nomeCompl et o = . Fi el ds( t t ul o) & " " & . Fi el ds( pr i Nome) _
& " " & . Fi el ds( sobr enome)
f r mDB. cboNome. AddI t emnomeCompl et o
. MoveNext
Wend
End Wi t h

7
Este um banco de dados gratuto que acompanha o MS Office e serve de base para vrios exemplos dados no Office.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
49
End Sub
Aqui, utilizamos o bloco Wi t h- End Wi t h com o Recor dset (rs) para trabalhar com as
propriedades e mtodos da classe. Primeiramente, checamos para saber se estamos no incio do
arquivo (I f Not . BOF
8
), pois no queremos iniciar o l oop a meio caminho. Se no for
verdadeiro, move-se para o primeiro registro (MoveFi r st ). Feita a checagem, iniciamos o l oop
utilizando EOF.
O nome completo do funcionrio composto pelo ttulo, primeiro nome e sobrenome. A cada
passo do l oop um nome completo adicionado nossa combobox.
Finalmente, terminamos o nosso cdigo fechando todas as conexes:
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
f r mDB. cboNome. Li st I ndex = 0
r s. Cl ose: Set r s = Not hi ng
conn. Cl ose: Set conn = Not hi ng
End Sub
Na prpria sub-rotina, o primeiro valor da combobox o valor cujo ndice zero. Observe que
utilizei os dois-pontos (: ) para colocar na mesma linha o fechamento e limpeza dos objetos r s e
conn. Se isso lhe parecer complicado para leitura, coloque cada um em sua devida linha e
remova os dois-pontos.
O nosso cdigo completa ficar, portanto:

8
BOF a abreviao em ingls de Beginning of File (Incio do Arquivo). O oposto EOF End of File.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
50
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
Di mconn As ADODB. Connect i on
Di mr s As ADODB. Recor dset

Set conn = New ADODB. Connect i on
conn. Open " Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=" _
& nomeBD & " ; "
Set r s = New ADODB. Recor dset

r s. Open " Sel ect * FROM " & Tabel a & " ORDER BY Fi r st Name" , conn
sobr enome = " Last Name" : pr i Nome = " Fi r st Name"
t t ul o = " Ti t l eOf Cour t esy"

Wi t h r s
I f Not . BOF Then . MoveFi r st
Whi l e Not . EOF
nomeCompl et o = . Fi el ds( t t ul o) & " " & . Fi el ds( pr i Nome) _
& " " & . Fi el ds( sobr enome)
f r mDB. cboNome. AddI t emnomeCompl et o
. MoveNext
Wend
End Wi t h

f r mDB. cboNome. Li st I ndex = 0

r s. Cl ose: Set r s = Not hi ng
conn. Cl ose: Set conn = Not hi ng
End Sub
Os dados foram carregados para a combobox e agora precisamos distribu-los para as caixas de
texto em nosso formulrio. Novamente, estaremos criando uma sub para conectar ao nosso banco
de dados. Porm, desta vez, desejamos filtrar os dados de acordo com o um critrio qualquer.
Para este exemplo, utilizaremos o primeiro nome (Fi r st Name). Contudo, o filtro pode ser feito
com qualquer um dos campos disponveis na tabela.
Como j passamos pelo processo de conexo ao BD, vamos direto ao cdigo para filtrar os
dados:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
51
Sub At ual i zar Dados( nomeBD As St r i ng, Tabel a As St r i ng, _
f i l t r o As St r i ng)

Di mconn As ADODB. Connect i on
Di mr s As ADODB. Recor dset

Set conn = New ADODB. Connect i on
conn. Open " Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=" _
& nomeBD & " ; "

Set r s = New ADODB. Recor dset

r s. Open " SELECT * FROM " & Tabel a & " WHERE Fi r st Name = ' " _
& f i l t r o & " ' " , conn, , , adCmdText

Wi t h f r mDB
. t xt End. Text = r s. Fi el ds( " Addr ess" )
. t xt Ci dade. Text = r s. Fi el ds( " Ci t y" )
. t xt CEP. Text = r s. Fi el ds( " Post al Code" )
. t xt Fone = r s. Fi el ds( " HomePhone" )
. t xt Memo = r s. Fi el ds( " Not es" )
End Wi t h

r s. Cl ose: Set r s = Not hi ng
conn. Cl ose: Set conn = Not hi ng
End Sub
Aqui, pouco muda. A maior diferena est no argumento adicional da sub-rotina (f i l t r o) e em
como abrimos o Recor dset (r s). Desta vez, ao invs de selecionar tudo na tabela, selecionamos
da tabela (Sel ect *Fr om Tabel a) onde (Wher e) os registros sejam iguais ao f i l t r o. Feita a
seleo dos itens que compem o registro, distribumos estes campos para as respectivas caixas
de textos.
Com as duas sub-rotinas prontas, precisamos agora coloc-las em uso. Primeiramente,
carregaremos os itens para a combobox:
Pr i vat e Sub User For m_I ni t i al i ze( )
car r egar Dados Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. mdb" , " Empl oyees"
End Sub
Ao chamar a rotina que carrega os dados, entramos os dois argumentos pertencentes a sub-
rotina, isto , o nome do banco de dados e a tabela que desejamos pesquisar.
Quando selecionamos um nome novo em nossa combobox, queremos que os dados do
funcionrios sejam filtrados de acordo com o primeiro nome. Para tanto, utilizamos o evento
Change de nossa combobox para fazer isso:
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
52
Pr i vat e Sub cboNome_Change( )
pr i Nome = Spl i t ( cboNome. Text , " " )
At ual i zar Dados Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. mdb" , _
" Empl oyees" , CSt r ( pr i Nome( 1) )
End Sub
Mais uma vez precisamos chamar a rotina e acrescentar os argumento. Neste caso especfico,
estamos usando o primeiro nome. Para obter o primeiro nome, utilizei a funo Spl i t
9
para
separar os trs itens que compem o nome completo. Como Spl i t retorna uma matriz e a base
zero, o ttulo est na posio 0, o primeiro nome na posio 1 e o sobrenome na posio 2. O
valor retornado e convertido para St r i ng (CSt r ), pois o argumento da sub-rotina uma St r i ng.
A nossa conexo est feita. O primeiro nome da lista mostrado quando acionamos o formulrio:

Figura 9-3
Ao escolher um outro nome qualquer, as informaes so atualizadas nos respectivos objetos:

9
A funo Split no est disponvel nas verses anteriores ao Excel 2002.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
53

Figura 9-4
OK, conectamos ao banco de dados, maneiro... mas s estamos lendo e nada mais. Embora seja
interessante ler as informaes, interessante tambm manipular tais informaes. Isto , como
acrescentamos um novo funcionrio a nossa lista?
Antes de iniciarmos a nossa prxima questo, observe que estamos filtrando por primeiro nome.
O que ocorre quando o primeiro igual? Bom, temos um grande problema! A verdade que
nomes se repetem com muita freqncia e precisamos utilizar algo que seja nico no filtro. A
figura abaixo mostra o que ocorre quando nomes so repetidos:

Figura 9-5
Ao invs de mostrar os dados para Robert Martin, ele mostra para Robert King.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
54
Para resolver o problema, utilizaremos a chave-primria, pois ela nos fornece um nmero nico
em toda a tabela de funcionrios.
O modelo desenvolvido adiante pode ser acessado em For m9. xl s. No abra o Form8 e Form9
simultaneamente. Embora cada um faa coisas distintas, ambos os arquivos contm os mesmos
formulrios, com os mesmos nomes e sub-rotinas . Isso causar erros durante execuo.
Antes de continuarmos, contudo, precisaremos modificar algumas coisas em nosso formulrio.
Primeiramente modifique as seguintes propriedades da combobox, conforme a figura:

Figura 9-6
A primeira coluna da combobox guardar a chave-primria. Ao definir BoundCol umn como sendo
2, estaremos mostrando o nome do funcionrio ao invs da chave-primria. Defina a largura das
colunas (Col umnWi dt hs) conforme a necessidade. Feita as mudanas, precisamos modificar
algumas coisas em nosso cdigo, conforme abaixo:
Pr i vat e Sub cboNome_Change( )
I D = cboNome. Li st ( cboNome. Li st I ndex, 0)
At ual i zar Dados Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. mdb" , _
" Empl oyees" , CLng( I D)
End Sub
O ID definido como sendo o valor que se encontra no ndice x da combobox na coluna 1
(coluna 0, pois estamos usando Opt i on Base 0). Como na tabela o tipo de dado para o I D
Long (Longo) precisamos convert-lo para evitar erro, pois os tipos de dados precisamos ser os
mesmos.
O cdigo para carregamento dos dados para a combobox tambm precisa ser modificado. As
modificaes no sero muitas, mas precisamos nos assegurar que os dados sero passados
corretamente.
O cdigo completo repetido abaixo (as partes novas em itlico):
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
55
Sub car r egar Dados( nomeBD As St r i ng, Tabel a As St r i ng)
Di mconn As ADODB. Connect i on
Di mr s As ADODB. Recor dset
Dim List()

Set conn = New ADODB. Connect i on
conn. Open " Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=" _
& nomeBD & " ; "
Set r s = New ADODB. Recor dset

r s. Open " Sel ect * FROM " & Tabel a & " ORDER BY Fi r st Name" , conn
sobr enome = " Last Name" : pr i Nome = " Fi r st Name"
T t ul o = " Ti t l eOf Cour t esy"

If Not rs.BOF Then rs.MoveFirst
n = 0
While Not rs.EOF
n = n + 1
rs.MoveNext
Wend

ReDim List(n - 1, 1)
i = 0

Wi t h r s
I f Not . BOF Then . MoveFi r st
Whi l e Not . EOF
nomeCompl et o = . Fi el ds( T t ul o) & " " & . Fi el ds( pr i Nome) _
& " " & . Fi el ds( sobr enome)
List(i, 0) = .Fields("EmployeeID")
List(i, 1) = nomeCompleto
'Debug.Print List(i, 0) & " " & List(i, 1)
i = i + 1
. MoveNext
Wend
End Wi t h

With frmDB
.cboNome.List = List
.cboNome.ListIndex = 0
End With

r s. Cl ose: Set r s = Not hi ng
conn. Cl ose: Set conn = Not hi ng
End Sub
A primeira modificao refere-se a nova varivel Li st . O primeiro loop apenas serve para contar
o nmero de registros na vertical. Aps a contagem, a matriz Li st redimensionada e passa a
ter (n1) linhas e duas colunas.
O prximo loop completa a matriz Li st com os dados que desejamos na coluna 1 (ndice =0) e
coluna 2 (ndice = 1). O Debug. Pr i nt utilizei para assegurar que a matriz estava sendo
preenchida corretamente.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
56
Finalmente, com o formulrio, defino a lista da combobox como sendo a Li st e inicio a
combobox no ndice 0.
Agora, precisamos modificar algumas coisas na rotina que filtra os dados. Desta vez, ser
repetido somente a parte modificada. Novamente, as partes crticas esto em itlico:
Sub At ual i zar Dados( nomeBD As St r i ng, Tabel a As St r i ng, filtro As Long)
r s. Open " SELECT * FROM " & Tabel a & " WHERE EmployeeID =" _
& filtro, conn, , , adCmdText
End Sub
A primeira modificao refere-se ao tipo de dado do filtro. Anteriormente, utilizamos St r i ng.
Como estamos avaliando um valor numrico Long, o filtro definido como longo. A prxima
modificao no SQL. Aqui, necessrio retirar o apstrofo (). Se deixarmos o apstrofo como
no primeiro exemplo, haver um erro por incompatibilidade no formato dos dados.
Resolvido o problema da leitura dos dados, partiremos para o cdigo que apagar e atualizar
registros no banco de dados.
Crie os novos botes conforme a figura abaixo:

Figura 9-7
Para o cdigo do boto de remoo (Del. Registro), entraremos o seguinte cdigo:
Pr i vat e Sub cmdApagar _Cl i ck( )
I D = cboNome. Li st ( cboNome. Li st I ndex, 0)
del Regi st r o Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. mdb" , _
" Empl oyees" , CLng( I D)
End Sub
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
57
Como podemos ver o cdigo igual ao utilizado na combobox, pois estamos procurando o
funcionrio referente I D para apag-lo do BD. A evento chama o sub-rotina del Regi st r o.
Como j estamos proficientes em conexes ao BD, o cdigo fica:
Sub del Regi st r o( nomeBD As St r i ng, Tabel a As St r i ng, f i l t r o As Long)

Msg = " Ao apagar umr egi st r o, voc no t er como desf azer a oper ao! "
Msg = Msg & vbCr & vbCr & " Voc t emcer t eza que desej a cont i nuar ?"

Est i l o = vbYesNo + vbI nf or mat i on + vbDef aul t But t on2
T t ul o = " Apagar r egi st r o. . . "

Res = MsgBox( Msg, Est i l o, T t ul o)

I f Res = vbNo Then Exi t Sub

Di mconn As ADODB. Connect i on
Di mr s As ADODB. Recor dset

Set conn = New ADODB. Connect i on
conn. Open " Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=" _
& nomeBD & " ; "

Set r s = New ADODB. Recor dset

r s. Open " DELETE * FROM " & Tabel a & " WHERE Empl oyeeI D = " _
& f i l t r o, conn, , , adCmdText

Set r s = Not hi ng
conn. Cl ose
Set conn = Not hi ng
car r egar Dados Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. mdb" , " Empl oyees"
End Sub
Antes de tudo, queremos saber se o usurio realmente deseja apagar o registro. Se sim, o
processo continua caso contrrio a sub-rotina cancelada
10
.
A nica coisa nova o SQL. Ao invs de SELECT, utilizamos DELETE para apagar o registro. A
ltima linha recarrega os dados.
Estamos quase chegando ao final de nossa longa jornada no mundo do Excel e Access. Para
terminar, veremos como acrescentar um novo item ao nosso banco de dados. Para isso, foi criado
um novo formulrio, conforme o modelo abaixo:

10
Exemplos com o estilo de MsgBox utilizado podem ser encontrados no Ajuda do VBA (procure por MsgBox Function)
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
58

A combobox Ttulo utiliza os Ti t l esOf Cour t esy do banco de dados. Adicione os ttulos
utilizando um dos mtodos j ensinados.
Para o boto Novo Registro, entraremos o seguinte cdigo:
Pr i vat e Sub cmdNovo_Cl i ck( )
novoRegi st r o Thi sWor kbook. Pat h & " \ DB\ FPNWI ND. mdb" , " Empl oyees"
End Sub
Aqui, estamos chamando a sub-rotina novoRegi st r o da mesma forma que fizemos com todas
as sub-rotinas anteriores:
Sub novoRegi st r o( nomeBD As St r i ng, Tabel a As St r i ng)
Di mconn As ADODB. Connect i on
Di mr s As ADODB. Recor dset

Set conn = New ADODB. Connect i on
conn. Open " Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=" _
& nomeBD & " ; "

Set r s = New ADODB. Recor dset

r s. Open Tabel a, conn, adOpenKeyset , adLockOpt i mi st i c, adCmdTabl e

Wi t h f r mNovoReg
r s. AddNew
r s. Fi el ds( " Ti t l eOf Cour t esy" ) = . t xt T t ul o
r s. Fi el ds( " Last Name" ) = . t xt Sobr enome
r s. Fi el ds( " Fi r st Name" ) = . t xt Pr i Nome
r s. Fi el ds( " Addr ess" ) = . t xt End
r s. Fi el ds( " Ci t y" ) = . t xt Ci dade
r s. Fi el ds( " Post al Code" ) = . t xt CEP
r s. Fi el ds( " HomePhone" ) = . t xt Fone
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
59
r s. Fi el ds( " Not es" ) = . t xt Memo
r s. Updat e
End Wi t h

Set r s = Not hi ng
conn. Cl ose
Set conn = Not hi ng

MsgBox " Regi st r o adi ci onado comsucesso! " , vbI nf or mat i on, _
" Regi st r o adi ci onado. . . "
Unl oad f r mNovoReg
f r mDB. Show 0
End Sub
Feito. Um novo registro adicionado tabela do banco de dados.
Em todas as sub-rotinas utilizadas para conexo ao BD, as rotinas requerem passagem de
parmetros antes de continuar. Isso no necessrio. Se o leitor desejar rodar toda a sub-rotina
sem a passagem de parmetros basta colocar os parmetros dentro da prpria sub-rotina.
A passagem de parmetros flexibiliza a manipulao dos parmetros que desejamos avaliar.
Terminamos aqui mais um passeio pelo mundo do Excel.
Srie Como Fazer: Formulrios no Excel utilizando VBA Listbox e Combobox
Autor: Rober t F Mar t i m Criado em: 3/ 6/ 2004 11: 03: 00
Publicado: www. j ul i obat t i st i . com. br ltima edio: 3/ 7/ 2004 20: 18: 00
Contato: r m@f ai r cour t . com
60
10. 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 Governncia 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 Excel e VBA na Model agemFi nancei r a: Uma abor dagempr t i ca (no
prelo). Editora Axcel Books, 2004.
Colaborador ativo do frum Excel Avanado do site www.jliobattisti.com.br, onde divide seu
conhecimento e experincia com outros membros do espao.