Filtrage d'éléments à l'aide d'une comparaison Date-heure
Filtrage des éléments périodiques dans le dossier Calendrier
Pour filtrer une collection d’éléments de rendez-vous qui incluent des rendez-vous récurrents, vous devez utiliser la collection Items . Utilisez la propriété Items.IncludeRecurrences pour spécifier que Items.Find ou Items.Restrict doit inclure des rendez-vous récurrents. L’objet Table retourne une seule ligne représentant l’élément de rendez-vous récurrent, au lieu d’une ligne pour chaque occurrence du rendez-vous.
Format de date-heure des chaînes de comparaison
Outlook évalue les valeurs date-heure en fonction du format d’heure, du format de date courte et du format de date longue dans l’applet Options régionales et linguistiques dans le Panneau de configuration Windows. En particulier, Outlook évalue le temps en fonction du format d’heure spécifié sans secondes. Si vous spécifiez des secondes dans la chaîne de comparaison date-heure, le filtre ne fonctionnera pas comme prévu.
Bien que les dates et heures soient généralement stockées avec un format de date, les filtres utilisant la syntaxe DASL (Jet et DAV Searching and Locating) nécessitent que la valeur date-heure soit convertie en une représentation sous forme de chaîne. Dans la syntaxe Jet, la chaîne de comparaison de date-heure doit être mise entre guillemets ou apostrophes. Dans la syntaxe DASL, la chaîne de comparaison de date-heure doit être mise entre apostrophes.
Pour vous assurer que la chaîne de comparaison date-heure est mise en forme comme prévu par Microsoft Outlook, utilisez la fonction Format Visual Basic pour Applications (ou son équivalent dans votre langage de programmation). L’exemple suivant montre comment créer un filtre Jet afin de rechercher tous les contacts qui ont été modifiés avant le 12 juin 2005 à 15h30, heure locale.
criteria = "[LastModificationTime] < '" _
& Format$("6/12/2005 3:30PM","General Date") & "'"
Fuseaux horaires utilisés dans le cadre de la comparaison
Lorsqu’une propriété intégrée explicite est référencée dans une requête Jet avec son nom de chaîne explicite, la comparaison évalue la valeur de la propriété et la chaîne de comparaison date-heure comme valeurs d’heure locales.
Lorsqu’une propriété est référencée dans une requête DASL par espace de noms, la comparaison évalue la valeur de la propriété et la chaîne de comparaison date-heure en tant que valeurs UTC (Coordinated Universal Time). Par exemple, la requête DASL suivante recherche tous les contacts qui ont été modifiés avant le 12 juin 2005 à 15h30, heure UTC.
criteria = "@SQL=" & Chr(34) & "DAV:getlastmodified" & Chr(34) _
& " < '" & Format$("6/12/2005 3:30PM","General Date") & "'"
Conversion en heure UTC pour les requêtes DASL
Dans la mesure où les requêtes DASL opèrent toujours les comparaisons de dates-heures en UTC, si vous utilisez un littéral de date dans une chaîne de comparaison, vous devez utiliser sa valeur UTC dans le cadre de la comparaison. Utilisez la fonction d’assistance Row.LocalTimeToUTC ou les macros date-heure Outlook pour faciliter la conversion.
LocalTimeToUTC
Une façon de faciliter la conversion de l’heure locale en heure UTC consiste à utiliser la fonction d’assistance , LocalTimeToUTC, de l’objet Row . La ligne de code suivante utilise cette fonction d’assistance pour convertir la valeur de la propriété LastModificationTime (qui est une colonne par défaut dans tous les objets Table ) :
Row.LocalTimeToUTC("LastModificationTime")
Macros de date-heure Outlook
Les macros de date répertoriées ci-dessous renvoient des chaînes de filtrage qui comparent la valeur d'une propriété de date-heure donnée à une date exprimée en UTC ; SchemaName est une propriété de date-heure valide référencée par un espace de noms.
Note Les macros date-heure Outlook ne peuvent être utilisées que dans les requêtes DASL.
Macro | Syntaxe | Description |
---|---|---|
aujourd’hui | %today( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « today » (aujourd'hui) |
demain | %tomorrow( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « tomorrow » (demain) |
yesterday | %yesterday( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « yesterday » (hier) |
7prochainsjours | %next7days( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « next7days» (les 7 prochains jours) |
7derniersjours | %last7days( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « last7days» (les 7 derniers jours) |
semaineprochaine | %nextweek( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « nextweek» (semaine prochaine) |
semaineencours | %thisweek( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « thisweek » (cette semaine) |
semainedernière | %lastweek( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « lastweek» (semaine dernière) |
moisprochain | %nextmonth( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « nextmonth» (mois prochain) |
moisencours | %thismonth( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « thismonth » (ce mois-ci) |
moisdernier | %lastmonth( » SchemaName »)% | Se limite aux éléments dont la propriété SchemaName a pour valeur « lastmonth » (le mois dernier) |
Exemple illustrant une conversion en UTC
L’exemple de code suivant illustre trois chaînes de filtre qui retournent tous les messages reçus aujourd’hui et applique l’un des filtres à Items.Restrict et Application.AdvancedSearch. Il utilise d’abord PropertyAccessor.LocalTimeToUTC pour convertir la date du jour en chaînes de date UTC. Le premier filtre utilise la macro Outlook, aujourd’hui, pour obtenir une chaîne de filtre qui compare la propriété ReceivedTime à la date du jour au format UTC. Les deuxième et troisième macros font référence à la propriété ReceivedTime par deux espaces de noms différents.
L’exemple de code applique enfin le troisième filtre aux éléments de la boîte de réception à deux reprises, d’abord à l’aide de Items.Restrict , puis d’Application.AdvancedSearch. Il imprime le nombre d’éléments contenus dans la Boîte de réception, ainsi que le nombre d’éléments renvoyés à chaque application du filtre.
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
Assistance et commentaires
Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.