2017-02-16 113 views
1

我想从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对象并不是什么都没有,但是它找不到。

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

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

+0

试一下这个'设置olFolder = olNameSpace.GetSharedDefaultFolder(olFldrOwner,olFolderCalendar).Folders(“运输附表”)'让我知道 – 0m3r

+0

当我尝试如你所说,现在无法上线,以同样“没有找到对象'错误。这实际上是这条线的原始写法,在阅读另一个答案之后,我已经将它分成两行来帮助调试。 – jvarnerus

回答

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 

其实是非常重要的。