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