【问题标题】:VBA, Outlook, Seeing 'People's CalendarsVBA,Outlook,查看“人们的日历”
【发布时间】:2011-08-03 02:37:21
【问题描述】:

我正在尝试以编程方式(使用 VBA)访问其他人与我共享的日历。它们列在我的 Outlook 中的“人员日历”下。我已经在网上搜索过这个,所有的建议都只是让我感到困惑。如何从“人民的日历”中获取共享给我的所有日​​历的列表,然后是一个特定的日历?

【问题讨论】:

    标签: vba outlook calendar


    【解决方案1】:

    查看以下代码的返回值。它按姓名搜索人,就像您在新电子邮件中键入收件人时一样,然后抓取该人的共享日历并枚举所有共享约会。

    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
    

    【讨论】:

    • 谢谢。我总是在“GetSharedDefaultFolder”调用中收到“操作失败”。我使用的“姓名”是与我共享日历的人。我忽略了什么?
    • 确保向 GetSharedDefaultFolder 传递已解析的 Outlook.Recipient 对象,而不仅仅是“名称”字符串。
    • 除非 '_recipient.Resolved' 成功,否则我无法访问 GetSharedDefaultFolder,对吗?一个观察结果是,在 Outlook 2007 中,“人员日历”不会在文件夹列表视图中显示为共享文件夹。有问题吗?
    • 如果您以前从未查看过此人的共享文件夹,这不是问题。只有以前查看过的共享文件夹才会显示在小外观的“人物日历”部分中。通常,可以打开任何已解决联系人的日历。如果他们不共享他们的日历,那么它就不会包含任何约会,但它仍然会返回。
    • 该解决方案对我来说效果很好 - 唯一要提到的是 VBA 不喜欢变量名中的下划线前缀(例如,将 _recipient 更改为 recipient)。在我删除它们之后,它就可以工作了。
    【解决方案2】:

    我认为这更接近了。它来自 Sue Mosher 出色的 Microsoft Outlook 2007 Programming: Jumpstart for Power Users and Administrators。我希望她不会介意。

    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
    

    【讨论】:

      【解决方案3】:

      只是一个建议,以帮助可能尝试使用此处发布的 ShowOtherUserCalFolders() 代码的人。此代码将创建多个隐藏的 Outlook 实例,如果多次运行这些实例最终可能会使您的机器陷入困境。您可以调用当前打开的应用程序,而不是创建新的 Outlook.application(Outlook 必须打开才能工作)。

      为此,将Dim objOL As Outlook.Application 替换为Dim objOL as Object,将Set objOL = Application 替换为Set myOlApp = GetObject(, "Outlook.Application")

      还要确保关闭 objExpCal Explorer,因为这也会创建一个隐藏的 Outlook 实例,请将 objExpCal.Close 添加到代码末尾。

      【讨论】:

      • 由于代码将在 Outlook 中运行,因此该代码与 Outlook 的现有实例挂钩,而不是创建新实例。 ForEachLoop 发布的代码绝不会创建多个 Outlook 实例。 Outlook 是一个单实例类。更多解释请参见stackoverflow.com/questions/6481398/…
      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2019-01-19
      相关资源
      最近更新 更多