EXCEL Y OUTLOOK
20 septiembre, 2011 Deja un comentario
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