使用 Excel VBA 从 Outlook 获取所有日历
Get all calendars from Outlook using Excel VBA
我想通过 VBA 使用 Excel 文件从当前 Outlook 会话中读取所有可用的非共享日历。
我加载了默认日历:
Set Calendar = outApp.GetNamespace("Mapi").GetDefaultFolder(9)
我似乎是通过在 VBA 编辑器的局部变量视图中手动浏览 Outlook 会话对象来找到可用日历的。到达那里的路径(通过所有会话、文件夹和项目层次结构)对于每个用户来说显然是不同的。所以我目前最好的解决方案是抓取整个对象,直到找到一个有效的日历。有更好的解决方案吗?
我的目标是识别当前 Outlook 会话中的所有可用日历,并让用户选择在哪个日历中添加新约会。
我使用以下代码添加约会:
Public Sub AddOutlooktermin(subject As String, _
startDateTime As Date, _
endDateTime As Date, _
body As String, _
location As String, _
allDayEvent As Boolean, _
reminderMinutes As Integer, _
setReminder As Boolean, _
busyStatus As Integer _
)
Dim outApp As Object, apptoutapp As Object
Set outApp = CreateObject("Outlook.Application")
Set apptoutapp = outApp.CreateItem(1) 'olAppointmentItem)
With apptoutapp
.Start = startDateTime
.End = endDateTime
.subject = subject
.body = body
.location = location
.allDayEvent = allDayEvent
.reminderMinutesBeforeStart = reminderMinutes
.ReminderSet = setReminder
.busyStatus = busyStatus
.Categories = "#Urlaub"
.importance = 2
.Save
End With
Set apptoutapp = Nothing
Set outApp = Nothing
End Sub
您可以在 Outlook 文件夹树中的任意位置创建日历文件夹。使用 DefaultItemType property to find calendar folders in Outlook, it returns a constant from the OlItemType 枚举指示文件夹中包含的默认 Outlook 项目类型。如果是日历,您应该获得 olAppointmentItem 值。
您还可以使用命名空间 class 的 GetDefaultFolder 方法来获取 Folder 对象,该对象表示当前配置文件所请求类型的默认文件夹;例如,获取当前登录用户的默认日历文件夹。
Sub ChangeCurrentFolder()
Dim myNamespace As Outlook.NameSpace
Set myNamespace = Application.GetNamespace("MAPI")
Set Application.ActiveExplorer.CurrentFolder = _
myNamespace.GetDefaultFolder(olFolderCalendar)
End Sub
然后遍历所有子文件夹。
Store class 也提供了 GetDefaultFolder 方法,它 returns 一个 Folder 对象,表示商店中的默认文件夹,并且是 FolderType 指定的类型争论。此方法类似于 NameSpace 对象的 GetDefaultFolder 方法。不同之处在于此方法获取与帐户关联的交付商店上的默认文件夹,而 NameSpace.GetDefaultFolder returns 当前配置文件的默认商店上的默认文件夹。
我想通过 VBA 使用 Excel 文件从当前 Outlook 会话中读取所有可用的非共享日历。
我加载了默认日历:
Set Calendar = outApp.GetNamespace("Mapi").GetDefaultFolder(9)
我似乎是通过在 VBA 编辑器的局部变量视图中手动浏览 Outlook 会话对象来找到可用日历的。到达那里的路径(通过所有会话、文件夹和项目层次结构)对于每个用户来说显然是不同的。所以我目前最好的解决方案是抓取整个对象,直到找到一个有效的日历。有更好的解决方案吗?
我的目标是识别当前 Outlook 会话中的所有可用日历,并让用户选择在哪个日历中添加新约会。
我使用以下代码添加约会:
Public Sub AddOutlooktermin(subject As String, _
startDateTime As Date, _
endDateTime As Date, _
body As String, _
location As String, _
allDayEvent As Boolean, _
reminderMinutes As Integer, _
setReminder As Boolean, _
busyStatus As Integer _
)
Dim outApp As Object, apptoutapp As Object
Set outApp = CreateObject("Outlook.Application")
Set apptoutapp = outApp.CreateItem(1) 'olAppointmentItem)
With apptoutapp
.Start = startDateTime
.End = endDateTime
.subject = subject
.body = body
.location = location
.allDayEvent = allDayEvent
.reminderMinutesBeforeStart = reminderMinutes
.ReminderSet = setReminder
.busyStatus = busyStatus
.Categories = "#Urlaub"
.importance = 2
.Save
End With
Set apptoutapp = Nothing
Set outApp = Nothing
End Sub
您可以在 Outlook 文件夹树中的任意位置创建日历文件夹。使用 DefaultItemType property to find calendar folders in Outlook, it returns a constant from the OlItemType 枚举指示文件夹中包含的默认 Outlook 项目类型。如果是日历,您应该获得 olAppointmentItem 值。
您还可以使用命名空间 class 的 GetDefaultFolder 方法来获取 Folder 对象,该对象表示当前配置文件所请求类型的默认文件夹;例如,获取当前登录用户的默认日历文件夹。
Sub ChangeCurrentFolder()
Dim myNamespace As Outlook.NameSpace
Set myNamespace = Application.GetNamespace("MAPI")
Set Application.ActiveExplorer.CurrentFolder = _
myNamespace.GetDefaultFolder(olFolderCalendar)
End Sub
然后遍历所有子文件夹。
Store class 也提供了 GetDefaultFolder 方法,它 returns 一个 Folder 对象,表示商店中的默认文件夹,并且是 FolderType 指定的类型争论。此方法类似于 NameSpace 对象的 GetDefaultFolder 方法。不同之处在于此方法获取与帐户关联的交付商店上的默认文件夹,而 NameSpace.GetDefaultFolder returns 当前配置文件的默认商店上的默认文件夹。