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.