jueves, 19 de octubre de 2017

VBA: Rellenar Citas del Calendario de Outlook desde Excel

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.

VBA: Rellenar Citas del Calendario de Outlook desde Excel



Mis datos a trasladar desde Excel a Outlook:

VBA: Rellenar Citas del Calendario de Outlook desde Excel



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:

VBA: Rellenar Citas del Calendario de Outlook desde Excel



Como observamos se crean las citas en nuestro Calendario, incluyendo todas las propiedades definidas...

17 comentarios:

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

    ResponderEliminar
    Respuestas
    1. Hola,
      hace tiempo que escribí esto y no recuerdo... pero diría que las crea nuevas

      Saludos

      Eliminar
  2. Hola Ismael, muy bueno el codigo. solo necesitaria saber como puedo hacer para que sobre escriba si una cita es duplicada o modificada.
    me podras ayudar?mil gracias

    ResponderEliminar
    Respuestas
    1. Hola Gustavo,
      publicaré en cuanto pueda una solución a tu cuestión

      Saludos

      Eliminar
  3. 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!

    ResponderEliminar
    Respuestas
    1. Hola
      en un par de semanas está programada la publicación de la respuesta
      ;-)
      Slds

      Eliminar
  4. 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.
    gracias!

    ResponderEliminar
    Respuestas
    1. Hola,
      el 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

      Eliminar
  5. Hola ismael, si publicaste el codigo para evitar repetir las citas? me podrías apoyar con eso, excelente publicación por cierto

    ResponderEliminar
  6. Gracias por la macro.
    Estoy probando con mi outlook 365 pero no funciona. parece que no encuentra los calendarios. Podrías ayudarme?
    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola
      asegúrate que los nombres de los calendarios coinciden con los reales que tengas...
      En principio es indiferente qué outlook (versión) emplees
      Saludos

      Eliminar
  7. Hola
    Para que excel me envié una alerta a outlook de la fecha de vencimiento de una las columnas de excel como podria hacerlo??

    ResponderEliminar
    Respuestas
    1. Hola
      por 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

      Eliminar
  8. para asignar la cita a varios correos?

    ResponderEliminar
    Respuestas
    1. Hola, qué tal estás?, un placer saludarte a ti también.

      No 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

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.