使用 VBA 验证 2 个 outlook 会议之间是否存在冲突
Verify if there are conflicts between 2 outlook meeting using VBA
我目前正在为 Outlook 创建一个宏,以创建从特定日期开始的会议。
我的宏可以创建、修改、删除会议。
我想在创建会议时检查会议之间是否存在冲突。
我试过AppointmentItem.Conflicts属性,但没有什么好的结果。
感谢您的帮助。
D
您可以使用Recipient.FreeBusy方法为收件人提供returnsfree/busy信息。以下 VBA 示例 returns 一串 free/busy 信息,每小时一个字符(完整格式)。
Set myRecipient = myNameSpace.CreateRecipient("Nate Sun")
myFBInfo = myRecipient.FreeBusy(#02/05/2022#, 60, True)
要获取当前用户的信息,您可以使用 NameSpace.CurrentUser property which returns the currently logged-on user as a Recipient object,因此可以调用 FreeBusy
方法。
请注意,对于 Exchange 帐户,您可能会发现 ExchangeUser.GetFreeBusy 方法很有用。它 returns 一个字符串,表示 ExchangeUser
从指定日期午夜开始的 30 天内的可用性。
Sub GetManagerOpenInterval()
Dim oManager As ExchangeUser
Dim oCurrentUser As ExchangeUser
Dim FreeBusy As String
Dim BusySlot As Long
Dim DateBusySlot As Date
Dim i As Long
Const SlotLength = 60
'Get ExchangeUser for CurrentUser
If Application.Session.CurrentUser.AddressEntry.Type = "EX" Then
Set oCurrentUser = _
Application.Session.CurrentUser.AddressEntry.GetExchangeUser
'Get Manager
Set oManager = oManager.GetExchangeUserManager
If oManager Is Nothing Then
Exit Sub
End If
FreeBusy = oManager.GetFreeBusy(Now, SlotLength)
For i = 1 To Len(FreeBusy)
If CLng(Mid(FreeBusy, i, 1)) = 0 Then
'get the number of minutes into the day for free interval
BusySlot = (i - 1) * SlotLength
'get an actual date/time
DateBusySlot = DateAdd("n", BusySlot, Date)
'To refine this function, substitute actual
'workdays and working hours in date/time comparison
If TimeValue(DateBusySlot) >= TimeValue(#8:00:00 AM#) And _
TimeValue(DateBusySlot) <= TimeValue(#5:00:00 PM#) And _
Not (Weekday(DateBusySlot) = vbSaturday Or _
Weekday(DateBusySlot) = vbSunday) Then
Debug.Print oManager.name & " first open interval:" & _
vbCrLf & _
Format$(DateBusySlot, "dddd, mmm d yyyy hh:mm AMPM")
Exit For
End If
End If
Next
End If
End Sub
您也可以尝试获取在特定时间间隔内开始或结束的所有会议。 Find
/FindNext
或 Restrict
方法可以帮助完成此类任务。在以下文章中阅读更多关于它们的信息:
我目前正在为 Outlook 创建一个宏,以创建从特定日期开始的会议。
我的宏可以创建、修改、删除会议。
我想在创建会议时检查会议之间是否存在冲突。
我试过AppointmentItem.Conflicts属性,但没有什么好的结果。
感谢您的帮助。
D
您可以使用Recipient.FreeBusy方法为收件人提供returnsfree/busy信息。以下 VBA 示例 returns 一串 free/busy 信息,每小时一个字符(完整格式)。
Set myRecipient = myNameSpace.CreateRecipient("Nate Sun")
myFBInfo = myRecipient.FreeBusy(#02/05/2022#, 60, True)
要获取当前用户的信息,您可以使用 NameSpace.CurrentUser property which returns the currently logged-on user as a Recipient object,因此可以调用 FreeBusy
方法。
请注意,对于 Exchange 帐户,您可能会发现 ExchangeUser.GetFreeBusy 方法很有用。它 returns 一个字符串,表示 ExchangeUser
从指定日期午夜开始的 30 天内的可用性。
Sub GetManagerOpenInterval()
Dim oManager As ExchangeUser
Dim oCurrentUser As ExchangeUser
Dim FreeBusy As String
Dim BusySlot As Long
Dim DateBusySlot As Date
Dim i As Long
Const SlotLength = 60
'Get ExchangeUser for CurrentUser
If Application.Session.CurrentUser.AddressEntry.Type = "EX" Then
Set oCurrentUser = _
Application.Session.CurrentUser.AddressEntry.GetExchangeUser
'Get Manager
Set oManager = oManager.GetExchangeUserManager
If oManager Is Nothing Then
Exit Sub
End If
FreeBusy = oManager.GetFreeBusy(Now, SlotLength)
For i = 1 To Len(FreeBusy)
If CLng(Mid(FreeBusy, i, 1)) = 0 Then
'get the number of minutes into the day for free interval
BusySlot = (i - 1) * SlotLength
'get an actual date/time
DateBusySlot = DateAdd("n", BusySlot, Date)
'To refine this function, substitute actual
'workdays and working hours in date/time comparison
If TimeValue(DateBusySlot) >= TimeValue(#8:00:00 AM#) And _
TimeValue(DateBusySlot) <= TimeValue(#5:00:00 PM#) And _
Not (Weekday(DateBusySlot) = vbSaturday Or _
Weekday(DateBusySlot) = vbSunday) Then
Debug.Print oManager.name & " first open interval:" & _
vbCrLf & _
Format$(DateBusySlot, "dddd, mmm d yyyy hh:mm AMPM")
Exit For
End If
End If
Next
End If
End Sub
您也可以尝试获取在特定时间间隔内开始或结束的所有会议。 Find
/FindNext
或 Restrict
方法可以帮助完成此类任务。在以下文章中阅读更多关于它们的信息: