我正在尝试从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 :(得分: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
如果要对日历文件夹进行更改,实际上非常重要,因为这两种对象类型具有不同的属性和方法。