无法更新共享的非默认日历文件夹

时间:2017-02-16 17:55:41

标签: vba excel-vba outlook-vba excel

我正在尝试从Excel工作表更新共享日历。我对这个共享日历的所有者的代码工作正常,但它对我来说失败了。日历已分享给我,我拥有完整的所有者权限。

我可以手动编辑日历而没有任何问题,但我们的想法是,任何人都可以从此Excel工作表中运行宏来更新共享日历。这是相关的代码,直到失败点:

Sub UpdateSched()

Dim olApp As Outlook.Application
Dim olNameSpace As Outlook.Namespace
Dim olFolder As Outlook.MAPIFolder
Dim olFldrOwner As Outlook.Recipient

On Error Resume Next
' check if Outlook is running
Set olApp = GetObject("Outlook.Application")
If Err <> 0 Then
  'if not running, start it
  Set olApp = CreateObject("Outlook.Application")
End If
On Error GoTo 0 

Set olNameSpace = olApp.GetNamespace("MAPI")
Set olFldrOwner = olNameSpace.CreateRecipient("ownrAlias")
    olFldrOwner.Resolve

Set olFolder = Nothing  

If olFldrOwner.Resolved Then
    Set olFolder = olNameSpace.GetSharedDefaultFolder(olFldrOwner, olFolderCalendar)

'    If olFolder Is Nothing Then
'        Debug.Print "Nothing"
'    Else
'        Debug.Print olFolder.Name  '<-Error here if the if-block is run
'    End If

    '******************************
    Set olFolder = olFolder.Folders("Transport Sched") '<-Object Not Found Error
    '******************************
End If

'Code below updates appointments on the shared calendar

完整错误是'尝试的操作失败。无法找到对象'

为了测试,我添加了注释掉的块。这让我觉得错误可能实际上在前一行。当该块未被注释时,代码在Else之后出错(相同的错误)。所以olFolder对象不是什么都没有,但是找不到它。

再一次,当日历的所有者运行它时,一切正常。它在“共享日历”下面,我收到了错误。如果我使用相同的代码来更新我创建的日历,那也可以正常工作,这是在“我的日历”下。

找到共享日历的正确文件夹是一个问题,对吧?该文件夹的路径不应该改变,所以我可以对其进行硬编码以使其适用于所有人,这可能吗?

1 个答案:

答案 0 :(得分:1)

我想出了一个解决我的问题的方法,但其方式完全不同于我尝试使用问题中列出的代码。如果其他人需要它,这是解决方案:

Sub ListCalendars()
Dim olApp As Outlook.Application
Dim olPane As Outlook.NavigationPane
Dim olModule As Outlook.CalendarModule
Dim olGroup As Outlook.NavigationGroup
Dim olNavFolder As Outlook.NavigationFolder
Dim olFolder As Folder
Dim i As Integer, j As Integer

On Error Resume Next
' check if Outlook is running
Set olApp = GetObject("Outlook.Application")
If Err <> 0 Then
    'if not running, start it
    Set olApp = CreateObject("Outlook.Application")
End If
On Error GoTo 0

Set olPane = olApp.ActiveExplorer.NavigationPane
Set olModule = olPane.Modules.GetNavigationModule(olModuleCalendar)
Set olGroup = olModule.NavigationGroups.GetDefaultNavigationGroup(olMyFoldersGroup)

'Dummy Do loop allows exit from within nested For-Next loops
Do
For i = 1 To olModule.NavigationGroups.Count        'Cycle through all Nav Groups
    Set olGroup = olModule.NavigationGroups.Item(i)
    Debug.Print olGroup.Name

    For j = 1 To olGroup.NavigationFolders.Count    'Cycle through all calendars in group
        Set olNavFolder = olGroup.NavigationFolders.Item(j)
        Debug.Print " - " & olNavFolder.DisplayName

        'Un-comment If-block below if searching for a particular calendar:
            'CalendarName is the name of the calendar,as listed in your navigation pane
'            If olNavFolder.DisplayName = "CalendarName" Then
'            Debug.Print "Found it!"
'            Set olFolder = olNavFolder.Folder 'To get folder object from NavigationFolder
'            Exit Do
'        End If

    Next
Next
Exit Do 'To prevent endless loop
Loop While True

'If-block below displays results if looking for matching calendar name
'If olFolder Is Nothing Then
'    Debug.Print vbNewLine & "No match found"
'Else
'    Debug.Print vbNewLine & "Matching calendar found: " & olFolder.Name
'End If

End Sub

此代码已从this page here修改。基本上,访问其他人的日历文件夹对象直接给了我问题,即使日历已被共享。通过使用各种导航对象,我能够循环浏览导航窗格中列出的所有日历,包括所有共享日历。

如此规定,此例程仅列出主文件夹和一级子文件夹。如果取消注释两个if块,则例程将搜索具有给定名称的日历(仅替换CalendarName),并将显示是否找到匹配项。

虚拟Do循环是打破嵌套循环的一种方法。还有其他多种方法可以完成此列出in this SO question

另一个棘手的问题是NavigationFolder对象与Folder对象不同。这看似无关紧要的路线:

Set olFolder = olNavFolder.Folder
如果要对日历文件夹进行更改,

实际上非常重要,因为这两种对象类型具有不同的属性和方法。