Inicio MS / Office VBScript – Exportar Información de correos Outlook a Excel

VBScript – Exportar Información de correos Outlook a Excel

COMPARTIR


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

Basado un codigo de Diane Poremsky publicado en slipstick

43 Comentarios

  1. 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.

    • Buen dia Israel

      La segunda consulta no comprendi bien, quieres que al dar responder las direcciones vayan al campo CCO?

      Para tu primer consulta claro que si se puede agregar, agregue las lineas necesarias

      • Hola Fernando,

        Me funcionó perfecto el script que publicaste, era justo lo que quería mil gracias!!

        Sobre la segunda consulta, intento explicarme mejor: Recibo un correo todos los días, el cual reenvío a varios compañeros (alrededor de 70), siempre viene con el mismo título y del mismo remitente; las reglas predeterminadas de reenvío de Outlook no me conviene porque sólo puedes poner direcciones en los campos PARA o CC. La idea sería tener un script que al asociarlo a una regla (que verifique el asunto del mensaje recibido) reenvíe el correo (con adjuntos) a los destinatarios deseados pero en CCO, para ésto, las direcciones de los destinatarios podrían estar dentro del mismo script, ya que éstas direcciones casi no las cambio.

        No sé si mejoro o empeoró la explicación!!

        Gracias y saludos.

  2. 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

    • Buen dia Daniel!

      Para crear las carpetas puedes utilizar otro Macro verifica en este articulo cual se ajusta a tus necesidades “VBScript para guardar automáticamente archivos adjuntos Outlook

      Para que te muestre un Mensaje tipo Popup puedes utilizar este pequeño código lo puedes configurar en otro modulo y ejecutar con regla. el unico problema que no se actualizara la bandeja de entrada hasta que den OK.

      • Gracias por la informacion, si claro me ayudo mucho en eso estoy, quisiera es que ademas de la carpeta del usuario se cree una subcarpeta con la fecha del envio y dentro de ella el adjunto, y por otro lado que el correo se elimine apenas llegue al outlook que la bandeja se mantenga vacia en ese sentido y todo quede en las carpetas ya seleccionada anteriormente, nose si me puede ayudar con esto, de todas formas muchas gracias por el apoyo. Saludos desde Venezuela

        • Buen dia

          Daniel Intenta con el siguiente Script, para eliminarlo eso lo puedes hacer desde las reglas de Outlook, que primero ejecute el Script después mueva a Eliminados.

  3. 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 Excel por cada contacto que me escriba un E-Mail. Así puedo tener un respaldo de todos los contactos y así poder comunicarme de manera eficientemente con ellos.

    Quizas sean unas locuras lo que pido ayuda, pero es lo que necesito solucionar, sino se puede entenderé no todo en la vida se puede pero si hay que tratar de intentarlo. Gracias de antemano y disculpa

    • Buen dia Daniel

      He modificado el Script para que no marque el error para la respuesta anterior, este aun no se ejecuta para los enviados ni obtiene los demas datos que solicitas. voy a poner el cola lo que solicitas podria tardar algunas semanas en procesarlo, como les he comentado a otros usuarios tengo otros proyectos primero en fila y también es prioridad no descuidar quien paga las cuentas. Por el momento ajusta el Script con los enviados por mientras se procesa tu solicitud, estamos en contacto.

  4. 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

  5. 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!

    • Buen dia Fiscofre

      No te aparece en el listado de las macros al momento de crear la regla? o estas intentando ejecutar la macro desde el editor de Visual Basic?, si es lo 2do no te lo va a mostrar en ese listado ya que este debe ejecutarse desde una regla.

  6. 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.

    • Olvidé comentarte que la macro la ejecuto desde un archivo excel, y se detiene en el “Next” Sólo me exporta 26 correos que han llegado a la bandeja de entrada, y ahí se detiene 🙁

      • Buen dia Felipe.

        Siempre son exactos 26 registros? puede que se este saliendo del rango de la hoja de Excel.
        Se debe declarar algo como:

        rCount = xlSheet.Range(“B” & xlSheet.Rows.Count).End(-4162).Row

        Para que tome el rango.

        Porque no adaptas el codigo publicado solo debes cambiar los valores en las lineas (lo que esta despues del punto Ej. “.SenderEmailAddress” por “.ReceivedTime”)

        strColC = olItem.SenderEmailAddress
        strColB = olItem.SenderName
        strColD = olItem.Subject
        strColE = olItem.To
        strColF = olItem.ReceivedTime

        por los tuyos.

        .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

        Saludos.

  7. 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

  8. 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!

    • Buen dia Carlos

      Yo lo he utilizado en Outlook 2007 y 2013, mas no en 2010 pero esta raro ya que es una versión intermedio a la que lo he utilizado, si ejecuta cualquier otro macro? el anterior que estuviste utilizando si lo ejecutaba correctamente?

  9. 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

        • Buen dia Clara

          Te paso la idea original de del Codigo el cual exporta a Excel los correos dentro de un folder

  10. 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

      • Hola Fernando de verdad muchísimas gracias, solo me queda otra duda, tengo configuradas dos cuentas de outlook, como puedo hacer que funcione el script solo con una de ellas??

        saludos

        y de antemano gracias!

        • Buen dia Isaac

          Al momento de crear la regla en el paso uno te permite seleccionar cual cuenta (through the specified account)[a través de la cuenta especificada] donde vas a seleccionar cual cuenta es en la que deseas ejecutar el script.

          Saludos.

  11. 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(“seguridadfisica4.pe@telefonica.com”).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(“seguridadfisica4.pe@telefonica.com”).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 “cbp.fiis@gmail.com”
    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

  12. 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ó

    • Buen dia Gabriel

      El Script lo que hace es leer los datos de cada correo recibido y escribirlos en una hoja de excel llevando un contador para no sobrescribir renglones.
      De ahí en fuera requieres ligar los correos mediante un ID, realizar la búsqueda en Excel del mismo para obtener el numero de renglón y escribir que fue contestado.
      Creo que te sera mas fácil escribir un script nuevo a modificar este ya que a lo comentado es 1/4 de lo que requieres.

      Saludos.

  13. 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.

    • Buen dia Gabriel.

      Te envíe el código que quieres copiar vía correo electrónico, respecto a lo que comentas los datos que extrae del correo se especifican en las lineas 47 a 52. el cual son las siguientes:

      strColB = olItem.senderName ‘Remitente
      strColC = olItem.SenderEmailAddress ‘ Correo electronico remitente
      strColD = olItem.Subject ‘Asunto
      strColE = olItem.Body ‘Cuerpo de correo
      strColF = olItem.To ‘Destinatario
      strColG = olItem.ReceivedTime ‘Fecha y hora de recepción

      De ahí en fuera para que te capture en el Excel si fue respondido requieres ligar los correos mediante un ID, realizar la búsqueda en Excel del mismo para obtener el numero de renglón y escribir que fue contestado / respondido.

      Lamentablemente, tenemos unos proyectos en puerta y no estamos realizando personalizaciones; tenemos ya bastantes solicitudes el cual en algún momento deseamos responder.

      Saludos.

    • Buen dia Gabriel

      Que versión de Office utilizas?

      Lo primero para trabajar con los scripts es tener habilitados los macros, para esto en Opciones > ajustes de centro de confianza > configuración de macro en este los habilitas.
      Después abres el editor de VBA de Office en este caso en Outlook, abres un nuevo Modulo y pegas código del vbscript.

      Es ta mejor explicado en el siguiente articulo: Como utilizar el Editor VBA en Office (Utilizar Macros VBScript)

      Una vez lo anterior debes crear una regla, donde cada que cumpla las condiciones que especifiques se ejecutara el script. (Si no cumple las condiciones configuradas no realizara accion alguna).

      Outlook – Crear y configurar reglas

      si utilizas Office 2016

      Me comentas si se ejecuta.

      Saludos.

      • Hola Fernando muchas gracias por tu colaboración, ya me funciono , te tengo tres preguntas si no es mucha molestia

        1) es posible separar la fecha y hora de llegada del correo, para que queden en dos celdas diferentes?

        2) Es posible delimitar el cuerpo del mensaje que queda en el excel?,esto lo necesito porque muchos correos vienen con firmas y espacios entre sí haciendo que la celda de cuerpo quede muy extensa

        3) Es posible reinicar el contador?? es q usando un archivo nuevo para extraer los correos me empieza en número de celdas muy adelantado

        Muchas gracias por tu tiempo y ayuda

        • Buen dia Gabriel

          Me alegra que ya te haya funcionado el script, te anexo un codigo respondiendo tus consultas.

          1.- Si es posible, se agrego una nueva columna linea 54; en las lineas 53 y 54 se agrego el formato.
          2.- También se agrego en la linea 51 el limite, yo lo limite a 50, tu lo puedes ajustar al numero de caracteres que desees.
          3.- También es posible reiniciar, en el punto 7 del articulo se explica como hacer esto; si va a ser frecuente te recomiendo que exportes el registro asi cada que quieres reiniciarlo solo ejecutas el archivo del registro. entra al siguiente articulo: Como realizar un respaldo del registro de Windows para que veas la idea.

          Código

          Saludos.

Deja un comentario...