Причина, по которой ваш код не работает, потому что, когда вы обращаетесь к библиотеке с поздним связыванием, например, с помощью 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 всегда вставляет директиву в каждый созданный модуль.