Synchroniser Excel avec son calendrier outlook
Bonjour,
Novice en VBA j'essaie avec difficulté de créer des évènements sur excel et qu'ils se créent ensuite automatiquement sur outlook.
L'objectif est de pouvoir créer des tableaux dynamiques croisées ensuite directement à partir des données de rendez-vous sur excel sans avoir à aller regarder sur outlook.
J'ai essayé de suivre des tutos pour le faire mais je n'ai pas réussi.
Pour l'instant j'ai :
Sub ToCalendar()
Dim oOL As Outlook.Application, oAppoint As Outlook.AppointmentItem
Dim oWS As Worksheet, r As Long, i As Long, sStart As String
Set oWS = ThisWorkbook.Worksheets(3)
r = oWS.Range("A1").CurrentRegion.Rows.Count
Set oOL = New Outlook.Application
Const olAppointmentItem As Integer = 1
For i = 2 To r
Set oAppoint = oOL.CreateItem(oIAppointmentItem)
With oAppoint
sStart = oWS.Cells(i, 3)
sStart = Left(sStart, Len(sStart) - 4) & Year(Date)
.Start = CDate(sStart)
.Subject = "Birth Date"
.Location = oWS.Cells(i, 2) & "" & oWS.Cells(i, 1)
.MeetingStatus = olNonMeeting
.ReminderSet = True
.Save
End With
Next i
Set oOL = Nothing
End Sub
J'ai au préalable vérifier dans outils > références > que Microsoft Outlook 16.0 Object Library
Mais en essayant d'exécuter la macro j'ai une erreur d'exécution 13 : incompatibilité type.
Si vous avez une idée pour corriger mon code voir en proposer un plus simple...
Merci encore pour votre aide et votre compréhension.
bonjour,
Sans voir ton fichier,ni connaitre l'instruction qui te donne le message d'erreur, un petit coup de boule de cristal:
essaie en remplaçant cette instruction
Dim sStart as string
sStart = Left(sStart, Len(sStart) - 4) & Year(Date)par
Dim sStart
sStart = dateserial( Year(Date),month(sStart),Day(sStart)) ' si la date en colonne C est une date au format Excel.Bonjour,
merci de mettre un fichier représentatif avec quelques données bidons et sa macro, dans lequel on peut reproduire le problème.
bonjour,
voici une adaptation du code qui devrait fonctionner (j'ai remarqué plusieurs problèmes avec "ton" code tous liés à olappointmentitem et outlookappointmentitem)
Sub ToCalendar()
' ajouter la référence à outloouk library n'est pas nécessaire avec ce code
Dim oOL As Object, oAppoint As Object
Dim oWS As Worksheet, r As Long, i As Long, sStart As String
Set oWS = ThisWorkbook.Worksheets(1)
r = oWS.Range("A1").CurrentRegion.Rows.Count
Set oOL = CreateObject("outlook.application")
For i = 2 To r
Set oAppoint = oOL.CreateItem(1)
With oAppoint
sStart = oWS.Cells(i, 3)
sStart = DateSerial(Year(Date), Month(sStart), Day(sStart))
.Start = CDate(sStart)
.Subject = "Birth Date"
.Location = oWS.Cells(i, 2) & "" & oWS.Cells(i, 1)
.MeetingStatus = olNonMeeting
.ReminderSet = True
'.Display 'pour vérifier l'item créé
.Save
End With
Next i
Set oOL = Nothing
End SubBonjour,
Merci beaucoup de votre réponse détaillée.
Je voulais savoir si l'utilisation d'outlook library pose problème si il y a des mises à jour par la suite. Si c'est le cas il faudrait que je comprenne comment vous faites pour éviter son utilisation.
Je n'avais pas vu votre réponse et entre temps j'ai trouvé un code qui fonctionnait où cette fois-ci je détaillais davantage le tableau de départ.
Sub CREATEAPPOINTMENT()
Dim O As Outlook.Application
Set O = New Outlook.Application
Dim ONS As Outlook.Namespace
Set ONS = O.GetNamespace("MAPI")
Dim CAL_FOL As Outlook.Folder
Set CAL_FOL = ONS.GetDefaultFolder(olFolderCalendar)
Dim apt As Outlook.AppointmentItem
Dim wb As ThisWorkbook
Set wb = ThisWorkbook
Dim ws As Worksheet
Set ws = wb.Sheets("feuil1")
Dim r As Long
For r = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
Set apt = CAL_FOL.Items.Add(olAppointmentItem)
With apt
.Start = ws.Cells(r, 1).Value + ws.Cells(r, 2).Value
.End = ws.Cells(r, 1).Value + ws.Cells(r, 3).Value
.Subject = ws.Cells(r, 4).Value
.Location = ws.Cells(r, 5)
.Body = ws.Cells(r, 6).Value
.ReminderMinutesBeforeStart = TimeValue("00:45:00")
.Save
End With
Next
End SubJe me posais cependant la question si il était possible de modifier le code suivant pour éviter qu'à chaque fois que je l'exécute un évènement se crée même lorsqu'il a déjà été crée auparavant. C'est à dire si je rajoute une ligne (ou plusieurs) à mon tableau qui représente un nouvel évènement (ou plusieurs) et que j'exécute le programme que je n'ai pas à nouveau un évènement crée sur outlook (des doublons aux dates) pour chaque ligne du tableau. Encore mieux si il est possible aussi de modifier un évènement déjà existant.
Je mets ci-joint l'excel modifié.
Merci encore beaucoup du temps que vous avez déjà consacré à ma problématique.
Bonne journée et je vous remercie par avance de votre réponse.
bonjour,
concernant la référence ou non à la librairie Outlook. (Faire une recherche sur early et late binding vba, pour avoir les avantages et les inconvénients de chaque méthode).
concernant les doublons et les modifications d'un événement dans l'agenda.
pour éviter les doublons :
le plus simple (mais le moins de garantie) : ajouter une colonne dans le fichier excel indiquant que l'événement a déjà été créé dans outlook, et ne pas créer de nouvelles entrées pour les événements marqués comme déjà créés.
plus sûr : rechercher dans l'agenda outlook si l'événement existe déjà et ne pas le créer.
pour modifier :
recherche dans l'agenda outlook, l'événement en question et modifier les propriétés souhaitées.
la recherche dans l'agenda outlook peut être lourde s'il y a beaucoup d'entrées dans le calendrier.
Si l'objectif final est de faire des statistiques: je gérerais mes événements dans outlook et utiliserais un programme d'extraction outlook vers excel avec les info dont j'ai besoin pour mes stats.
J'ai déjà essayé d'extraire les données depuis le calendrier outlook vers excel mais je n'arrive pas à ouvrir les données sur excel de façon propre ce qui permettrait de seulement générer une extraction à implémenter dans une zone prédéfinie liée à un tableau croisé dynamique qui comptabiliserait les données de rendez-vous que je souhaite.
Auriez-vous une idée de comment procéder ?
J'ai déjà essayer avec la fonction d'exportation d'outlook avec peu de succès?
Merci, bonne après-midi.
J'ai crée un nouveau sujet de discussion sur le forum vu que ce n'est plus exactement le même. Encore merci pour votre aide, bonne fin de journée.
