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

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

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

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

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

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

1 ответ1

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 всегда вставляет директиву в каждый созданный модуль.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .