只在今天获得';s通过Outlook VBA进行预约
我正在提取今天所有Outlook帐户中的所有约会 我在这篇文章中遇到了同样的问题,但我正试图通过VBA来做到这一点 最初,我设法获得了今天的约会,但它也会返回今天没有举行的重复会议(如链接问题) 我不明白答案中的Powershell代码是如何过滤掉重复的约会的,因为在我的VBA尝试中,我得到了整整一周的约会 这是我的尝试。我已经包括了过滤器,我可以从中获取今天的约会以及今天没有发生的重复约会只在今天获得';s通过Outlook VBA进行预约,vba,outlook,Vba,Outlook,我正在提取今天所有Outlook帐户中的所有约会 我在这篇文章中遇到了同样的问题,但我正试图通过VBA来做到这一点 最初,我设法获得了今天的约会,但它也会返回今天没有举行的重复会议(如链接问题) 我不明白答案中的Powershell代码是如何过滤掉重复的约会的,因为在我的VBA尝试中,我得到了整整一周的约会 这是我的尝试。我已经包括了过滤器,我可以从中获取今天的约会以及今天没有发生的重复约会 Sub GetAllCalendarAppointmentsForToday() Dim ol
Sub GetAllCalendarAppointmentsForToday()
Dim olApplication As Outlook.Application
Dim olNamespace As NameSpace
Dim olAccounts As Accounts
Dim olStore As Outlook.Store
Dim olCalendarFolder As Outlook.Folder
Dim olCalendarItems As Outlook.Items
Dim olTodayCalendarItems As Outlook.Items
Dim strFilter As String
Dim strFilter2 As String
Set olApplication = CreateObject("Outlook.Application")
Set olNamespace = olApplication.Session
Set olAccounts = olNamespace.Accounts
Debug.Print olAccounts.Count
For Each oAccount In olAccounts
Debug.Print oAccount
Set olStore = oAccount.DeliveryStore
Set olCalendarFolder = olStore.GetDefaultFolder(olFolderCalendar)
Set olCalendarItems = olCalendarFolder.Items
olCalendarItems.Sort "[Start]", True
olCalendarItems.IncludeRecurrences = True
Debug.Print olCalendarItems.Count
'Find your today's appointments
strFilter = Format(Now, "ddddd")
strFilter2 = Format(DateAdd("d", 7, Now), "ddddd")
Debug.Print strFilter
Debug.Print strFilter2
'strFilter = "[Start] > " & Chr(34) & strFilter & " 00:00" & Chr(34) & " AND [Start] < " & Chr(34) & strFilter & " 00:00" & Chr(34)
strFilter = "[Start] > " & Chr(34) & strFilter & " 00:00" & Chr(34) & " AND [Start] < " & Chr(34) & strFilter2 & " 00:00" & Chr(34)
Debug.Print strFilter
Set olTodayCalendarItems = olCalendarItems.Restrict(strFilter)
Debug.Print olTodayCalendarItems.Count
Debug.Print "Begin Print of Appointments"
For Each objAppointment In olTodayCalendarItems
Counter = Counter + 1
Debug.Print Counter & ":" & objAppointment.Subject & " " & objAppointment.Location & " [" & objAppointment.Start & "|" & objAppointment.End & "]"
Next
Debug.Print vbNewLine
Next
End Sub
编辑#3:
我创建了一个VB.NET应用程序,在那里我使用了答案链接中提供的函数,它按预期工作。所以,也许VBA中存在问题(不太可能),或者我在VBA脚本中遗漏了一些小东西
编辑#4:
问题一直在我的逻辑中。需要按升序排序的项目。感谢Eugene和niton如果您设置了
includeCurrences
属性,Microsoft不建议使用Count
属性。Count
属性可能返回意外结果并导致无限循环。在文章中阅读更多关于这方面的内容
下面是一个示例VB.NET代码,您可以在其中看到如何正确筛选约会项目:
Imports System.Text
Imports System.Diagnostics
' ...
Private Sub RestrictCalendarItems(folder As Outlook.MAPIFolder)
Dim dtEnd As DateTime = New DateTime(DateTime.Now.Year, DateTime.Now.Month, _
DateTime.Now.Day, 23, 59, 0, 0)
Dim restrictCriteria As String = "[Start]<=""" + dtEnd.ToString("g") + """" + _
" AND [End]>=""" + DateTime.Now.ToString("g") + """"
Dim strBuilder As StringBuilder = Nothing
Dim folderItems As Outlook.Items = Nothing
Dim resultItems As Outlook.Items = Nothing
Dim appItem As Outlook._AppointmentItem = Nothing
Dim counter As Integer = 0
Dim item As Object = Nothing
Try
strBuilder = New StringBuilder()
folderItems = folder.Items
folderItems.IncludeRecurrences = True
folderItems.Sort("[Start]")
resultItems = folderItems.Restrict(restrictCriteria)
item = resultItems.GetFirst()
Do
If Not IsNothing(item) Then
If (TypeOf (item) Is Outlook._AppointmentItem) Then
counter = counter + 1
appItem = item
strBuilder.AppendLine("#" + counter.ToString() + _
" Start: " + appItem.Start.ToString() + _
" Subject: " + appItem.Subject + _
" Location: " + appItem.Location)
End If
Marshal.ReleaseComObject(item)
item = resultItems.GetNext()
End If
Loop Until IsNothing(item)
If (strBuilder.Length > 0) Then
Debug.WriteLine(strBuilder.ToString())
Else
Debug.WriteLine("There is no match in the " _
+ folder.Name + " folder.")
End If
catch ex As Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
Finally
If Not IsNothing(folderItems) Then Marshal.ReleaseComObject(folderItems)
If Not IsNothing(resultItems) Then Marshal.ReleaseComObject(resultItems)
End Try
End Sub
导入系统文本
导入系统。诊断
' ...
Private Sub-RestrictCalendarItems(文件夹为Outlook.MAPIFolder)
Dim dtEnd As DateTime=新的DateTime(DateTime.Now.Year、DateTime.Now.MOUNT、_
DateTime.Now.Day,23,59,0,0)
Dim restrictCriteria为String=“[Start]=”+DateTime.Now.ToString(“g”)+“”
作为StringBuilder的Dim strBuilder=无
将文件夹项设置为Outlook。项=无
将resultItems设置为Outlook。Items=无
将appItem设置为Outlook。\u AppointmentItem=Nothing
作为整数的Dim计数器=0
将项目设置为对象=无
尝试
strBuilder=新的StringBuilder()
folderItems=文件夹。项目
folderItems.includeCurrences=True
folderItems.Sort(“[Start]”)
resultItems=folderItems.Restrict(限制标准)
item=resultItems.GetFirst()
做
如果不是空(项目),则
如果(项目类型)为Outlook.\u任命项目),则
计数器=计数器+1
appItem=项目
strBuilder.AppendLine(“#”+counter.ToString()+_
“开始:”+appItem.Start.ToString()+_
“主题:”+appItem.Subject+_
“位置:”+appItem.Location)
如果结束
Marshal.ReleaseComObject(项目)
item=resultItems.GetNext()
如果结束
循环直到什么都没有(项目)
如果(strBuilder.Length>0),则
Debug.WriteLine(strBuilder.ToString())
其他的
Debug.WriteLine(“中没有匹配项”_
+folder.Name+“folder.”
如果结束
特例
System.Windows.Forms.MessageBox.Show(例如Message)
最后
如果不是Nothing(folderItems),则封送.ReleaseComObject(folderItems)
如果不是Nothing(resultItems),则封送.ReleaseComObject(resultItems)
结束尝试
端接头
如果设置了includecurrences
属性,Microsoft不建议使用Count
属性。Count
属性可能返回意外结果并导致无限循环。在文章中阅读更多关于这方面的内容
下面是一个示例VB.NET代码,您可以在其中看到如何正确筛选约会项目:
Imports System.Text
Imports System.Diagnostics
' ...
Private Sub RestrictCalendarItems(folder As Outlook.MAPIFolder)
Dim dtEnd As DateTime = New DateTime(DateTime.Now.Year, DateTime.Now.Month, _
DateTime.Now.Day, 23, 59, 0, 0)
Dim restrictCriteria As String = "[Start]<=""" + dtEnd.ToString("g") + """" + _
" AND [End]>=""" + DateTime.Now.ToString("g") + """"
Dim strBuilder As StringBuilder = Nothing
Dim folderItems As Outlook.Items = Nothing
Dim resultItems As Outlook.Items = Nothing
Dim appItem As Outlook._AppointmentItem = Nothing
Dim counter As Integer = 0
Dim item As Object = Nothing
Try
strBuilder = New StringBuilder()
folderItems = folder.Items
folderItems.IncludeRecurrences = True
folderItems.Sort("[Start]")
resultItems = folderItems.Restrict(restrictCriteria)
item = resultItems.GetFirst()
Do
If Not IsNothing(item) Then
If (TypeOf (item) Is Outlook._AppointmentItem) Then
counter = counter + 1
appItem = item
strBuilder.AppendLine("#" + counter.ToString() + _
" Start: " + appItem.Start.ToString() + _
" Subject: " + appItem.Subject + _
" Location: " + appItem.Location)
End If
Marshal.ReleaseComObject(item)
item = resultItems.GetNext()
End If
Loop Until IsNothing(item)
If (strBuilder.Length > 0) Then
Debug.WriteLine(strBuilder.ToString())
Else
Debug.WriteLine("There is no match in the " _
+ folder.Name + " folder.")
End If
catch ex As Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
Finally
If Not IsNothing(folderItems) Then Marshal.ReleaseComObject(folderItems)
If Not IsNothing(resultItems) Then Marshal.ReleaseComObject(resultItems)
End Try
End Sub
导入系统文本
导入系统。诊断
' ...
Private Sub-RestrictCalendarItems(文件夹为Outlook.MAPIFolder)
Dim dtEnd As DateTime=新的DateTime(DateTime.Now.Year、DateTime.Now.MOUNT、_
DateTime.Now.Day,23,59,0,0)
Dim restrictCriteria为String=“[Start]=”+DateTime.Now.ToString(“g”)+“”
作为StringBuilder的Dim strBuilder=无
将文件夹项设置为Outlook。项=无
将resultItems设置为Outlook。Items=无
将appItem设置为Outlook。\u AppointmentItem=Nothing
作为整数的Dim计数器=0
将项目设置为对象=无
尝试
strBuilder=新的StringBuilder()
folderItems=文件夹。项目
folderItems.includeCurrences=True
folderItems.Sort(“[Start]”)
resultItems=folderItems.Restrict(限制标准)
item=resultItems.GetFirst()
做
如果不是空(项目),则
如果(项目类型)为Outlook.\u任命项目),则
计数器=计数器+1
appItem=项目
strBuilder.AppendLine(“#”+counter.ToString()+_
“开始:”+appItem.Start.ToString()+_
“主题:”+appItem.Subject+_
“位置:”+appItem.Location)
如果结束
Marshal.ReleaseComObject(项目)
item=resultItems.GetNext()
如果结束
循环直到什么都没有(项目)
如果(strBuilder.Length>0),则
Debug.WriteLine(strBuilder.ToString())
其他的
Debug.WriteLine(“中没有匹配项”_
+folder.Name+“folder.”
如果结束
特例
System.Windows.Forms.MessageBox.Show(例如Message)
最后
如果不是Nothing(folderItems),则封送.ReleaseComObject(folderItems)
如果不是Nothing(resultItems),则封送.ReleaseComObject(resultItems)
结束尝试
端接头
Imports System.Text
Imports System.Diagnostics
' ...
Private Sub RestrictCalendarItems(folder As Outlook.MAPIFolder)
Dim dtEnd As DateTime = New DateTime(DateTime.Now.Year, DateTime.Now.Month, _
DateTime.Now.Day, 23, 59, 0, 0)
Dim restrictCriteria As String = "[Start]<=""" + dtEnd.ToString("g") + """" + _
" AND [End]>=""" + DateTime.Now.ToString("g") + """"
Dim strBuilder As StringBuilder = Nothing
Dim folderItems As Outlook.Items = Nothing
Dim resultItems As Outlook.Items = Nothing
Dim appItem As Outlook._AppointmentItem = Nothing
Dim counter As Integer = 0
Dim item As Object = Nothing
Try
strBuilder = New StringBuilder()
folderItems = folder.Items
folderItems.IncludeRecurrences = True
folderItems.Sort("[Start]")
resultItems = folderItems.Restrict(restrictCriteria)
item = resultItems.GetFirst()
Do
If Not IsNothing(item) Then
If (TypeOf (item) Is Outlook._AppointmentItem) Then
counter = counter + 1
appItem = item
strBuilder.AppendLine("#" + counter.ToString() + _
" Start: " + appItem.Start.ToString() + _
" Subject: " + appItem.Subject + _
" Location: " + appItem.Location)
End If
Marshal.ReleaseComObject(item)
item = resultItems.GetNext()
End If
Loop Until IsNothing(item)
If (strBuilder.Length > 0) Then
Debug.WriteLine(strBuilder.ToString())
Else
Debug.WriteLine("There is no match in the " _
+ folder.Name + " folder.")
End If
catch ex As Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
Finally
If Not IsNothing(folderItems) Then Marshal.ReleaseComObject(folderItems)
If Not IsNothing(resultItems) Then Marshal.ReleaseComObject(resultItems)
End Try
End Sub