Не удается заставить работать объект приложения Outlook

0

Я пытаюсь написать программу, в которой перечислены члены списка рассылки электронной почты Outlook.

Я обнаружил, что в VBA, похоже, есть объекты, которые могут сделать это возможным, но я пока не смог заставить его работать. Я изучил эту статью Microsoft об объекте приложения Outlook, эту статью о GetDefaultFolderметоде и многих других справочных материалах и разработал следующую программу:

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

Однако, когда я запускаю это с помощью wscript или cscript, я получаю следующее:

Ошибка времени выполнения Microsoft VBScript: неверный вызов процедуры или аргумент: «myNameSpace.GetDefaultFolder»

Кто-нибудь может увидеть в чем проблема?

fireblood
источник

Ответы:

2

Причина, по которой ваш код не работает, потому что, когда вы обращаетесь к библиотеке с поздним связыванием, например, с помощью CreateObject("Outlook.Application"), встроенные в библиотеку перечисления недоступны.

Поскольку вы не использовали Option Explicitдирективу, Excel автоматически объявляется olFolderContactsкак переменная типа Variant со значением Empty. Это неверный аргумент, на который ссылается сообщение об ошибке.

Если вы хотите продолжить использовать позднюю привязку, либо добавьте следующий код, чтобы константы были доступны:

  '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

или жестко запишите значения:

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

Обратите внимание, что я изменил имя переменной для объекта приложения Outlook, чтобы избежать путаницы со встроенным Applicationобъектом.


Я считаю, что по крайней мере при разработке кода лучше использовать раннее связывание. Это можно сделать, добавив ссылку на библиотеку объектов Outlook в проект:

Скриншот рабочего листа

и используя следующий код:

'v0.1.0
Dim OutlookApp As Outlook.Application
Set OutlookApp = New Outlook.Application
Dim myNamespace As Outlook.Namespace
Set myNamespace = OutlookApp.GetNameSpace("MAPI")
Dim myFolder As Outlook.MAPIFolder
Set myFolder = myNamespace.GetDefaultFolder(olFolderContacts)
myFolder.Display

Последний совет - всегда использовать Option Explicitдирективу и всегда явно объявлять все ваши переменные.

Лучший способ убедиться в этом - установить Require Variable Declarationопцию:

Скриншот рабочего листа

Таким образом, VBE всегда вставляет директиву в каждый созданный модуль.

robinCTS
источник
Отличный ответ! Я использовал четырехстрочный пример, который вы предоставили после высказывания «или жестко запишите значения», и он работал отлично. Спасибо!
огненная кровь
@fireblood Не за что. Не забывайте, что вы также можете объявить любые / все ответы, включая принятые, нажав на серый треугольник, направленный вверх, в верхнем левом углу ответа. Вы также можете поднять любой вопрос, который вы считаете полезным.
robinCTS
Хорошо сделанный ответ, я проголосовал. Я почти уверен, что это поможет моему бухгалтерскому приложению (VB6), которое недавно начало сбой с его интерфейсом контактов Outlook. Я искал решения раньше, но не смог найти никакой документации по этому вопросу, которая хорошо объяснена. Я бы отдал 100 голосов, если бы мог.
Билл Хайлеман
1
@BillHileman Знаете, вы всегда можете получить вознаграждение за любой вопрос и назначить его любому ответу на этот вопрос ;-) (вопрос должен быть не менее двух дней, прежде чем вы сможете это сделать :-()
robinCTS
Я убедился, что код, который я использую, по сути идентичен вашему примеру, за исключением того, что моя ссылка относится к версии 16, а не 12. Это, вероятно, моя проблема. Я получаю, что ActiveX не может создать объектную ошибку. По памяти MS просто говорит, что "это происходит" на некоторых машинах, вздох. Создать объект возвращает ту же ошибку. Ничего особенного для меня, но я мог бы продолжить это однажды. Спасибо за предложение.
Билл Хайлеман