VBA,Outlook,看到'人们的日历

问题描述:

我打算以编程方式(使用VBA)访问其他人与我共享的日历。他们被列在我的展望“人民日历”下。我已经在网上搜索了这一点,所有的建议都只是让我感到困惑。我如何获得所有共享给我的日历的列表,然后从“人员日历”中选择一个特定的日历?VBA,Outlook,看到'人们的日历

检出以下代码返回的值。它按名称搜索某人,与将收件人键入新电子邮件时的方式相同,然后抓取该人共享日历并枚举所有共享约会。

Dim _namespace As Outlook.NameSpace 
Dim _recipient As Outlook.Recipient 
Dim calendarFolder As Outlook.Folder 

Set _namespace = Application.GetNamespace("MAPI") 
Set _recipient = _namespace.CreateRecipient(name) 
_recipient.Resolve 

If _recipient.Resolved Then 
    Set calendarFolder = _namespace.GetSharedDefaultFolder(_recipient, olFolderCalendar) 
    'This would display the calendar on the screen: 
    'calendarFolder.Display 

    Dim oItems As Outlook.Items 
    Set oItems = calendarFolder.Items 
    'oItems is now a set of all appointments in that person's calendar 
    'Play on 
End if 
+0

谢谢。我总是在'GetSharedDefaultFolder'调用中遇到'操作失败'。我使用的'姓名'是与我分享日历的人。我忽略了什么? – ForEachLoop 2011-04-12 15:22:14

+0

确保您传递了GetSharedDefaultFolder已解析的Outlook.Recipient对象,而不仅仅是一个“名称”字符串。 – Alain 2011-04-12 16:54:53

+0

除非'_recipient.Resolved'成功,否则我无法访问GetSharedDefaultFolder,是否正确?一种观察是,在Outlook 2007中,“人员日历”在文件夹列表视图中不显示为共享文件夹。那是问题吗? – ForEachLoop 2011-04-12 17:29:57

我觉得这个更接近了。它来自Sue Mosher出色的Microsoft Outlook 2007编程:为超级用户和管理员提供的Jumpstart。我希望她不介意。

Sub ShowOtherUserCalFolders() 
    Dim objOL As Outlook.Application 
    Dim objNS As Outlook.NameSpace 
    Dim objExpCal As Outlook.Explorer 
    Dim objNavMod As Outlook.CalendarModule 
    Dim objNavGroup As Outlook.NavigationGroup 
    Dim objNavFolder As Outlook.NavigationFolder 
    Dim objFolder As Outlook.Folder 
    Dim colExpl As Outlook.Explorers 
    Dim objExpl As Outlook.Explorer 
    Set objOL = Application 
    Set objNS = objOL.Session 
    Set colExpl = objOL.Explorers 
    Set objExpCal = _ 
     objNS.GetDefaultFolder(olFolderCalendar).GetExplorer 
    Set objNavMod = objExpCal.NavigationPane.Modules. _ 
     GetNavigationModule(olModuleCalendar) 
    Set objNavGroup = objNavMod.NavigationGroups. _ 
     GetDefaultNavigationGroup(olPeopleFoldersGroup) 
    For Each objNavFolder In objNavGroup.NavigationFolders 
     Set objFolder = objNavFolder.Folder 
     Set objExpl = _ 
      colExpl.Add(objFolder, olFolderDisplayNormal) 
     objExpl.Activate 
     objExpl.WindowState = olMaximized 
     objExpl.WindowState = olMinimized 
    Next 
    Set objOL = Nothing 
    Set objNS = Nothing 
    Set objNavMod = Nothing 
    Set objNavGroup = Nothing 
    Set objNavFolder = Nothing 
    Set objFolder = Nothing 
    Set colExpl = Nothing 
    Set objExpl = Nothing 
End Sub 

只是一个建议,以帮助那些可能试图使用ShowOtherUserCalFolders()代码发布在这里的人。这段代码将创建多个隐藏的Outlook实例,如果多次运行可能最终导致您的机器停滞不前。不要创建一个新的Outlook.application,你可以调用当前打开的一个(Outlook必须打开这个工作)。

要做到这一点与Dim objOL as ObjectSet objOL = Application取代Dim objOL As Outlook.ApplicationSet myOlApp = GetObject(, "Outlook.Application")

另外,还要确保你关闭objExpCal Explorer作为这也将创造前景的一个隐藏的实例,添加objExpCal.Close你的代码的末尾。

+0

因为代码将在Outlook中运行,所以代码挂钩到Outlook的现有实例中,而不是创建新代码。代码ForEachLoop绝不会创建多个Outlook实例。 Outlook是一个单一实例类。有关详细说明,请参阅http://*.com/questions/6481398/vba-determining-whether-an-existing-outlook-instance-is-open。 – JimmyPena 2011-11-21 21:09:54