VBScript – Exportar Información de correos Outlook a Excel

En seguimiento a la solicitud en el comentario del artículo redactamos el siguiente artículo.

El Script solicitado es para Exportar Información tal como Remitente, Fecha, Asunto, Mensaje. Para de los correos recibidos en Outlook a Excel automáticamente cuando llegan y también poder utilizar con reglas para configurar ciertos remitentes y asunto. El script guarda en el registro de Windows el numero consecutivo de renglón para que no se pierda la secuencia al momento de cerrar Outlook o reiniciar nuestro equipo.

Instrucciones de Uso

1.- Abrir el editor de Visual Basic (ALT+F11).

2.- Insertar un modulo nuevo (Insert > Module).

3.- Copiar el código VBScript.

4.- Debemos crear un documento Excel el cual guardaremos en una ruta de fácil acceso para el ejemplo creamos un folder en C:\1-Tests\test.xlsx, el cual dentro del folder 1-Tests tenemos nuestras pruebas y el archivo llamado test.xlsx es el documento Excel que creamos. Estos datos los especificamos en la linea 30 del código.

5.- En el documento Excel debemos dar un nombre a la hoja en este caso la nombramos Test. Este dato lo especificamos en la linea 41 del código.

6.- Podemos dar formato al documento y poner los encabezados como en la imagen, el código esta configurado para que se salte el primer renglón.

exportar-informacion-de-correos-outlook-a-excel-documento 7.- El registro del valor numérico del renglón consecutivo disponible se guarda en la ruta: HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings\Outlook\received el cual si deseamos reinicializarlo debemos entrar a la ruta anterior y modificar (Tambien podemos eliminar) la llave Current Value Number XLS por el numero 2.

exportar-informacion-de-correos-outlook-a-excel-cambiar-numero-en-registro

8.- Configuramos la regla requerida para ejecutar el Script.

Para mas información de configuración ver: Como utilizar el Editor VBA en Office (Utilizar Macros VBScript) y Outlook – Crear y configurar reglas

Código

Option Explicit
Public Sub CopyEmailToExcelWhenArrive(olItem As Outlook.MailItem)
 Dim xlApp As Object
 Dim xlWB As Object
 Dim xlSheet As Object
 Dim rCount As Long
 Dim bXStarted As Boolean
 Dim enviro As String
 Dim strPath As String
 Dim iDefault As Long
'Declare registry
 Dim sKey As String
 Dim lRegValue As Long
 Dim sAppName As String
 Dim sSection As String
'Set name of registry keys
 sAppName = "Outlook"
 sSection = "received"
 sKey = "Current Value Number XLS"
 iDefault = 2
 lRegValue = GetSetting(sAppName, sSection, sKey, iDefault)
 
 Dim currentExplorer As Explorer
 Dim Selection As Selection
 Dim obj As Object
 Dim strColB, strColC, strColD, strColE, strColF, strColG As String
            
' Get Excel set up
'the path of the workbook
 strPath = "C:\1-Tests\test.xlsx"
     On Error Resume Next
     Set xlApp = GetObject(, "Excel.Application")
     If Err <> 0 Then
         Application.StatusBar = "Please wait while Excel source is opened ... "
         Set xlApp = CreateObject("Excel.Application")
         bXStarted = True
     End If
     On Error GoTo 0
     'Open the workbook to input the data
     Set xlWB = xlApp.Workbooks.Open(strPath)
     Set xlSheet = xlWB.Sheets("Test")
    ' Process the message record
     
    On Error Resume Next
    
 'collect the fields
     strColB = olItem.senderName
     strColC = olItem.SenderEmailAddress
     strColD = olItem.Subject
     strColE = olItem.Body
     strColF = olItem.To
     strColG = olItem.ReceivedTime
     
 
'write them in the excel sheet
  xlSheet.Range("B" & lRegValue) = strColB
  xlSheet.Range("c" & lRegValue) = strColC
  xlSheet.Range("d" & lRegValue) = strColD
  xlSheet.Range("e" & lRegValue) = strColE
  xlSheet.Range("f" & lRegValue) = strColF
  xlSheet.Range("g" & lRegValue) = strColG
  
'Save registry row increment
 SaveSetting sAppName, sSection, sKey, lRegValue + 1
 
     xlWB.Close 1
     If bXStarted Then
         xlApp.Quit
     End If
     
     Set olItem = Nothing
     Set obj = Nothing
     Set currentExplorer = Nothing
     Set xlApp = Nothing
     Set xlWB = Nothing
     Set xlSheet = Nothing
 End Sub

Basado un codigo de Diane Poremsky publicado en slipstick

Codigo anterior modificado para no utilizar registro

Ver Codigo
Option Explicit
Public Sub CopyEmailToExcelWhenArrive(olItem As Outlook.MailItem)
 Dim xlApp As Object
 Dim xlWB As Object
 Dim xlSheet As Object
 Dim rCount As Long
 Dim bXStarted As Boolean
 Dim enviro As String
 Dim strPath As String
 Dim iDefault As Long
'Declare registry
 Dim sKey As String
 Dim lRegValue As Long
 Dim sAppName As String
 Dim sSection As String
'Set name of registry keys
 sAppName = "Outlook"
 sSection = "received"
 sKey = "Current Value Number XLS"
 iDefault = 2
 lRegValue = GetSetting(sAppName, sSection, sKey, iDefault)
 
Dim currentExplorer As Explorer
 Dim Selection As Selection
 Dim objOL As Outlook.Application
 Dim objFolder As Outlook.MAPIFolder
 Dim objItems As Outlook.Items
 Dim obj As Object
 
 Dim strColB, strColC, strColD, strColE, strColF, strColG As String
            
' Get Excel set up
'the path of the workbook
 strPath = "C:\1-Tests\test.xlsx"
     On Error Resume Next
     Set xlApp = GetObject(, "Excel.Application")
     If Err <> 0 Then
         Application.StatusBar = "Please wait while Excel source is opened ... "
         Set xlApp = CreateObject("Excel.Application")
         bXStarted = True
     End If
     On Error GoTo 0
     'Abre la hoja de calculo
     Set xlWB = xlApp.Workbooks.Open(strPath)
     'Especificar nombre de hoja de calculo
     Set xlSheet = xlWB.Sheets("Sheet1")
     'Lee el ultimo registro de la hoja de calculo
     lRegValue = xlSheet.Range("B" & xlSheet.Rows.Count).End(-4162).Row
     ' Requerido para Outlook 2016 -  si genera espacios en blanco
     lRegValue = lRegValue + 1
     
    On Error Resume Next
    
 'collect the fields
     strColB = olItem.senderName
     strColC = olItem.SenderEmailAddress
     strColD = olItem.Subject
     strColE = olItem.Body
     strColF = olItem.To
     strColG = olItem.ReceivedTime
     
 ' Obtener las direcciones Exchange - Se puede remover si no se utiliza Exchange
 Dim olEU As Outlook.ExchangeUser
 Dim oEDL As Outlook.ExchangeDistributionList
 Dim recip As Outlook.Recipient
 Set recip = Application.Session.CreateRecipient(strColB)

 If InStr(1, strColC, "/") > 0 Then
     Select Case recip.AddressEntry.AddressEntryUserType
       Case OlAddressEntryUserType.olExchangeUserAddressEntry
         Set olEU = recip.AddressEntry.GetExchangeUser
         If Not (olEU Is Nothing) Then
             strColC = olEU.PrimarySmtpAddress
         End If
       Case OlAddressEntryUserType.olOutlookContactAddressEntry
         Set olEU = recip.AddressEntry.GetExchangeUser
         If Not (olEU Is Nothing) Then
            strColC = olEU.PrimarySmtpAddress
         End If
       Case OlAddressEntryUserType.olExchangeDistributionListAddressEntry
         Set oEDL = recip.AddressEntry.GetExchangeDistributionList
         If Not (oEDL Is Nothing) Then
            strColC = olEU.PrimarySmtpAddress
         End If
     End Select
End If
'Finaliza Seccion de Exchange
'write them in the excel sheet
  xlSheet.Range("B" & lRegValue) = strColB
  xlSheet.Range("c" & lRegValue) = strColC
  xlSheet.Range("d" & lRegValue) = strColD
  xlSheet.Range("e" & lRegValue) = strColE
  xlSheet.Range("f" & lRegValue) = strColF
  xlSheet.Range("g" & lRegValue) = strColG
  
'Save registry row increment
 SaveSetting sAppName, sSection, sKey, lRegValue + 1
 
     xlWB.Close 1
     If bXStarted Then
         xlApp.Quit
     End If
     
     Set olItem = Nothing
     Set obj = Nothing
     Set currentExplorer = Nothing
     Set xlApp = Nothing
     Set xlWB = Nothing
     Set xlSheet = Nothing
 End Sub

Código exportar información de los correos en la carpeta seleccionada de Outlook a Excel de forma horizontal

El siguiente código exporta la información de la carpeta seleccionada o selección de correos de forma horizontal, ver imagen de ejemplo:

Leer:  VBScript para obtener listado de unidades asignadas (Mapped Drives)
Ejemplo exportar informacion de correos forma horizontal
Ejemplo exportar informacion de correos forma horizontal

 

Instrucciones de Uso

1.- Abrir el editor de Visual Basic (ALT+F11).

2.- Insertar un modulo nuevo (Insert > Module).

3.- Copiar el código VBScript.

4.- Debemos crear un documento Excel el cual guardaremos en una ruta de fácil acceso para el ejemplo creamos un folder en C:\1-Tests\test.xlsx, el cual dentro del folder 1-Tests tenemos nuestras pruebas y el archivo llamado test.xlsx es el documento Excel que creamos. Estos datos los especificamos en la linea 35 del código.

5.- En el documento Excel debemos dar un nombre a la hoja o dejar la predeterminada Sheet1. Este dato lo especificamos en la linea 47 del código.

Para mas información de configuración ver: Como utilizar el Editor VBA en Office (Utilizar Macros VBScript) y Outlook – Crear y configurar reglas

Option Explicit
Option Explicit
Public Sub CopyEmailToExcelWhenArrive() 'olItem As Outlook.MailItem)
 Dim olItem As Outlook.MailItem
 Dim xlApp As Object
 Dim xlWB As Object
 Dim xlSheet As Object
 Dim rCount As Long
 Dim bXStarted As Boolean
 Dim enviro As String
 Dim strPath As String
 Dim iDefault As Long
                                            
'Bloque Registro Declarar Registro - Se puede eliminar si no se utiliza
 Dim sKey As String
 Dim lRegValue As Long
 Dim sAppName As String
 Dim sSection As String
'Dar nombre a las llaves de registro - Se puede eliminar si no se utiliza
 sAppName = "Outlook"
 sSection = "received"
 sKey = "Current Value Number XLS"
 iDefault = 2
 lRegValue = GetSetting(sAppName, sSection, sKey, iDefault)

'Fin Bloque Registro

 Dim currentExplorer As Explorer
 Dim Selection As Selection
 Dim objOL As Outlook.Application
 Dim objFolder As Outlook.MAPIFolder
 Dim objItems As Outlook.Items
 Dim obj As Object
 
 Dim strColB, strColC, strColD, strColE, strColF, strColG As String
            
'Iniciar Excel
'Ruta del Excel
 strPath = "C:\1-Tests\test.xlsx"
     On Error Resume Next
     Set xlApp = GetObject(, "Excel.Application")
     If Err <> 0 Then
         Application.StatusBar = "Please wait while Excel source is opened ... "
         Set xlApp = CreateObject("Excel.Application")
         bXStarted = True
     End If
     On Error GoTo 0
     'Abre la hoja de calculo
     Set xlWB = xlApp.Workbooks.Open(strPath)
     'Especificar nombre de hoja de calculo
     Set xlSheet = xlWB.Sheets("Sheet1")
     'Lee el ultimo registro de la hoja de calculo
     lRegValue = xlSheet.Range("B" & xlSheet.Rows.Count).End(-4162).Row
     ' Requerido para Outlook 2016 -  si genera espacios en blanco
     lRegValue = lRegValue + 1
     
    On Error Resume Next
    
    'Bloque para leer folder actual- se puede remover si no se utiliza
    Set objOL = Outlook.Application
                                                                            
    Set objFolder = objOL.ActiveExplorer.CurrentFolder
    Set objItems = objFolder.Items
    For Each obj In objItems       

    Set olItem = obj                      
        
 'Recolecta los datos
     strColB = olItem.SenderName
     strColC = olItem.SenderEmailAddress
     strColD = olItem.Subject
     strColE = olItem.Body
     strColF = olItem.To
     strColG = olItem.ReceivedTime
     
' Obtener las direcciones Exchange - Se puede remover si no se utiliza Exchange
 Dim olEU As Outlook.ExchangeUser
 Dim oEDL As Outlook.ExchangeDistributionList
 Dim recip As Outlook.Recipient
 Set recip = Application.Session.CreateRecipient(strColB)

 If InStr(1, strColC, "/") > 0 Then
     Select Case recip.AddressEntry.AddressEntryUserType
       Case OlAddressEntryUserType.olExchangeUserAddressEntry
         Set olEU = recip.AddressEntry.GetExchangeUser
         If Not (olEU Is Nothing) Then
             strColC = olEU.PrimarySmtpAddress
         End If
       Case OlAddressEntryUserType.olOutlookContactAddressEntry
         Set olEU = recip.AddressEntry.GetExchangeUser
         If Not (olEU Is Nothing) Then
            strColC = olEU.PrimarySmtpAddress
         End If
       Case OlAddressEntryUserType.olExchangeDistributionListAddressEntry
         Set oEDL = recip.AddressEntry.GetExchangeDistributionList
         If Not (oEDL Is Nothing) Then
            strColC = olEU.PrimarySmtpAddress
         End If
     End Select
End If
'Finaliza Seccion de Exchange
 
'Escribe valores en hoja de calculo
  xlSheet.Range("A" & lRegValue) = "Sender Name"
  xlSheet.Range("B" & lRegValue) = strColB
  lRegValue = lRegValue + 1
  xlSheet.Range("A" & lRegValue) = "Sender Email"
  xlSheet.Range("B" & lRegValue) = strColC
  lRegValue = lRegValue + 1
  xlSheet.Range("A" & lRegValue) = "Subject"
  xlSheet.Range("B" & lRegValue) = strColD
  lRegValue = lRegValue + 1
  xlSheet.Range("A" & lRegValue) = "Body"
  xlSheet.Range("B" & lRegValue) = strColE
  lRegValue = lRegValue + 1
  xlSheet.Range("A" & lRegValue) = "To"
  xlSheet.Range("B" & lRegValue) = strColF
  lRegValue = lRegValue + 1
  xlSheet.Range("A" & lRegValue) = "Received Time"
  xlSheet.Range("B" & lRegValue) = strColG
  lRegValue = lRegValue + 2

  'Si no se lee folder actual remover
  Next
  
'Guarda el registro - Si se utiliza registro remover el '
 'SaveSetting sAppName, sSection, sKey, lRegValue + 1
 
     xlWB.Close 1
     If bXStarted Then
         xlApp.Quit
     End If
     
     Set olItem = Nothing
     Set obj = Nothing
     Set currentExplorer = Nothing
     Set xlApp = Nothing
     Set xlWB = Nothing
     Set xlSheet = Nothing
 End Sub

Modificación basada en un codigo de Diane Poremsky publicado en slipstick

Leer:  VBScript - Guardar asunto de correos en un TXT en Outlook

Fernando O.

Fernando O.

Soy analista de sistemas actualmente trabajo en una empresa con mas de 200 empleados que utilizan equipo de computo al cual se les da soporte en el departamento.
Uno de mis pasatiempos fuera de la empresa es escribir artículos para PortalMasTips donde documento los problemas, inquietudes y detalles interesantes que se presentan.
Fernando O.

Latest posts by Fernando O. (see all)

165
Deja una respuesta

avatar
 
Archivos de fotos e imágenes
 
 
 
Archivos de audio y video
 
 
 
Otros tipos de archivos
 
 
 
63 Hilos de comentarios
102 Respuestas de hilo
0 Seguidores
 
Comentario más reaccionado
Hilo de comentarios más caliente
45 Autores de comentarios
Fernando O.JoaquinJosé VillacísedEduardo Gonzalez Ibaceta Autores de comentarios recientes

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

  Suscribir  
el más nuevo más antiguo más votado
Notificar de
Israel
Guest
Israel

Hola Fernando, es genial lo que haces! He estado leyendo varias de las soluciones que publicas y ahora me surgen mucho más ideas (y dudas!!).

Tengo una consulta para éste script que publicas, crees que se le pueda añadir el nombre de cada uno de los archivos adjuntos en cada correo??

Y aprovechando el comentario, una consulta más, existe algún script para reenviar un correo con cierto texto en el asunto. Sé que ésto se puede realizar desde las tareas simples de Outlook, pero mi interés es que las direcciones de envío vayan en CCO y sólo la mía en CC? Así los remitentes no pueden ver las direcciones del resto.

Desde ya, gracias por la ayuda!
Saludos.

daniel
Guest
daniel

Saludos gracias por el aporte, necesito algo realacionado con lo que planteas a ver si me puedes ayudar, necesito que la bandeja de entrada y de salida realize por usuario lo siguiente, de outllok se exporte a excel todo el correo entrante con los datos de cada contacto y a su vez cree unas carpetas por usuarios, ademas de eso incluir el adjunto si fuese el caso y pueda abrirse en pdf o xml, las carpetas por usuario deberian ser enviados y recibidos (subcarpetas) y por ultimo crear una especie de alarma que no sea la del outlook que indique revision del correo o responder a tal correo, se que lo que planteo es bastante complicado por eso te escribo, gracias de antemano por la atencion prestada:

Daniel

Daniel T
Guest
Daniel T

Saludos fernando te explico lo siguiente disculpa que no me he explicado de la mejor manera, entiendo que son varios scripts los que requiero, aqui mi necesidades 1. el script lo requiero para entrada y salida de correos para ambos, todos los contactos, que me almacene en una carpeta en cualquier lugar que yo elija, por usuario y dentro de ello una subcarpeta con la fecha de envio o recepcion sea el caso y finalmente el adjunto, probe el ultimo script pero da un error 76 lo depure y es en la linea de oFSO.CreateFolder saveFolder. Cada carpeta por usuario deberá tambien crearse dos subcarpetas 1.) “Recibidos”, es decir, los E-Mail´s que me envío “Juanito Pérez” 2.) “Enviados”, donde irán todos los E-Mail´s que yo le envíe a “Juanito Pérez” a lo largo del tiempo. De esta forma tanto la carpeta “Recibidos” como “Enviados” contendrán carpetas con fechas las cuales contendrán todos los archivos que se adjunten en ese correo en particular (ya sea un correo que recibí o envié). Puedo así tener un respaldo organizado de todos los correos que me envían y que yo envío diariamente a lo largo del tiempo, en otras palabras, poder acceder ordenadamente a todo el contenido del correo por usuario, tipo y fecha. Finalmente para este punto requiero que las carpetas se ordenen automáticamente según el departamento en donde trabaja el o la que me envío el E-Mail, es decir, las carpetas anteriormente solicitadas, irán dentro de una carpeta llamada “Facturas” que es el departamento en donde trabaja ese individuo en particular. 3.)Los contactos de Outlook generalmente traen información en su tarjeta de contacto, tal como: número de celular, teléfono, E-Mail etc. Es por esto que re-quiero que junto al punto número 1 se extraigan estos datos y se coloquen en un archivo… Leer mas»

Jose
Guest
Jose

Hola!

Te felicito por el articulo, pero tengo una duda…. La siguiente ruta del registro no existe en mi computador
HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings\Outlook\received

Debo crearla?????

Saludos

fiscofre
Guest

Hola Fernando! he realizado todos los pasos solicitados, pero al momento de ejecutar la macro… se abre la ventana donde se listan los nombres de todas las macros que han sido creadas con las opciones (ejecutar , cancelar, paso a paso, modificar, crear, eliminar). El problema es que no aparece el nombre de esta macro “CopyEmailToExcel….” favor ayúdame, SALUDOS!

Felipe
Guest
Felipe

Hola Fernando! Partiendo por felicitarte por todo tu trabajo y muchas gracias por la ayuda que entregas… quería ver si me puedes dar una mano con una macro… necesito crear una macro que me permita seleccionar la carpeta de donde yo quiero exportar los correos a un archivo excel… anteriormente me funcionaba sin problema… pero ahora me di cuenta que no me exporta todos los correos, ya que durante la ejecución se produce una interrupción con el error ’13’ (No coinciden los tipos). a continuación te dejo el código que usaba… sólo necesito exportar datos como la hora de envío, remitente, asunto(es lo mas importante que necesito…), espero me puedas ayudar. Sub ExportarAExcel() Dim olns As Outlook.Namespace Dim myInbox As Outlook.Folder Dim XLApp As Object Dim wkb As Object Dim wks As Object Dim StartCount As Long Dim myRecipient As Outlook.Recipient Dim outlookmessage As Outlook.MailItem Set olns = Outlook.GetNamespace("MAPI") Set myInbox = olns.PickFolder On Error Resume Next Set XLApp = GetObject(, "Excel.Application") If Err Then Set XLApp = CreateObject("Excel.Application") End If XLApp.Visible = True On Error GoTo 0 Set wkb = XLApp.Workbooks.Add Set wks = wkb.Sheets(1) With wks StartCount = 1 For Each outlookmessage In myInbox.Items StartCount = StartCount + 1 .Range("A" & StartCount).Value = outlookmessage.ReceivedTime .Range("B" & StartCount).Value = outlookmessage.SenderName .Range("C" & StartCount).Value = outlookmessage.Subject .Range("D" & StartCount).Value = outlookmessage.SenderEmailAddress .Range("E" & StartCount).Value = outlookmessage.Body Next End With Set olns = Nothing Set myInbox = Nothing End Sub

Carlos
Guest
Carlos

Buenos dias Fernando,

Estoy gestionando tu macro en mi outlook 2016 y cuando me llega un mail no me realiza el traspaso de información… He probado con otra macro para asegurar que la regla me funcione correctamente y me realiza la macro… Que puede ser que no me ejecute tu macro??

Gracias

Carlos
Guest
Carlos

Buenas de nuevo Fernando,

Tras hacer diversas pruebas con la macro en mi PC funciona perfectamente (outlook 2016). Pero cuando copio la macro y pongo la misma configuracion en otro PC con versiones de outlook 2010 la macro no funciona, se que se ejecuta pq si le quito una declaración de variable me da error pero no me copia ninguna información… Puede ser por las versiones?

Muchas gracias!

clara
Guest
clara

Buen día Fernando, tu scrip me resulto excelente, pero no se si me puedas apoyar, manejo varias carpetas de cuentas compartidas en el correo y requiero que bajar la información igual estoy utilizando la exepcion de Outlook.Folder pero sin tener exito

isaac
Guest
isaac

No me deja correrlo me dice que no se a definido el tipo definido por el usuario

saludos

isaac
Guest
isaac

Hola de nuevo

ya pude hacer que funcione, de verdad muchas gracias.

Tengo un problema, cada que llega un correo se cierra el excel y ademas el formato que aparece no me favorece para la visualización de la información

hay algún modo de modificar el formato??

y como puedo evitar que se cierre el excel?

saludos y de antemano gracias

christian pardes
Guest
christian pardes

hola fernando una consulta quiero ejecutar una macro que reenvia correo que llega ala bandeja de entrada , encontre en internet un codigo te lo adjunto : Private Sub Application_Startup() ‘ esta será la carpeta inspeccionada. Set oFolderItems = Session.Folders(“[email protected]”).Folders(“Bandeja de entrada”).Folders(“NOVEDAD”).Items End Sub ‘Private Sub Application_Quit() ‘ MsgBox “Goodbye, ” & Application.GetNamespace(“MAPI”).CurrentUser ‘End Sub Private Sub Application_Quit() Set oFolderItems = Nothing End Sub Private Sub oFolderItems_ItemAdd(ByVal Item As Object) Dim oMsg As MailItem Dim oMoveToFolder As Outlook.MAPIFolder Dim oNameSpace As Outlook.NameSpace Dim i, j As Integer Set oNameSpace = Application.GetNamespace(“MAPI”) ‘ esta será la carpeta a la que moveremos los mensajes una vez procesados (enviados) Set oMoveToFolder = oNameSpace.Folders(“[email protected]”).Folders(“Bandeja de entrada”).Folders(“Bryan”) On Error GoTo ErrorHandler j = oFolderItems.Count ProgressBox.Percent = 0 ProgressBox.Text = “Wait…..” ProgressBox.Show For i = 1 To j If i 1 Then ExecPause 1 End If Set oMsg = Application.CreateItem(olMailItem) ‘Debug.Print oFolderItems(1).Subject oMsg.Body = oFolderItems(1).Body oMsg.Subject = oFolderItems(1).Subject ‘ a continuación la dirección de correo electrónico donde serán reenviados los mensajes. oMsg.Recipients.Add “[email protected]” oMsg.Send ProgressBox.Increment (100 * i) / j, “Procesado ” & oFolderItems(1).Subject ExecPause 1 oFolderItems(1).Move oMoveToFolder Set oMsg = Nothing Next ProgressBox.Hide Set oNameSpace = Nothing Set oMoveToFolder = Nothing ProgramExit: Exit Sub ErrorHandler: MsgBox Err.Number & ” – ” & Err.Description Resume ProgramExit End Sub Private Sub ExecPause() iPauseTime As Integer Start = Timer Do While Timer < Start + iPauseTime DoEvents Loop Finish = Timer End Sub .. lo coipie en en thisoutlokksession , pero no se ejcuta nada tienes alguna idea de como ejecutar esta macro ya uqe la necesito para mi trabajo MICROFSOTF 2010.. Saludos

Gabriel Romero
Guest
Gabriel Romero

Buen día Fernando, quisiera saber si puedes colaborarme con los siguiente ando con la creación de un sistema que ayude a la asignación y respuesta de solicitudes que llegan al area, por lo cual necesito que Excel extraiga los asuntos y quien envía el correo y del mismo modo cuando sea contestado el correo me notifique de alguna manera en el Excel

quedaría super agradecido si me ayudaras, cualquier duda o sí no fui claro dime si por otro medio es más fácil tu colaboració

Gabriel Romero
Guest

Hola Fernando, ante mano muchas gracias por tu tiempo para responder las preguntas, soy nuevo en el foro y quisiera saber sí existe una manera de copiar el código ya que no me deja seleccionarlo debe ser porque es una imagen.

al mismo tiempo quisiera comentarte lo siguiente necesito de alguna manera extraer la información de la bandeja de entrada de una cuenta de outlook a excel extrayendo datos como hora y fecha de recibido quien lo envía y el asunto, pero a su vez necesito que cuando este correo sea respondido al que lo envié en excel me diga en otra casilla respondido, de verdad quedaría suprema mente agradecido con tu ayuda.

Gabriel Romero
Guest

Hola Fernando soy nuevo en esto no he podido correr el Script ;( no se porque no me funciona, podrias explicarme por favor

Sergio
Guest
Sergio

Por algún motivo me deja el body en blanco utilizando tu script tal cual. Me genera información sobre el título del e-mail y sobre la hora de recibirlo pero con el body (que es lo que necesito) no me funciona 🙁 que puede ser?

Irene
Guest
Irene

Buenas tardes Fernando,

ENHORABUENA por tus artículos porque son geniales y muy didácticos! El script de este artículo me funciona perfectamente, aunque voy a necesitar una modificación, me gustaría desglosar la información de los correos (que son todos iguales) por columnas. Si el body de mi correo es:

Event: ENTERED: HW Danger/Alarm 2
Location: Grupo 4\Grupo 4\Alternador\Rotor\Cojinete6\6C
Severity: 4
Date/Time: 4/5/2017 1:10:27 PM

Quiero obtener en Excel los datos repartidos en 4 columnas:

Event Location Severity Date/Time

¿Es posible con el mismo macro? ¿o hay que hacer uno a parte en Excel para que ponga todos los datos en orden?

Gracias de antemano y un saludo!!

Gustavo
Guest
Gustavo

Quiero saber si es posible, que con una macro se pueda contestar un correo en especifico de Outlook o tengo que crear desde cero el correo con Subject, destinararios, etc..

Manuel
Guest
Manuel

Buenas Fernando, oye crees q se podría hacer algo para desde una carpeta de outlook determinada pasar todos los correos que hubiera en esta a excel?
Lo necesario sería el destinatario y el cuerpo del correo que vendría a ser una tabla, pegando en una hoja de excel, pero uno debajo de otro.

Gracias.

Manuel Martín
Guest
Manuel Martín

Fernando he probado el código, no me da error pero no me pasa los correos al archivo, este se queda en blanco.

Manuel
Guest
Manuel

Oye Fernado, estoy trabajando con la segunda parte del código que me pasaste, ahora es sobre excel; tengo que limpiar mucho texto y organizar después de pegar los cuerpor de los correos. Busco algún bucle que se ejecute siempre y cuando se cumpla una condición. Ejemplo Hoja Excel A B C 1 X 1 2 2 1 3 4 2 4 Y 1 5 3 Lo que busco es que en la columna A tome el primer valor de la misma y lo pegue hacia abajo siempre y cuando en la columna B tenga algún valor. Quedaría así: A B C 1 X 1 2 2 X 1 3 X 4 2 4 Y 1 5 Y 3 Gracias

Fede Has
Guest
Fede Has

Buen día Fernando, estoy copiando exactamente el código como lo publicas, el excel tal cual mencionas pero no ocurre nada, no aparece nada en el archivo Excel. Que sugeris? Gracias.

Jaime Osses
Guest
Jaime Osses

Hola Fernando,

Agradezco tu ayuda, necesito generar un archivo txt con el asunto de cada correo recibido de forma automatica.

SvenGD
Guest
SvenGD

Muy buenas!!

Yo concretamente me estoy volviendo loco, no veo porque me salta todo el rato este error:

No se ha definido el tipo definido por el usuario. y el error es en la linea ” Dim currentExplorer As Explorer”

Mil gracias por tu ayuda,
Sven G.D.

SvenGD
Guest
SvenGD

Buenas Fernando

Nada no hay manera… no se que ando haciendo mal. Agradezco de todas formas tu contestación y ayuda. Te felicito por tu trabajo con esto.

No se si seria posible que subieras un archivo sample donde este todo esto.

Mil gracias!!
Sven G.D.

angel
Guest
angel

saludos y gracias por todo lo que haces aqui, es de muchisima ayuda.

Llegue a tu blog buscando la solución aun problema, tengo que enviar la información de outlook de los correos de una carpeta en especifico, y que se copien los valores de fecha y hora de recepción, subject, y además la fecha y hora en la que se marca como terminado. Me tomaré el tiempo necesario para leer todos los aportes que diste para buscar la solución a este problema. De momento lo hago manual arrastrando los correos a la hoja de excel con la que trabajo.

Saludos

Manuel Nu{ez
Guest
Manuel Nu{ez

Hola Fernando, buen día

Voy descubriendo el sitio y tus aportes, muy completos y que labor tan noble, muchas gracias.

Estoy viendo que el código es para los correos que llegan, ¿habrá la forma de cambiarlo por los de salida? Viendo el destinatario. Ya que deseo hacer un conteo de los correos que le envío a cada uno de los clientes con fecha, para llevar un control, me sería muy útil.

¿Me ayudas?
saludos y muchas gracias de antemano.

Juan Jose Bravo Lazarte
Guest

Hola Fernando

Muchas gracias por todo tu aporte, ayudas a muchos en su dia a dia, tengo un problema, cuando le di aplicar a la regla me salio un error de depuracion y me manda a la ventana del VBA y me señala la linea 21 como no reconocido, luego he visto que has modificado el script y pegue el ultimo que publicaste en el comentario de SvenGD 26 mayo, 2017 at 1:43 am.
Pero ahora la linea 2 me da error también de no reconocido, pls tu ayuda no logro hacerla funcionar.

Enrique Valdivia
Guest
Enrique Valdivia

Buenos días Estimado, De antemano agradecerte por tu aporte, ha sido muy valioso para el trabajo de medición que estamos haciendo en mi labor diaria. Te quisiera pedir un apoyo respecto a la exportación de los corres enviados; he logrado configurar lo para que funcione y exporte a un 2do archivo en excel, pero al momento de registrarse la información, solo queda registrado el ultimo correo enviado. Por alguna razón, no crea un registro historico, sino que se sobreescribre y deja una sola linea en el excel. El script que uso es el siguiente: Option Explicit Private Sub Application_ItemSend(ByVal olItem As Object, Cancel As Boolean) Dim xlApp As Object Dim xlWB As Object Dim xlSheet As Object Dim rCount As Long Dim bXStarted As Boolean Dim enviro As String Dim strPath As String Dim iDefault As Long 'Declare registry Dim sKey As String Dim lRegValue As Long Dim sAppName As String Dim sSection As String 'Set name of registry keys sAppName = "Outlook" sSection = "received" sKey = "Current Value Number XLS" iDefault = 2 'lRegValue = GetSetting(sAppName, sSection, sKey, iDefault) Dim currentExplorer As Explorer Dim Selection As Selection Dim obj As Object Dim strColB, strColC, strColD, strColE, strColF, strColG As String ' Get Excel set up 'the path of the workbook strPath = "C:\1-Tests\test2.xlsx" On Error Resume Next Set xlApp = GetObject(, "Excel.Application") If Err 0 Then Application.StatusBar = "Please wait while Excel source is opened ... " Set xlApp = CreateObject("Excel.Application") bXStarted = True End If On Error GoTo 0 'Abre la hoja de calculo Set xlWB = xlApp.Workbooks.Open(strPath) 'Especificar nombre de hoja de calculo Set xlSheet = xlWB.Sheets("Test") 'Lee el ultimo registro de la hoja de calculo lRegValue = xlSheet.Range("B" & xlSheet.Rows.Count).End(-4162).Row ' Requerido para Outlook 2016 - si genera espacios en blanco lRegValue = lRegValue +… Leer mas»

José López
Guest
José López

Muchas gracias por toda la información que compartes, Fernando, ya que es de gran valor.
Llevo muy poco tiempo programando y no consigo localizar una propiedad del correo que me permita identificar unívocamente un correo entrante y su relación con los correos salientes que sean contestación o reenvío del original. ¿Existe dicha variable?

MI idea es tener una base de datos con las cabeceras de los correos entrantes, así como los correos salientes y comprobar el tiempo que se tarda en contestar un correo.

Muchas gracias de antemano.

Jhonatan
Guest
Jhonatan

Fernando buenas tardes,
Una pregunta, necesito por favor saber cómo hacer para almacenar el asunto y remitente de un correo en un archivo.txt al momento de eliminarlo ya sea con el botón eliminar o con teclado.

Agradecería enormemente tu ayuda.

Jhonatan
Guest
Jhonatan

Gracias Fernando,
He leído el artículo y hay un evento llamado BeforeDelete pero no se cómo implementarlo, podría ser esa la solución y me podrías dar una luz por favor con este tema

José López
Guest
José López

Buenas tardes Fernando:

He usado la propiedad ConversationIndex, ya que la ConversationID, no siempre me da un valor cuando envío la respuesta a un correo.
Utilizando esta opción, tengo los siguientes valores para un correo de entrada y su respuesta:

Entrada———– ConversationIndex :01D2F1B640ADDFD648BF04AD4D13AB59F39056396B7D
Salida———– ConversationIndex: 010209F763AA98FDB7D162BE51282D85423BEEC38EE4A1CF7DE320

Como se puede observar no son iguales, ni tiene una parte en común.

¿puedes darme otra orientación?, ya que por más que investigo, no consigo obtener ninguna información clara.

Gracias por tu ayuda.

Jaime
Guest
Jaime

Buenas, es inmensamente eficaz toda la información que he podido contrastar en este artículo.
Hasta hoy, ejecutaba genial una regla que me pasaba tal cuál mencionas en el ejemplo de este artículo, un body de un email y los demás campos, se generaba un registro (visible con REGEDIT) y lo pasaba todo estupendamente a una tabla Excel.
Hará unos días dejé el portátil encendido y ejecuté una regla que comprobase una carpeta con más de 10.000 emails para pasar a un Excel tal cuál tu código, marcándome el inicio de una larga espera nocturna, y cuál es mi sorpresa cuando al día siguiente compruebo que se ha quedado detenido o mejor dicho “colgado” en la fila 3.400 aproximadamente del Excel. El Outlook no obedece por lo que me toca apagar y encender de nuevo.
Pero mi problema empieza cuando vuelvo a ejecutar la regla, ya que no obedece en ningún momento.
Mi necesidad me hace eliminar la regla, el Excel, volver a pegar el código en visual basic script, elimino el registro, y cuando lo genero todo de nuevo, no pasa nada al Excel, ni siquiera genera el registro, por lo que decido escribir al no saber qué más cosas probar…
Eh aquí mi nivel de desesperación para tener que recurrir al “padre de mi aplicativo” que me deja todos los emails que necesito en un Excel para poder manipular dichos datos a mi antojo.

Espero no haberte aburrido demasiado y puedas darme alguna pequeña solución de maestro experto en la temática tratada…
Abrazos!

juan gabriel romero cano
Guest

Buen dia Jaime quisiera contar con tu acostumbrada colaboración; quisiera saber si es posible que cada vez que llegue un correo a mi bandeja de entrada se vaya a una carpeta específica si en el correo también va copia ciertos contactos, quedaría agradecido profundamente

juan gabriel romero cano
Guest

Hola Fernando como vas???, enserio que pena moelstarte tanto, pero necesito otra ayuda, necesito que al enviar los correos se vayan directamente a una carpeta del local, mirando las reglas solo deja enviar una copia, es posible que todo correo que sea enviado se vaya a una local sin que quede nada en al carpeta enviados del outlook?

Cristian Salas
Guest

Buenos días Fernando, te hablo de Sinaloa, en busca de una solución que me están pidiendo en mi trabajo, me piden que en determinados correos que llegan a una bandeja, o mas bien los correos que tengan una tabla de solicitud de prestamos que venga ya rellenada obviamente por los clientes, se exporte a un excel, se puede agregar ademas de la tabla que viene en el cuerpo, el remitente asunto etc.
este link de abajo es la imagen de la tabla que me mandaran rellenada los clientes.

https://drive.google.com/open?id=0B9lgrdHyZlmhZ1ZWTXlEWXBTcG8

ya se con un boton en una macro en excel o igual con VBA en un modulo al iniciar outllok, o cuando yo jale algun correo a determinada bandeja se active el script, o igual con el boton desde un excel que me exporte en una hoja por separado los correos con esa tabla , o en un excel diferente cada correo para tenerlos separados por cliente. lo que me puedas aportar sera de muchisima ayuda,,ya hice algunos ejemplos de algunos codigos que mencionas arriba, en la mayoria me marca error con el option explicit en esta linea de codigo:
Set olItem = obj

Jhonattan Llanos
Guest
Jhonattan Llanos

Se que es mucho pedir, soy practicante de ingenieria de sistemas y me gustaria saber si podrias hacer un tutorial, ya que nos serviria de mucho para lnosotros. Muchas Gracias

Jhonattan Llanos
Guest
Jhonattan Llanos

Estimado me gustaria saber si tienes algun tutorial para poder ver los correos dentro de una hoja de excel automaticamente.

Jhonattan Llanos
Guest
Jhonattan Llanos

Exacto. lo que pasa es que constantemente nos llegan requerimientos en el trabajo y quisieramos crear un correo donde solo lleguen requerimientos, y esos correos me gustaria poder verlos en filas de excel. Es posible? Saludos

kary
Guest
kary

Hola Fernado antes que nada queiro felicitarte, tengo una duda tengo varios PST´y no se como indicarle cual el pst correcto y de que folderdebe de extraer la informacion

Richard
Guest
Richard

Hola Fernando y buenas noches, tenia una consulta sobre una macro para el outlook. Lo que ocurre es que en mi trabajo me solicitan que pueda copiar los datos de unos correos, para ser exactos solo “Nombre de la carpeta de donde esta, correo del remitente, el asunto, la hora y la categoria”. Lo que pasa es que estos correos estan dentro de una carpeta, que esta dentro de otra carpeta, que esta dentro de otra carpeta y asi. La estructura es la siguiente, La carpeta “Asesores” que es la carpeta raiz por asi decirlo, dentro se encuentran varias subcarpetas con los nombres de los asesores por ejemplo “Mayra” y dentro de esta subcarpeta estan otras carpetas donde se distribuyen los correos dependiendo de su categoria, como por ejemplo “prestamos”, “liquidaciones” etc. Tengo este codigo que coloca los datos que necesito, lo que pasa es que muestra el nombre de la carpeta en la esta el correo en la Fila 1, pero lo que yo quiero y no puedo lograr es que muestre solo la carpeta del asesor al que pertenece, es decir que diga “Mayra” o “Jose” dependiendo de a que asesor corresponde. Con este codigo me permite seleccionar la carpeta raiz y copia todos los datos de los correos pero terminan como antes mencione. Para explicar mejor las carpetas estan asi dentro del Outlook: Asesores/Nombre del asesor “que es el dato que necesito”/Carpetas con el nombre de la categoria. Crees que me puedas ayudar?, Mucha gracias de ante mano y saludos. Codigo: Public xlSht As Excel.Worksheet Sub DocumentFolders(objParent As folder, lRow As Long) Dim objItm As Object Dim objFolder As folder On Error Resume Next With xlSht For Each objItm In objParent.Items .Cells(lRow, 1) = objParent .Cells(lRow, 2) = objItm.SenderEmailAddress .Cells(lRow, 3) = objItm.Subject .Cells(lRow, 4) = objItm.ReceivedTime… Leer mas»

Richard
Guest
Richard

Muchas gracias.
Cualquier aporte sera bienvenido.

sergio borges
Guest
sergio borges

Hola Fernando.
Muy interesante todo esto que posteas.
Quisiera ver si me puedes ayudar :
1.- Funciona para outloock de off 365 ?. Me dicen de microsoft que los script no funcionan para off 365, entonces quiero saber para ver si me pongo a leer tu post y aplicarlo.
2.- Tengo 2 necesidades de los correos que entran, en ambas es generar un excel
2.a.- El correo trae solamante texto (texto plano) de cual requiero los campos elementales (asunto, fecha, cuerpo,, etc)
2.b.- El correo trae una tabla de datos de la cual requiero extraer los datos

gracias, saludos

Gabriel Rojas
Guest

Hola fernando, tengo una duda, me funciona de maravilla tu Macro para exportar los datos a excel muchas gracias!! pero me gustaria saber si puedo exportar también los datos adjuntos , por ejemplo una planilla excel personalizada a cada proveedor.

Muchas gracias por tu tiempo !

Carlos Castro
Guest
Carlos Castro

Buenas noches Fernando…!!!

De verdad muchas felicidades, eres un master con los codigos estoy leyendo algunos para ver si alguno se apega a mis necesidades, y creo que uno si, pero mejor pregunto??

Me solicitan que de los correos solo busque en la redacción NOMBRES del personal, hasta el momento tengo 600 correo que tengo que revisar un por uno y seleccionar el nombre y pasarlo a excel, se pude crear una macro que me busque este dato??

Espero me puedas ayudar, gracias

Excelente Noche

Joaquin
Guest
Joaquin

Hola, Fernando! Muy buena la publicación!

Te hago una consulta. Yo nunca armé una Macro en Excel, y para el trabajo me pidieron intentar armar una que tome datos de unos archivos adjuntos que llegan por mail, y actualicen un libro de un archivo de Excel. Estuve buscando, y todos los ejemplos son con Outlook. El problema es que en el trabajo utilizamos Lotus Notes.

Tenés idea que podría llegar a utilizar para lograr esta funcionalidad? O dónde puedo buscar?
Muchas gracias!!

Alberto
Guest
Alberto

cuando voy a buscar en el registro del sistema la ruta que señalas HKEY_CURRENT_USER\SOFTWARE\VB, no me aparece en el listado, ahi que esta ocurriendo o que hago??

Lois
Guest
Lois

Buenos días, Fernando:

Estoy buscando una forma de ver los correos respondidos en menos de 48 h, pero no veo manera. Había pensado en buscar alguna columna que me mostrara la Fecha de respuesta, que junto a la Fecha de recibido, me permitiera exportar un listado a Excel y gestionarlo en la hoja de cálculo, pero no encuentro ese parámetro. ¿Hay alguna forma de obtener esa información?

Muchísimas gracias.

Alvaro
Guest
Alvaro

Buenos dias disculpe la molestia tengo un problemita en el codigo de importacion de excel cuando ejecuto la macro me presenta un error en la linea 9 de especificacion del libro y revise y esta bien el nombre ize varias veces prueba pero aun me sale ese error me podria dar alguna solucion

Compartir1
Twittear
Pin
Más en Outlook VBScript
VBScript – Guardar Correos Seleccionados en un mismo Archivo Doc (Word)

VBScript – Agregar número consecutivos en Asunto a los correos recibidos Outlook

VBScript – Guardar los Archivos Adjuntos en Carpetas Especificas Automáticamente Outlook

Cerrar