Compartir a través de


Filtrar elementos utilizando una comparación de fecha y hora

Filtrar elementos periódicos en la carpeta de Calendario

Para filtrar una colección de elementos de cita que incluyen citas periódicas, debe utilizar la colección Items. Utilice la propiedad Items.IncludeRecurrences para especificar que Items.Find o Items.Restrict deben incluir citas periódicas. El objeto Table devuelve únicamente una fila que representa el elemento de cita periódico, en lugar de una fila por cada vez que aparece la cita.

Formato de fecha y hora de las cadenas de comparación

Outlook evalúa los valores de fecha y hora de acuerdo con la configuración que consta en el applet Configuración regional y de idioma del Panel de control para el formato de hora, el formato de fecha corta y el formato de fecha larga. En especial, Outlook evalúa la hora de acuerdo con dicho formato de hora especificado sin segundos. Si especifica segundos en la cadena de comparación de fecha y hora, el filtro no funcionará de la manera esperada

Aunque las fechas y las horas se guardan habitualmente con formato de fecha, los filtros que utilizan la sintaxis Jet y DASL (DAV Searching and Locating) requieren que el valor de fecha y hora se convierta en una representación de cadena. En la sintaxis Jet, la cadena de comparación de fecha y hora deberá incluirse entre comillas dobles o simples. En la sintaxis DASL, la cadena de comparación de fecha y hora deberá incluirse entre comillas simples.

Para asegurarse de que la cadena de comparación de fecha y hora tenga el formato esperado por Microsoft Outlook use la función Format de Visual Basic para Aplicaciones (o su equivalente en el lenguaje de programación que use). En el ejemplo siguiente se crea un filtro Jet para buscar todos los contactos que se han modificado antes del 12 de junio de 2005 a las 3:30 p.m., hora local.

criteria = "[LastModificationTime] < '" _ 
         & Format$("6/12/2005 3:30PM","General Date") & "'"

Zonas horarias utilizadas en la comparación

Cuando se hace referencia a una propiedad integrada explícita en una consulta Jet con su nombre de cadena explícito, la comparación evalúa el valor de propiedad y la cadena de comparación de fecha y hora como valores de hora local.

Cuando en una consulta DASL se hace referencia a una propiedad por su espacio de nombres, la comparación evalúa el valor de la propiedad y la cadena de comparación de fecha y hora como valores UTC (Universal Coordinated Time). Por ejemplo, la consulta DASL siguiente busca todos los contactos que se han modificado antes del 12 de junio de 2005 a las 3:30 p.m., UTC.

criteria = "@SQL=" & Chr(34) & "DAV:getlastmodified" & Chr(34) _ 
         & " < '" & Format$("6/12/2005 3:30PM","General Date") & "'"

Conversión a UTC para las consultas DASL

Puesto que las consultas DASL siempre llevan a cabo las comparaciones de fecha y hora en UTC, si utiliza un literal de fecha en una cadena de comparación deberá utilizar su valor UTC para la misma. Use la función auxiliar Row.LocalTimeToUTC o las macros de fecha y hora de Outlook para facilitar la conversión.

LocalTimeToUTC

Una forma de facilitar la conversión de la hora local a UTC es utilizar la función LocalTimeToUTC del objeto Row. En la siguiente línea de código se utiliza esta función para convertir el valor de la propiedad LastModificationTime (que es una de las columnas predeterminadas de todos los objetos Table ):

Row.LocalTimeToUTC("LastModificationTime")

Macros de fecha y hora de Outlook

Las macros de fecha que se muestran a continuación devuelven cadenas de filtro que comparan el valor de una propiedad de fecha y hora determinada con una fecha especificada en UTC; SchemaName es cualquier propiedad de fecha y hora válida a la que se haga referencia por su espacio de nombres.

Nota Las macros de fecha y hora de Outlook solo se pueden usar en consultas DASL.

Macro Sintaxis Descripción
today %today(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a hoy
tomorrow %tomorrow(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a mañana
yesterday %yesterday(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a ayer
next7days %next7days(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a los próximos 7 días
last7days %last7days(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a los últimos 7 días
nextweek %nextweek(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a la semana próxima
thisweek %thisweek(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a esta semana
lastweek %lastweek(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a la semana pasada
nextmonth %nextmonth(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale al mes próximo
thismonth %thismonth(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale a este mes
lastmonth %lastmonth(" SchemaName")% Restringe los elementos a aquéllos cuyo valor de la propiedad SchemaName equivale al mes pasado

Ejemplo que muestra la conversión a UTC

En el ejemplo de código siguiente se muestran tres cadenas de filtro que devuelven todos los mensajes recibidos hoy y se aplica uno de los filtros a Items.Restrict y a Application.AdvancedSearch. En primer lugar, se utiliza PropertyAccessor.LocalTimeToUTC para convertir la fecha de hoy a cadenas de fecha UTC. El primer filtro utiliza la macro de Outlook, today, para obtener una cadena de filtro que compara la propiedad ReceivedTime con la fecha de hoy en formato UTC. Las macros segunda y tercera hacen referencia a la propiedad ReceivedTime por dos espacios de nombres distintos.

Por último, en el ejemplo de código se aplica dos veces el tercer filtro a los elementos de la Bandeja de entrada, la primera vez usando Items.Restrict y la segunda usando Application.AdvancedSearch. Por último, se imprime el número de elementos de la Bandeja de entrada y el número de elementos devueltos cada vez que se aplica el filtro.

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

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.