我正在尝试编写一个程序,列出 Outlook 电子邮件分发列表的成员。
我发现 VBA 似乎有一些对象可以实现这一点,但我还不能让它工作。我研究过这篇微软文章在 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”
谁能看出问题出在哪里?
答案1
您的代码无法正常工作的原因在于,当您访问具有后期绑定的库时(例如通过使用)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 将始终在创建的每个模块中插入该指令。
答案2
我遇到了同样的问题,并尝试使用 Set OA = Outlook.Application 来替换 Set OA = CreateObject("Outlook.Application")
我正在使用 Microsoft Office 365 和 Outlook 365 系统。而且它可以正常工作。