macro - outlook vba ejemplos
Outlook comprueba los correos electrónicos solo en un marco de tiempo específico (3)
Podrías cambiar la línea a:
If InStr(msg.Subject, "Error in WU_Send") > 0 And msg.SentOn > "03/16/2015 12:00 PM" AND msg.SentOn < "03/16/2015 2:00 PM" Then
Necesito una macro de perspectivas de VBA que verifique los elementos en una carpeta en un marco de tiempo específico. En este momento mi código revisa todos los correos en la carpeta especificada, pero esta no es una opción ya que la carpeta tiene miles de correos electrónicos, por lo que la macro tarda en ejecutarse para siempre, cualquier idea, cómo obtener el script para verificar el Sólo se envían correos de, por ejemplo, del 3/16/2015 12:00 PM al 3/16/2015 a las 2:00 PM y no se comprueba si hay correos electrónicos fuera de ese período de tiempo.
Esto es lo que tengo en este momento:
Sub ExportToExcel()
Dim appExcel As Excel.Application
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Dim rng As Excel.Range
Dim workbookFile As String
Dim msg As Outlook.MailItem
Dim nms As Outlook.NameSpace
Dim fld As Outlook.MAPIFolder
Dim itm As Object
''Folder path and file name of an existing Excel workbook
workbookFile = "C:/Users/OutlookItems.xls"
''Select export folder
Set nms = Application.GetNamespace("MAPI")
Set fld = nms.PickFolder
''Handle potential errors with Select Folder dialog box.
If fld Is Nothing Then
MsgBox "There are no mail messages to export", vbOKOnly, _
"Error"
Exit Sub
ElseIf fld.DefaultItemType <> olMailItem Then
MsgBox "There are no mail messages to export", vbOKOnly, _
"Error"
Exit Sub
ElseIf fld.Items.Count = 0 Then
MsgBox "There are no mail messages to export", vbOKOnly, _
"Error"
Exit Sub
End If
'' Open and activate Excel workbook.
Set appExcel = CreateObject("Excel.Application")
Set wkb = appExcel.Workbooks.Open(workbookFile)
Set wks = wkb.Sheets(1)
wks.Activate
appExcel.Application.Visible = True
Set rng = wks.Range("A1")
''Copy field items in mail folder.
For Each itm In fld.Items
If itm.Class = Outlook.OlObjectClass.olMail Then
Set msg = itm
If InStr(msg.Subject, "Error in WU_Send") > 0 And DateDiff("h", msg.SentOn, Now) <= 2 Then
rng.Offset(0, 4).Value = msg.Body
Set rng = rng.Offset(1, 0)
End If
End If
Next
End Sub
y el problema radica en esta parte en particular:
For Each itm In fld.Items
If itm.Class = Outlook.OlObjectClass.olMail Then
Set msg = itm
If InStr(msg.Subject, "Error in WU_Send") > 0 And DateDiff("h", msg.SentOn, Now) <= 2 Then
¿Cómo le digo al código que solo mire los correos electrónicos entre horas especificadas e ignore el resto?
¡Gracias o sus respuestas, comentarios y sugerencias por adelantado!
Esto especifica el período de tiempo.
Option Explicit
Sub RestrictTimePeriod()
Dim nms As Namespace
Dim fld As folder '' Subsequent to 2003 otherwise MAPIFolder
Dim msg As MailItem
Dim filterCriteria As String
Dim filterItems As Items
Dim i As Long
Dim start
Dim dif
Set nms = Application.GetNamespace("MAPI")
Set fld = nms.PickFolder
If Not fld Is Nothing Then
start = Now
Debug.Print start
'' http://www.jpsoftwaretech.com/use-filters-to-speed-up-outlook-macros/
filterCriteria = "[ReceivedTime] > " & QuoteWrap("2015-03-16 12:00 PM") & _
" And [ReceivedTime] < " & QuoteWrap("2015-03-17 2:00 PM")
Set filterItems = fld.Items.Restrict(filterCriteria)
For i = filterItems.count To 1 Step -1
Set msg = filterItems.Item(i)
Debug.Print msg.Subject
Next
End If
ExitRoutine:
Set nms = Nothing
Set msg = Nothing
Set filterItems = Nothing
Debug.Print Now
dif = (Now - start) * 86400
Debug.Print dif
Debug.Print "Done."
End Sub
Function QuoteWrap(stringToWrap As String, _
Optional charToUse As Long = 39) As String
'' http://www.jpsoftwaretech.com/use-filters-to-speed-up-outlook-macros/
'' use 34 for double quotes, 39 for apostrophe
QuoteWrap = Chr(charToUse) & stringToWrap & Chr(charToUse)
End Function
Necesita utilizar los métodos Find / FindNext o Restrict de la clase Items en lugar de recorrer todos los elementos de la carpeta. Por ejemplo:
Sub DemoFindNext()
Dim myNameSpace As Outlook.NameSpace
Dim tdystart As Date
Dim tdyend As Date
Dim myAppointments As Outlook.Items
Dim currentAppointment As Outlook.AppointmentItem
Set myNameSpace = Application.GetNamespace("MAPI")
tdystart = VBA.Format(Now, "Short Date")
tdyend = VBA.Format(Now + 1, "Short Date")
Set myAppointments = myNameSpace.GetDefaultFolder(olFolderCalendar).Items
Set currentAppointment = myAppointments.Find("[Start] >= """ & tdystart & """ and [Start] <= """ & tdyend & """")
While TypeName(currentAppointment) <> "Nothing"
MsgBox currentAppointment.Subject
Set currentAppointment = myAppointments.FindNext
Wend
End Sub
Consulte los siguientes artículos para obtener más información y código de muestra:
- Cómo: Usar los métodos Find y FindNext para recuperar elementos de correo de Outlook de una carpeta (C #, VB.NET)
- Cómo: Usar el método Restringir para recuperar elementos de correo de Outlook de una carpeta
También puede ser útil el método AdvancedSearch de la clase Application. Los beneficios clave de usar el método AdvancedSearch se enumeran a continuación:
- La búsqueda se realiza en otro hilo. No necesita ejecutar otro subproceso manualmente ya que el método AdvancedSearch lo ejecuta automáticamente en segundo plano.
- Posibilidad de buscar cualquier tipo de elemento: correo, cita, calendario, notas, etc. en cualquier ubicación, es decir, más allá del alcance de una determinada carpeta. Los métodos Restringir y Buscar / BuscarNext se pueden aplicar a una colección de elementos en particular (consulte la propiedad Items de la clase Folder en Outlook).
- Soporte completo para consultas DASL (las propiedades personalizadas también se pueden usar para buscar). Puede leer más sobre esto en el artículo de filtrado en MSDN. Para mejorar el rendimiento de la búsqueda, las palabras clave de búsqueda instantánea se pueden usar si la búsqueda instantánea está habilitada para la tienda (consulte la propiedad IsInstantSearchEnabled de la clase Store).
- Puede detener el proceso de búsqueda en cualquier momento usando el método Stop de la clase Search.