2011-04-11 35 views
2

我打算以編程方式(使用VBA)訪問其他人與我共享的日曆。他們被列在我的展望「人民日曆」下。我已經在網上搜索了這一點,所有的建議都只是讓我感到困惑。我如何獲得所有共享給我的日曆的列表,然後從「人員日曆」中選擇一個特定的日曆?VBA,Outlook,看到'人們的日曆

回答

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 
+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

0

我覺得這個更接近了。它來自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 
-1

只是一個建議,以幫助那些可能試圖使用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://stackoverflow.com/questions/6481398/vba-determining-whether-an-existing-outlook-instance-is-open。 – JimmyPena 2011-11-21 21:09:54