EXCEL Y OUTLOOK

En el presente post vamos a examinar como trabajar conjuntamente con Outlook y Excel, implementando códigos en VBA. Si bien en la actualidad son cada vez más los usuarios de servicios de clouding y por ende correo web, todavía los clientes mail ocupan un espacio de uso  nada despreciable en muchos ordenadores.

Para automatizar Outlook, primero debe tener acceso a la modelo de objetos de Outlook.   Es decir, para manipular objetos de Outlook, primero debe ser capaz de «verlos».   En general hay dos maneras de exponer un modelo de objetos para su aplicación Excel, conocido como el enlace anticipado y el enlace OLB.

«Enlace» se refiere a la exposición del modelo de objetos del cliente a la aplicación host.   En nuestro caso, eso significa que la exposición del modelo de objetos de Outlook para nuestra aplicación en VBA para Excel, el   modelo de objetos de Outlook se almacena en un OLB (biblioteca de objetos) de archivos.

Para poder tener acceso a la librería de objetos de Outlook procederemos de la misma forma que con Word. Abra el edito VBA y desde la barra de menús Herramientas>Referencias>Microsoft Outlook x.0 (donde x.0 puede ser desde el 9.0 al 14.0, para los ejmplos de este post utilizaremos 14.0).

Vamos a utilizar una macro para ver si se ha establecido correctamente la referencia al objeto. Si todo va bien, se debe de arrancar Outlook y nos saldrá un MsgBox confirmándolo:

Sub probando_referencia()
Dim outlookApp As Outlook.Application
 Set outlookApp = New Outlook.Application
 MsgBox outlookApp.Name
End Sub

Otra forma:

Sub probando_referencia_bis()
    Dim outlookApp As Object

    Set outlookApp = CreateObject(«Outlook.Application»)

    MsgBox outlookApp.Name
End Sub

Utilizamos CreateObject cuando deseamos crear una nueva instancia de Outlook y GetObject para hacer referencia a una instancia en ejecución de Outlook.  El siguiente código utiliza el enlace para mostrar la carpeta predeterminada de la agenda de la instancia existente de Outlook y crea una instancia si no hay una ya existente:

Sub Mostrar_Calendario()
    ‘declaración de objetos
    Dim outlookApp As Object
    Dim olNs As Object

    ‘tratamiento en caso de error
    On Error Resume Next

    ‘recogemos la referencia al objeto Outlook
    Set outlookApp = GetObject(, «Outlook.Application»)

    ‘tratamiento en caso de error que no se pueda crear el objeto
    If Err.Number = 429 Then
        Set outlookApp = CreateObject(«Outlook.application»)
    End If

    On Error GoTo 0
    ‘obteniendo el calendario de la carpeta por defecto
    Set olNs = outlookApp.GetNamespace(«MAPI»)
    ‘si no aparece activamos el explorador
    If outlookApp.ActiveExplorer Is Nothing Then
        outlookApp.Explorers.Add _
            (olNs.GetDefaultFolder(9), 0).Activate
    Else
    ‘en caso contrario lo mostramos
        Set outlookApp.ActiveExplorer.CurrentFolder = _
            olNs.GetDefaultFolder(9)
        outlookApp.ActiveExplorer.Display
    End If
    ‘vaciamos las variables de objeto
    Set olNs = Nothing
    Set outlookApp = Nothing

End Sub

Aunque en posteriores posts trataré el tema de los errores, a fin de poder tener un listado de  errores «previsibles» en ejecución desde el editor pulse F1 (ayuda) y busque
Errores interceptables, podrá ver y analizar diferentes tipos de errores con el número que VBA le asocia.

Algo más complicado sería automatizar el envío de e-mails desde Excel utilizando Outlook. Bueno para el nivel de este blogg_curso quizás es algo avanzado, pero intente leer los comentarios y comprender el código:

Sub mandar_rango_por_correo()
    ‘declaramos las variables
    ‘el rango de origen Source
    Dim Source As Range
    ‘el libro a enviar como miLibro
    Dim miLibro As Workbook
    Dim wb As Workbook
    ‘nombre de la ruta del fichero temporal
    Dim TempFilePath As String

    ‘nombre del fichero temporal
    Dim TempFileName As String

    ‘variables de apoyo para la extensión y formato de fichero
    Dim FileExtStr As String
    Dim FileFormatNum As Long

    ‘variables para crear los objetos aplicación y correo
    Dim OutApp As Object
    Dim OutMail As Object

    ‘inicializamos las variables
    Set Source = Nothing

    ‘si hay error salta a la linea siguiente
    On Error Resume Next

    ‘seleccionamos el rango
    Set Source = Range(«A1:K50»).SpecialCells(xlCellTypeVisible)

    ‘desactivamos cualquier controlador de errores
    On Error GoTo 0

    If Source Is Nothing Then
        MsgBox «El origen no es un rango o la hoja está protegida. » & _
               «Por favor corrígalo «, vbOKOnly
        Exit Sub
    End If
    ‘aceleramos la ejecución del código
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    ‘añadimos un nuevo libro con una sola hoja en el mismo
    ‘de esa forma mandamos una copia del original
    Set wb = ActiveWorkbook
    Set miLibro = Workbooks.Add(xlWorksheet)

    ‘copiamos el origen
    Source.Copy
    With miLibro.Sheets(1) ‘ahora en la hoja 1
        .Cells(1).PasteSpecial Paste:=8 ‘pego el ancho de la columna (a 8)
        .Cells(1).PasteSpecial Paste:=xlPasteValues ‘pego los valores
        .Cells(1).PasteSpecial Paste:=xlPasteFormats ‘pego el formato
        .Cells(1).Select
        Application.CutCopyMode = False
    End With

    ‘utilizo la función Environ para recoger una variable de Windows y asigno el nombre
    TempFilePath = Environ$(«temp») & «\»
    TempFileName = «Selection de » & wb.Name & » » _
                 & Format(Now, «dd-mmm-yy h-mm-ss»)

    ‘según la versión coloco la extensión del fichero
    If Val(Application.Version) < 12 Then
        ‘ Caso de Excel 2000 ó 2003 .xls
        FileExtStr = «.xls»: FileFormatNum = -4143
    Else
        ‘ Caso de  Excel 2007 ó 2010.
        FileExtStr = «.xlsx»: FileFormatNum = 51
    End If

    ‘entrando con Outlook
    Set OutApp = CreateObject(«Outlook.Application»)
    Set OutMail = OutApp.CreateItem(0)

    ‘salvo mi fichero
    With miLibro
        .SaveAs TempFilePath & TempFileName & FileExtStr, _
                FileFormat:=FileFormatNum
        On Error Resume Next
        With OutMail
        ‘rellenando los datos del envío
            .To = «enriquecabell@gmail.com»
            .CC = «»
            .BCC = «»
            .Subject = «Libro de prueba»
            .Body = «Bueno aquí va adjunto el fichero»
            .Attachments.Add miLibro.FullName
            .Send
        End With
        On Error GoTo 0
        .Close SaveChanges:=False
    End With
    ‘ya como no lo necesitamos nos cargamos los ficheros temporales
    Kill TempFilePath & TempFileName & FileExtStr

    ‘vaciando variables
    Set OutMail = Nothing
    Set OutApp = Nothing
    ‘poniendo la casa en orden
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

Deja un comentario