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 MartimPara 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.
- Data Bars para MS-AccessAccess
- Funcionalidades do Office usando Visual Studio for Office – Parte 3C#
- Funcionalidades do Office usando Visual Studio for Office - Parte 2C#
- Estenda as funcionalidades do Office com o Visual Studio for OfficeC#
- Como evitar processos pendurados na automação do ExcelOffice