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.