Não é possível fazer com que o objeto de aplicativo do Outlook funcione

0

Estou tentando escrever um programa que lista os membros de uma lista de distribuição de e-mail do Outlook.

Descobri que o VBA parece ter objetos que podem tornar isso possível, mas ainda não consegui fazê-lo funcionar. Eu estudei este artigo da Microsoft no objeto Aplicativo do Outlook , este sobre o método GetDefaultFolder , e muitos outros materiais de referência, e surgiu o seguinte programa:

Set Application = CreateObject("Outlook.Application")
Set myNameSpace = Application.GetNameSpace("MAPI") 
Set myFolder = myNameSpace.GetDefaultFolder(olFolderContacts) 
myFolder.Display

No entanto, quando executo isso usando wscript ou cscript, recebo o seguinte:

Microsoft VBScript runtime error: Invalid procedure call or argument: 'myNameSpace.GetDefaultFolder'

Alguém pode ver qual é o problema?

    
por fireblood 23.06.2018 / 22:20

1 resposta

2

O motivo pelo qual seu código não está funcionando porque, quando você está acessando uma biblioteca com ligação tardia, por exemplo, usando CreateObject("Outlook.Application") , as enumerações construídas na biblioteca não estão disponíveis.

Como você não usou a diretiva Option Explicit , o Excel declarou automaticamente olFolderContacts como uma variável do tipo Variant com um valor Empty . Esse é o argumento inválido ao qual a mensagem de erro está se referindo.

Se você deseja continuar usando ligação tardia, adicione o seguinte código para que as constantes estejam disponíveis:

  'v0.1.1
  ' Required if late binding Outlook
  ' (Note that this list excludes newer values available in Outlook 2010 or later)
  Private Enum OlDefaultFolders
    olFolderDeletedItems = ------------3
    olFolderOutbox = ------------------4
    olFolderSentMail = ----------------5
    olFolderInbox = ------------------(6)
    olFolderCalendar = ----------------9
    olFolderContacts = --------------(10)
    olFolderJournal = ----------------11
    olFolderNotes = ------------------12
    olFolderTasks = ------------------13
    olFolderDrafts = ----------------(16)
    olPublicFoldersAllPublicFolders = 18
    olFolderConflicts = --------------19
    olFolderSyncIssues = ------------(20)
    olFolderLocalFailures = ----------21
    olFolderServerFailures = --------(22)
    olFolderJunk = ------------------(23)
    olFolderRssFeeds = --------------(25)
    olFolderToDo = ------------------(28)
    olFolderManagedEmail = ----------(29)
  End Enum

ou codifique os valores:

'v0.1.0
Set OutlookApp = CreateObject("Outlook.Application")
Set myNamespace = OutlookApp.GetNameSpace("MAPI")
Set myFolder = myNamespace.GetDefaultFolder(10)
myFolder.Display

Observe que alterei o nome da variável para o objeto Aplicativo do Outlook para evitar qualquer confusão com o objeto Application incorporado.


Acho melhor, pelo menos enquanto desenvolvo o código, usar a vinculação antecipada. Você faz isso adicionando uma referência à biblioteca de objetos do Outlook no projeto:

eusandooseguintecódigo:

'v0.1.0DimOutlookAppAsOutlook.ApplicationSetOutlookApp=NewOutlook.ApplicationDimmyNamespaceAsOutlook.NamespaceSetmyNamespace=OutlookApp.GetNameSpace("MAPI")
Dim myFolder As Outlook.MAPIFolder
Set myFolder = myNamespace.GetDefaultFolder(olFolderContacts)
myFolder.Display

Uma dica final é sempre usar a diretiva Option Explicit e sempre declarar explicitamente todas as suas variáveis.

A melhor maneira de garantir isso é definir a opção Require Variable Declaration :

Dessa forma, o VBE sempre inserirá a diretiva em todos os módulos criados.

    
por 24.06.2018 / 06:14