En la macro de hoy veremos como trasladar datos recogidos en una hoja de Excel hacia nuestro calendario de Outlook.
En concreto para nuestro ejemplo necesitamos una hoja en nuestro Libro de Excel llamada 'xlsCalendario' y un calendario en Outlook llamado 'Excelforo' (obviamente podrás ajustar ambas cosas posteriormente sobre el código).
Advertir además que esta macro tiene en cuenta la existencia de varías cuentas de Outlook gestionadas al mismo tiempo, y dentro de cada cuenta disponemos de las carpetas estándar: Entrantes, Enviados, ..., Calendario, etc.
Es importante saber que Outlook se autogestiona basándose en un sistema de Carpetas y Subcarpetas, donde poder localizar la diferente información.
Nuestro objetivo, por tanto, consiste en crear, desde la información contenida en celdas de Excel, diferentes Citas en el Calendario Outlook, completando información requerida habitualmente al generar una Nueva cita.
Mis datos a trasladar desde Excel a Outlook:
En concreto los campos con los que vamos a crear nuestras citas son:
Asunto
Dia Inicio - Hora Inicio
Dia Finalización - Hora Finalización
Cuerpo o Texto de la Cita
Ubicación
Categoría
Estado/Mostrar como:
Todo el día
Añadimos el siguiente código en un módulo estándar de nuestro proyecto de VB:
El resultado tras la ejecución es el esperado:
Como observamos se crean las citas en nuestro Calendario, incluyendo todas las propiedades definidas...
En concreto para nuestro ejemplo necesitamos una hoja en nuestro Libro de Excel llamada 'xlsCalendario' y un calendario en Outlook llamado 'Excelforo' (obviamente podrás ajustar ambas cosas posteriormente sobre el código).
Advertir además que esta macro tiene en cuenta la existencia de varías cuentas de Outlook gestionadas al mismo tiempo, y dentro de cada cuenta disponemos de las carpetas estándar: Entrantes, Enviados, ..., Calendario, etc.
Es importante saber que Outlook se autogestiona basándose en un sistema de Carpetas y Subcarpetas, donde poder localizar la diferente información.
Nuestro objetivo, por tanto, consiste en crear, desde la información contenida en celdas de Excel, diferentes Citas en el Calendario Outlook, completando información requerida habitualmente al generar una Nueva cita.
Mis datos a trasladar desde Excel a Outlook:
En concreto los campos con los que vamos a crear nuestras citas son:
Asunto
Dia Inicio - Hora Inicio
Dia Finalización - Hora Finalización
Cuerpo o Texto de la Cita
Ubicación
Categoría
Estado/Mostrar como:
Todo el día
Añadimos el siguiente código en un módulo estándar de nuestro proyecto de VB:
Sub AñadirCitas_a_Calendario_Outlook() 'trasladamos citas desde Excel hacía el Calendario de Outlook Dim olApp As Object Dim olNs As Object Dim olCarpetas As Object, olSubcarpetas As Object Dim olCalendarios As Object Dim objCita As Object Dim sh As Worksheet Dim i As Long, UF As Long On Error Resume Next 'Creamos el objeto para la aplicación MS Outlook y abrimos Set olApp = GetObject(, "Outlook.Application") If olApp Is Nothing Then Set olApp = CreateObject("Outlook.Application") On Error GoTo 0 'determinamos cuál es la última fila con datos Set sh = Sheets("xlsCalendario") UF = sh.Cells(sh.Rows.Count, "A").End(xlUp).Row If Not olApp Is Nothing Then 'Inicia una sesión de usuario en MAPI Set olNs = olApp.GetNamespace("MAPI") olNs.LogOn 'buscamos, con el doble bucle, entre todas las carpetas de Outlook 'y entre todos los Calendarios existentes el que se llame 'Excelforo' For Each olCarpetas In olNs.Folders For Each olSubcarpetas In olCarpetas.Folders '''''''' If olSubcarpetas.Name = "Calendario" Then For Each olCalendarios In olSubcarpetas.Folders 'con el nombre de nuestro Calendario!! If olCalendarios.Name = "Excelforo" Then 'y recorremos todos los datos de la hoja de cálculo For i = 2 To UF 'Generamos una nueva cita Set objCita = olCalendarios.Items.Add(1) 'y la completamos con la info de la hoja en Excel With objCita 'el Asunto .Subject = sh.Range("A" & i).Value 'la Hora de Inicio .Start = CDate(sh.Range("B" & i).Value) & Chr(32) & CDate(sh.Range("C" & i).Value) 'la Hora de finalización .End = CDate(sh.Range("D" & i).Value) & Chr(32) & CDate(sh.Range("E" & i).Value) 'el Texto o Cuerpo de la cita .Body = sh.Range("F" & i).Value 'la Ubicación de la cita .Location = sh.Range("G" & i).Value 'la categoría que le asignamos .Categories = sh.Range("H" & i).Value 'Mostrar como: 0-Disponible, 1-Provisional, 2-Ocupado, 3-Fuera de la oficina o 4-Trabajando en otro lugar .BusyStatus = sh.Range("I" & i).Value 'si activamos una cita de Todo el día .AllDayEvent = sh.Range("J" & i).Value '.ReminderSet = True 'si queremos tener activa el recordatorio (15 minutos antes, por defecto) .Save 'guardamos la cita End With Next i 'si hemos dado en el bucle con el Calendario buscado 'salimos de éste (dejamos de buscarlo) Exit For End If Next olCalendarios End If Next olSubcarpetas Next olCarpetas End If 'liberamos memoria de los objetos definidos Set olApp = Nothing Set olNs = Nothing Set olStore = Nothing Set olCal = Nothing Set objAppt = Nothing Set xlSheet = Nothing Exit Sub End Sub
El resultado tras la ejecución es el esperado:
Como observamos se crean las citas en nuestro Calendario, incluyendo todas las propiedades definidas...
Muy bueno muchas gracias! Si tengo citas ya creadas a través de mi hoja se sobre escribirían si algo cambia o siempre se crean nuevas?
ResponderEliminarHola,
Eliminarhace tiempo que escribí esto y no recuerdo... pero diría que las crea nuevas
Saludos
Hola Ismael, muy bueno el codigo. solo necesitaria saber como puedo hacer para que sobre escriba si una cita es duplicada o modificada.
ResponderEliminarme podras ayudar?mil gracias
Hola Gustavo,
Eliminarpublicaré en cuanto pueda una solución a tu cuestión
Saludos
Hola Ismael, excelente! aunque tengo la misma inquietud que Gustavo, cada vez que se ejecuta la macro, se duplican los eventos ya existentes. Cómo se podría modificar la macro como para que verifique si un evento ya existe, solo debe actualizar la información que contiene el mismo (sobre el calendario del outlook)? Gracias!
ResponderEliminarHola
Eliminaren un par de semanas está programada la publicación de la respuesta
;-)
Slds
Hola buenas, querría saber como hacer que el calendario sea el predefinido, es decir no tener que crear uno para que salga la cita.
ResponderEliminargracias!
Hola,
Eliminarel nombre por defecto es 'Calendario', así pues podrías usarlo por .Name
o también
Set olNs = olApp.GetNamespace("MAPI")
set olCalendar=olNs.GetDefaultFolder(olFolderCalendar)
lo que determina el calendario por defecto
Saludos
Hola ismael, si publicaste el codigo para evitar repetir las citas? me podrías apoyar con eso, excelente publicación por cierto
ResponderEliminarHola,
Eliminaresto fue lo que se publicó dando respuesta a la duda
https://excelforo.blogspot.com/2018/08/vba-Modificar-Citas-Outlook-desde-Excel.html
Saludos
Gracias por la macro.
ResponderEliminarEstoy probando con mi outlook 365 pero no funciona. parece que no encuentra los calendarios. Podrías ayudarme?
Gracias.
Hola
Eliminarasegúrate que los nombres de los calendarios coinciden con los reales que tengas...
En principio es indiferente qué outlook (versión) emplees
Saludos
Muchas gracias
EliminarHola
ResponderEliminarPara que excel me envié una alerta a outlook de la fecha de vencimiento de una las columnas de excel como podria hacerlo??
Hola
Eliminarpor alerta te refieres a que te llegue un email??? o que te genere una cita?? o qué exactamente??... no conozco la forma de crear alertas en Outlook... (perdón la ignorancia).
En todo caso tendrías que asociar a algún evento de cambio en la hoja (Worksheet_Change) para que detecte la condición que provoque el envío de la alerta... (un IF.. THEN...)
Saludos cordiales
para asignar la cita a varios correos?
ResponderEliminarHola, qué tal estás?, un placer saludarte a ti también.
EliminarNo soy experto en Outlook, pero creo que los calendarios no van asociados a cuentas de correo... sencillamente tienes o puedes tener distintos calendarios.
Pero seguro algún otro usuario puede confirmar este punto y dar algo más de luz
Saludos