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.