Desenvolvimento - Office

Excel - Enviando email: listbox-combobox

Este é mais uma artigo da série sobre o MS Office para o Linha de Código. Aqui, será mostrado como utilizar o VBA no Excel para interagir com o Outlook.

por Robert Martim



Este é mais uma artigo da série que escrevo sobre o MS Office para o Linha de Código. Aqui, mostrarei como utilizar o VBA no Excel para interagir com o Outlook. Este artigo é retirado do CD de treinamento comercializado pelo Linha de Código. Aos leitores interessados, o CD completo de treinamento pode ser adquirido em http://shop.linhadecodigo.com.br/treinamento.asp?id=297. Alternativamente, você pode adquirir somente o módulo que contém este artigo em http://shop.linhadecodigo.com.br/treinamento.asp?id=305. O módulo trata de tudo que você precisará saber sobre Listboxes e Comboboxes. Ele é composto de 65 páginas e cobre somente estes assuntos. Além disso, o leitor receberá 13 pastas de trabalho com todo o código fonte pronto para utilização.

Para os usuários do MS Office, interagir com outros aplicativos deste pacote é crucial. Neste artigo, mostrarei como isso pode ser feito com o Outlook.

Aqui, veremos como carregar para uma listbox os e-mails e nomes dos contatos contidos em seu Outlook. Além disso, como bônus, uma pasta de trabalho contendo um pequeno aplicativo para envio de e-mail do Excel foi criado o qual está disponível com o módulo de treinamento.

Para iniciar, crie um formulário e adicione os controles conforme a figura abaixo:

Figura 1 - Formulário inicial

A caixa da esquerda é uma listbox e as três caixas da direita são textboxes. Este layout foi escolhido para manter um formato similar ao do Outlook 2002 (Outlook XP).

Os objetivos deste exercício é listar os contatos e respectivos e-mails do Outlook.

Para se acessar os objetos do Outlook podemos ir no escuro ou utilizar a referência a biblioteca do Outlook[1]. Embora a utilização da biblioteca do Outlook facilite a nossa vida, estaremos criando o nosso código no escuro. O motivo por esta escolha é para evitar incompatibilidade entre sistemas dos leitores. Como não temos o benefício da biblioteca, teremos que criar os objetos. Os objetos que precisaremos neste caso são:

· olApp (O aplicativo Outlook)

· olNameSpace (NameSpace referente ao Outlook)

· olContatos (os contatos)

· olListaEnd (Lista de endereços)

· olItensEnd (Itens da lista de endereços – olListaEnd)

O prefixo “ol” é para identificar os objetos relacionados ao Outlook Application (olApp). Como o código é relativamente extenso, é interessante utilizar Option Explicit[2] para evitar erro em nossas variáveis.

Primeiramente, vamos dimensionar os nossos objetos:

Private Sub UserForm_Initialize()

Dim olApp As Object "Aplicativo

Dim olNameSpace As Object "NameSpace[3]

Dim olContatos As Object "Itens

Dim olListaEnd As Object "Lista de endereços

Dim olItensEnd As Object "Itens da lista de endereços

End Sub

Como não temos a biblioteca, todos os itens são tratados como objetos quaisquer. Com os objetos dimensionados, precisamos criá-los para que o código possa fazer sua mágica. O primeiro objeto a ser criado é o olApp (o código segue a ordem de desenvolvimento e os códigos anteriores não serão repetidos):

Private Sub UserForm_Initialize()

"A declaração 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 são 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 padrão é 1

Set olListaEnd = olNameSpace.AddressLists("nomeDaPasta")

"Os itens contidos na lista (Entries) são definidos em cima da lista

Set olItensEnd = olListaEnd.AddressEntries

End Sub

A lista de nossa listbox será carregada a partir de uma matriz (utilizaremos a propriedade List para isso). Desta forma precisamos criar tal matriz. Como não 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

Uma vez carregada a matriz, nosso trabalho está quase pronto. Como criamos vários objetos na memória de nosso computador, não é uma boa idéia 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 código 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 endereços

Dim olItensEnd As Object "Item da lista de endereços

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 padrão:

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 formulário, após rodarmos o código, carrega os dados de todos os contatos em nosso catálogo de endereços:

Figura 2 - Lista carregada do catálogo de endereços

Para evitar problemas com a minha lista de e-mails, foi necessário obliterar os detalhes.

Conclusão

Neste curto artigo, mostro como interagir com o Outlook a partir do Excel. Não obstante, o código é em VBA e, portanto, pode ser utilizado em qualquer um dos aplicativos que fazem parte do MS Office.

O código final utilizado no módulo de treinamento deste exemplo contém rotinas para lidar com erros e dá a flexibilidade de se escolher o catálogo de endereço (AddressBook) a ser utilizado. Além disso, a pasta de trabalho contém um outro formulário que permite o usuário 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 permissão para cada mensagem enviada. A utilização do servidor SMTP virtual resolve o DNS (Domain Name Server) e envia a mensagem sem a necessidade do “prompt” do Outlook.

Se o leitor deseja saber mais sobre como utilizar listboxes e comboboxes no Excel, como interagir com o Outlook e Access utilizando estes controles, adquira já o seu módulo por apenas R$10, para download imediato, na loja do Linha de Código http://shop.linhadecodigo.com.br/treinamento.asp?id=305. Além do exemplo completo acima, há muito mais exemplos que poderão ser imediatamente utilizados em seus projetos. Se preferir a série completa de treinamento, ela pode ser adquirida por apenas R$89 em http://shop.linhadecodigo.com.br/treinamento.asp?id=297.

[1] Pra se fazer uma referência aos objetos do Outlook vá até Ferramentas --> Referências e selecione Microsoft Outlook <versão> Object Library.

[2] Para forçar Option Explicit em todos os trabalhos vá até Ferramentas --> Opções --> Editor e selecione “Requer Declaração de Variáveis”.

[3] Namespace é um conjunto de nomes no qual todos os nomes são únicos.

Robert Martim

Robert Martim - Formado e Pós-Graduado em Finanças pela Universidade de Londres, Reino Unido. Diretor de TI da Faircourt Capital Limited (Reino Unido). Fornece suporte pro bono em TI à entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora Organisation Europe) desde 2001. Colaborador ativo do fórum Excel Avançado do site www.juliobattisti.com.br, onde divide seu conhecimento e experiência com outros membros do espaço.
Autor do livro Excel e VBA na Modelagem Financeira: Uma abordagem prática.