Filtern von Elementen mithilfe eines Datum-Uhrzeit-Vergleichs
Filtern von Terminserien im Kalenderordner
Zum Filtern einer Auflistung von Terminelementen, die Terminserien einschließen, müssen Sie die Items -Auflistung verwenden. Verwenden Sie die Items.IncludeRecurrences -Eigenschaft, um anzugeben, dass Items.Find oder Items.Restrict Terminserien einschließen soll. Durch das Table -Objekt wird anstelle einer Zeile für jedes Auftreten des Termins nur eine Zeile zurückgegeben, die das Terminserienelement darstellt.
Datum-Uhrzeit-Format von Vergleichszeichenfolgen
Outlook wertet Datum-Uhrzeit-Werte gemäß den Einstellungen für das Zeitformat, das kurze Datumsformat und das lange Datumsformat in den Sprach- und Regionsoptionen in der Windows-Systemsteuerung aus. Insbesondere wird die Uhrzeit gemäß dem angegebenen Zeitformat ohne Sekunden von Outlook ausgewertet. Wenn Sie Sekunden in der Datum-Uhrzeit-Vergleichszeichenfolge angeben, funktioniert der Filter nicht wie erwartet.
Obwohl Daten und Uhrzeiten normalerweise mit einem Datumsformat gespeichert werden, muss für Filter mit Jet- und DASL-Syntax (DAV Searching and Locating) der Datum-Uhrzeit-Wert in eine Zeichenfolgendarstellung konvertiert werden. In der Jet-Syntax sollte die Datum-Uhrzeit-Vergleichszeichenfolge in doppelte oder einzelne Anführungszeichen eingeschlossen werden. In der DASL-Syntax sollte die Datum-Uhrzeit-Vergleichszeichenfolge in einzelne Anführungszeichen eingeschlossen werden.
Um sicherzustellen, dass die Datums-/Uhrzeit-Vergleichszeichenfolge wie von Microsoft Outlook erwartet formatiert ist, verwenden Sie die funktion Visual Basic for Applications Format (oder deren Entsprechung in Ihrer Programmiersprache). Im folgenden Beispiel wird ein Jet-Filter erstellt, um alle Kontakte zu finden, die vor dem 12. Juni 2005, 15:30 Uhr (lokale Zeit) geändert wurden.
criteria = "[LastModificationTime] < '" _
& Format$("6/12/2005 3:30PM","General Date") & "'"
Im Vergleich verwendete Zeitzonen
Wenn in einer Jet-Abfrage mit ihrem expliziten Zeichenfolgennamen auf eine explizite integrierte Eigenschaft verwiesen wird, wertet der Vergleich den Eigenschaftswert und die Datum-Uhrzeit-Vergleichszeichenfolge als Ortszeitwerte aus.
Wenn in einer DASL-Abfrage durch einen Namespace auf eine Eigenschaft verwiesen wird, wertet der Vergleich des Eigenschaftswerts und der Datum-Uhrzeit-Vergleichszeichenfolge Werte in koordinierter Weltzeit (UTC) aus. Die folgende DASL-Abfrage sucht z. B. alle Kontakte, die vor dem 12. Juni 2005, 15:30 Uhr (UTC) geändert wurden.
criteria = "@SQL=" & Chr(34) & "DAV:getlastmodified" & Chr(34) _
& " < '" & Format$("6/12/2005 3:30PM","General Date") & "'"
Konvertierung in UTC für DASL-Abfragen
Da Datum-Uhrzeit-Vergleiche in DASL-Abfragen immer in UTC ausgeführt werden, müssen Sie, wenn Sie in einer Vergleichszeichenfolge ein Datumsliteral verwenden, für den Vergleich den jeweiligen UTC-Wert verwenden. Verwenden Sie die Row.LocalTimeToUTC-Hilfsfunktion oder Outlook-Datums-/Uhrzeitmakros, um die Konvertierung zu erleichtern.
LocalTimeToUTC
Eine Möglichkeit, die Konvertierung von Ortszeit in UTC zu erleichtern, ist die Verwendung der LocalTimeToUTC -Hilfsfunktion des Row -Objekts. In den folgenden Codezeilen wird diese Hilfsfunktion zum Konvertieren des Werts der LastModificationTime -Eigenschaft (einer Standardspalte in allen Table -Objekten) verwendet:
Row.LocalTimeToUTC("LastModificationTime")
Datum-Uhrzeit-Makros von Outlook
Durch die unten aufgelisteten Datumsmakros werden Filterzeichenfolgen zurückgegeben, mit denen der Wert einer bestimmten Datum-Uhrzeit-Eigenschaft mit einem angegebenen Datum in UTC verglichen wird; SchemaName ist eine beliebige gültige Datum-Uhrzeit-Eigenschaft, auf die durch einen Namespace verwiesen wird.
Hinweis Outlook-Datums-/Uhrzeitmakros können nur in DASL-Abfragen verwendet werden.
Makro | Syntax | Beschreibung |
---|---|---|
today | %today(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf heute beschränkt. |
tomorrow | %tomorrow(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf morgen beschränkt. |
yesterday | %yesterday(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf gestern beschränkt. |
next7days | %next7days(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf die nächsten sieben Tage beschränkt. |
last7days | %last7days(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf die letzten sieben Tage beschränkt. |
nextweek | %nextweek(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf die nächste Woche beschränkt. |
thisweek | %thisweek(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf die aktuelle Woche beschränkt. |
lastweek | %lastweek(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf die letzte Woche beschränkt. |
nextmonth | %nextmonth(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf den nächsten Monat beschränkt. |
thismonth | %thismonth(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf den aktuellen Monat beschränkt. |
lastmonth | %lastmonth(" SchemaName")% | Der Wert der SchemaName-Eigenschaft wird auf den letzten Monat beschränkt. |
Beispiel für eine Konvertierung in UTC
Im folgenden Codebeispiel werden drei Filterzeichenfolgen veranschaulicht, durch die alle am heutigen Tag empfangenen Nachrichten zurückgegeben werden, und einer der Filter wird auf Items.Restrict und Application.AdvancedSearch angewendet. Zuerst wird mithilfe von PropertyAccessor.LocalTimeToUTC das heutige Datum in UTC-Datumszeichenfolgen konvertiert. Im ersten Filter wird mithilfe des Outlook-Makros today eine Filterzeichenfolge abgerufen, mit der die ReceivedTime -Eigenschaft mit dem heutigen Datum in UTC verglichen wird. Im zweiten und dritten Makro wird durch zwei verschiedene Namespaces auf die ReceivedTime -Eigenschaft verwiesen.
Schließlich wird der dritte Filter zweimal auf Elemente im Posteingang angewendet, zuerst mit Items.Restrict und dann mit Application.AdvancedSearch. Die Anzahl der Elemente im Posteingang und die Anzahl der bei jeder Anwendung des Filters zurückgegebenen Elemente wird gedruckt.
Public blnSearchComp As Boolean
Sub TestDASLDateComparison()
Dim strFilter As String
Dim colItems As Outlook.Items
Dim colRestrict As Outlook.Items
Dim oSearch As Outlook.Search
Dim oResults As Outlook.Results
Dim datStartUTC As Date
Dim datEndUTC As Date
Dim oMail As MailItem
Dim oPA As PropertyAccessor
Const SchemaPropTag As String = _
"https://schemas.microsoft.com/mapi/proptag/"
'Get items from Inbox
Set colItems = _
Application.Session.GetDefaultFolder(olFolderInbox).Items
'This code is a workaround to get today's date
'as UTC for DASL date comparison
Set oMail = Application.CreateItem(olMailItem)
Set oPA = oMail.PropertyAccessor
datStartUTC = oPA.LocalTimeToUTC(Date)
datEndUTC = oPA.LocalTimeToUTC(DateAdd("d", 1, Date))
'All three filters shown below will return the same results
'This filter uses DASL date macro for today
strFilter = "%today(" _
& AddQuotes("urn:schemas:httpmail:datereceived") & ")%"
'This filter uses urn:schemas:httpmail namespace
strFilter = AddQuotes("urn:schemas:httpmail:datereceived") _
& " > '" & datStartUTC & "' AND " _
& AddQuotes("urn:schemas:httpmail:datereceived") _
& " < '" & datEndUTC & "'"
'This filter uses https://schemas.microsoft.com/mapi/proptag
strFilter = AddQuotes(SchemaPropTag & "0x0E060040") _
& " > '" & datStartUTC & "' AND " _
& AddQuotes(SchemaPropTag & "0x0E060040") _
& " < '" & datEndUTC & "'"
'Count of items in Inbox
Debug.Print (colItems.Count)
'This call succeeds with @SQL prefix
Set colRestrict = colItems.Restrict("@SQL=" & strFilter)
'Get count of restricted items
Debug.Print (colRestrict.Count)
Set oSearch = Application.AdvancedSearch("Inbox", strFilter, False)
While blnSearchComp = False
DoEvents
Wend
'Get count from Search object
Set oResults = oSearch.Results
Debug.Print (oResults.Count)
End Sub
Public Function AddQuotes(ByVal SchemaName As String) As String
On Error Resume Next
AddQuotes = Chr(34) & SchemaName & Chr(34)
End Function
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
MsgBox "The AdvancedSearchComplete Event fired"
blnSearchComp = True
End Sub
Support und Feedback
Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.