只在今天获得';s通过Outlook VBA进行预约

只在今天获得';s通过Outlook VBA进行预约,vba,outlook,Vba,Outlook,我正在提取今天所有Outlook帐户中的所有约会 我在这篇文章中遇到了同样的问题,但我正试图通过VBA来做到这一点 最初,我设法获得了今天的约会,但它也会返回今天没有举行的重复会议(如链接问题) 我不明白答案中的Powershell代码是如何过滤掉重复的约会的,因为在我的VBA尝试中,我得到了整整一周的约会 这是我的尝试。我已经包括了过滤器,我可以从中获取今天的约会以及今天没有发生的重复约会 Sub GetAllCalendarAppointmentsForToday() Dim ol

我正在提取今天所有Outlook帐户中的所有约会

我在这篇文章中遇到了同样的问题,但我正试图通过VBA来做到这一点

最初,我设法获得了今天的约会,但它也会返回今天没有举行的重复会议(如链接问题)

我不明白答案中的Powershell代码是如何过滤掉重复的约会的,因为在我的VBA尝试中,我得到了整整一周的约会

这是我的尝试。我已经包括了过滤器,我可以从中获取今天的约会以及今天没有发生的重复约会

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