Date sous excel lié avec outlook [Résolu/Fermé]

Signaler
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
-
 marie -
Bonjour,

Peut-on faire une liaison directe entre un tableau excel et le calendrier de outlook.
Je m'explique, je travaille en maintenance sur des machines, j'ai des travaux qui sont cycliques, tous les 4 mois, 6 mois... j'ai créé un fichier excel comportant des dates avec une colonne "prochaine intervention" qui change automatiquement lorsque je met la date du jour de l'intervention dans la colonne "dernière intervention". Le truc c'est que je dois l'ouvrir toute les semaines pour savoir quand arrivent les échéances, car si j'oublie je peux passer à côté d'une maintenance et avoir de la casse.
J'ai donc pensé à outlook. Lorsque j'ai fais ma maintenance machine, je dois changer la date dans mon tableau excel, est-ce qu'on peut générer une liaison entre la colonne "prochaine intervention" et outlook pour que ce dernier enregistre à date la prochaine intervention avec un intitulé et une alarme de rappel de une semaine voir quinze jour?

J'espère avoir étais clair et je souhaite vraiment que cela soit possible.

En tout cas par avance merci pour votre aide.

15 réponses

Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Bonjour,

Par macro c'est possible relativement facilement.
Tu trouveras une procédure ICI qui fait ce que tu souhaites.
Pour info, voici le code :
Sub NouveauRDV_Calendrier()
'Nécessite d'activer la référence "Microsoft Outlook xx.x Object Library"
Dim OkApp As New Outlook.Application
Dim Rdv As Outlook.AppointmentItem
 
Set Rdv = OkApp.CreateItem(olAppointmentItem)
 
With Rdv
    .MeetingStatus = olMeeting
    .Subject = "Mon Alerte"
    .Body = "...description ...."
    .Location = "Ici même"
    .Start = #10/20/2007 9:30:00 PM#     ' Attention : format mois/jours/année
    .Duration = 30 'minutes
    .Categories = "Amis"
    .Save
End With
 
Set OkApp = Nothing
End Sub

Nota : ne pas oublier d'activer la référence "Microsoft Outlook xx.x Object Library. Pour cela, sous VBE, Outils/références
Cordialement,
Franck
5
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 61366 internautes nous ont dit merci ce mois-ci

Messages postés
6
Date d'inscription
vendredi 3 février 2017
Statut
Membre
Dernière intervention
14 mars 2017

Hello !
suis tres interesse par cette macro. en revanche lorsque je vais dans VBA, dans le menu outils, je n'ai pas acces a references, il est grise
Savez-vous comment l'activer ?
Merci
Messages postés
13177
Date d'inscription
vendredi 22 mai 2009
Statut
Contributeur
Dernière intervention
28 juillet 2020
3 892 >
Messages postés
6
Date d'inscription
vendredi 3 février 2017
Statut
Membre
Dernière intervention
14 mars 2017

Réponse intéressante , merci !
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Ajout d'une fonction week end et jours fériés... Pour le fun.
La macro prend en compte maintenant la date contenue en colonne D moins 7 jours.
Si cette date tombe un week end ou un jour férié, on prends la veille, jusqu'à tomber un jour ouvré...

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MaPlage As Range
'ici on détermine la plage dont les modifications déclencheront la procédure :
Set MaPlage = Range("C5:C261") '***** A ADAPTER ******
'si la cellule modifiée n'est pas dans notre plage on quitte la procédure sans rien faire
If Intersect(MaPlage, Target) Is Nothing Then Exit Sub
'sort également de la procédure si tu effaces le contenu d'une cellule date
If Target.Value = "" Then Exit Sub
'déclaration des variables
Dim strSujet As String, strDescription As String, strLocation As String, datDate As Date, IntDuree As Integer, strCategorie As String
'Attribution des valeurs aux variables
'il est possible de remplacer les valeurs "en dur" par des valeurs contenues dans les cellules
'pour cela, se baser sur Target (= la cellule date modifiée) et faire varier l'Offset pour cibler la bonne cellule
'dans cet exemple, Target est en colonne E.
'Pour cibler la cellule située en colonne A de la même ligne, il convient d'utiliser : Target.Offset(0, -4).Value
'Pour cibler la cellule située en colonne G de la même ligne, il convient d'utiliser : Target.Offset(0, 2).Value
strSujet = "Alerte3"
strDescription = "....Description...."
strLocation = "Ici même"
datDate = CDate(Target.Offset(0, 1).Value - 7) 'date contenue dans la colonne D moins 7 jours
Do While Not JoursOuvres(madate) 'on boucle tant que la date trouvée n'est pas un jour ouvré
   datDate = CDate(datDate - 1) 'on enlève un jour
Loop
'petit test. Si ta cellule date ne contient pas l'heure, l'heure par défaut sera 08:00:00
'inutile de changer le format de la date, la saisir au format jj/mm/aaaa
If InStr(datDate, ":") = 0 Then datDate = CDate(datDate & " 08:00:00")
IntDuree = 30
strCategorie = "Travail"
'Appel de la procédure
Call NouveauRDV_Calendrier(strSujet, strDescription, strLocation, datDate, IntDuree, strCategorie)
End Sub

Sub NouveauRDV_Calendrier(Sujet As String, Description As String, Locat As String, madate As Date, duree As Integer, Cat As String)
'Nécessite d'activer la référence "Microsoft Outlook xx.x Object Library"
Dim OkApp As New Outlook.Application
Dim Rdv As Outlook.AppointmentItem
 
Set Rdv = OkApp.CreateItem(olAppointmentItem)
 
With Rdv
    .MeetingStatus = olMeeting
    .Subject = Sujet
    .Body = Description
    .Location = Locat
    .Start = madate
    .Duration = duree
    .Categories = Cat
    .Save
End With
 
Set OkApp = Nothing
End Sub

Function JoursOuvres(UneDate As Date) As Boolean
Select Case Weekday(UneDate)
    Case vbSunday, vbSaturday
      JoursOuvres = False
    Case Else
      'calcul du dimanche de paques :
      'cf : http://www.developpez.net/forums/d198031/logiciels/microsoft-office/access/access-2000-calcul-jours-ouvr-s-champ-formulaire/#post1279591
      Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer
      Dim f As Integer, g As Integer, h As Integer, i As Integer, j As Integer, k As Integer
      Dim l As Integer, m As Integer, n As Integer, p As Integer, iAn As Integer
      Dim Paques As Date, LundiDePaques As Date, feries(12)
      iAn = Year(UneDate)
      a = Int(iAn Mod 19)
      b = Int(iAn \ 100)
      c = Int(iAn Mod 100)
      d = b \ 4
      e = b Mod 4
      f = (b + 8) \ 25
      g = (b - f + 1) \ 3
      h = (19 * a + b - d - g + 15) Mod 30
      i = c \ 4
      k = c Mod 4
      l = (32 + 2 * e + 2 * i - h - k) Mod 7
      m = (a + 11 * h + 22 * l) \ 451
      n = (h + l - 7 * m + 114) \ 31
      p = (h + l - 7 * m + 114) Mod 31
      Paques = DateSerial(iAn, n, p + 1) 'dimanche de pâques
      LundiDePaques = DateAdd("d", 1, Paques) 'lundi de pâques
      feries(0) = DateSerial(iAn, 1, 1) '1er janvier
      feries(1) = Paques '==> inutile car dimanche mais...
      feries(2) = LundiDePaques
      feries(3) = DateSerial(iAn, 5, 1) '1er mai
      feries(4) = DateSerial(iAn, 5, 8) 'armistice 39-45
      feries(5) = DateAdd("d", 39, Paques) 'ascension
      feries(6) = DateAdd("d", 49, Paques) 'dimanche de pentecôte ==> inutile car dimanche mais...
      feries(7) = DateAdd("d", 50, Paques) 'lundi de pentecôte
      feries(8) = DateSerial(iAn, 7, 14) ' 14 juillet
      feries(9) = DateSerial(iAn, 8, 15) '15 aout
      feries(10) = DateSerial(iAn, 11, 1) 'toussaint
      feries(11) = DateSerial(iAn, 11, 11) 'armistice 14-18
      feries(12) = DateSerial(iAn, 12, 25) 'Noël
      For j = 0 To 12
         If feries(j) = UneDate Then JoursOuvres = False: Exit Function
      Next j
      JoursOuvres = True
End Select
End Function


ça te va?
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Bonjour Pijaku,

Merci pour ta réponse, c'est super cool.
Par contre sur une même machine, j'ai plusieurs travaux mais qui sont pas à la même dates, comment je peux faire?
Dans ma feuille sous excel j'ai une colonne avec plusieurs dates et je voudrais quand changeant la date cela mette à jour outlook automatiquement avec la date que je change. Comment je peux faire?
Si tu le souhaite je peux te donner le dossier pour que tu puisse mieux te rendre compte?
En tout cas un grand merçi car j'approche du but et cela va énormément m'aider...
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Adaptation à ta demande. Tout automatique.
Ce code est à placer dans le module de la feuille amenée à être modifiée.
Pour cela, clic droit sur l'onglet de la feuille concernée / Visualiser le code => vous êtes dans le module de la feuille. Copiez-collez ce code dans ce module (!!!attention, pas dans un module standard!!!).
Il reste juste à adapter la plage de cellules contenant les dates que vous modifiez.
Pour les explications, j'ai largement commenté le code. Mais n'hésitez pas.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MaPlage As Range
'ici on détermine la plage dont les modifications déclencheront la procédure :
Set MaPlage = Range("E5:E261") '***** A ADAPTER ******
'si la cellule modifiée n'est pas dans notre plage on quitte la procédure sans rien faire
If Intersect(MaPlage, Target) Is Nothing Then Exit Sub
'sort également de la procédure si tu effaces le contenu d'une cellule date
If Target.Value = "" Then Exit Sub
'déclaration des variables
Dim strSujet As String, strDescription As String, strLocation As String, datDate As Date, IntDuree As Integer, strCategorie As String
'Attribution des valeurs aux variables
'il est possible de remplacer les valeurs "en dur" par des valeurs contenues dans les cellules
'pour cela, se baser sur Target (= la cellule date modifiée) et faire varier l'Offset pour cibler la bonne cellule
'dans cet exemple, Target est en colonne E.
'Pour cibler la cellule située en colonne A de la même ligne, il convient d'utiliser : Target.Offset(0, -4).Value
'Pour cibler la cellule située en colonne G de la même ligne, il convient d'utiliser : Target.Offset(0, 2).Value
strSujet = "Alerte3"
strDescription = "....Description...."
strLocation = "Ici même"
datDate = CDate(Target.Value)
'petit test. Si ta cellule date ne contient pas l'heure, l'heure par défaut sera 08:00:00
'inutile de changer le format de la date, la saisir au format jj/mm/aaaa
If InStr(datDate, ":") = 0 Then datDate = CDate(datDate & " 08:00:00")
IntDuree = 30
strCategorie = "Travail"
'Appel de la procédure
Call NouveauRDV_Calendrier(strSujet, strDescription, strLocation, datDate, IntDuree, strCategorie)
End Sub

Sub NouveauRDV_Calendrier(Sujet As String, Description As String, Locat As String, maDate As Date, duree As Integer, Cat As String)
'Nécessite d'activer la référence "Microsoft Outlook xx.x Object Library"
Dim OkApp As New Outlook.Application
Dim Rdv As Outlook.AppointmentItem
 
Set Rdv = OkApp.CreateItem(olAppointmentItem)
 
With Rdv
    .MeetingStatus = olMeeting
    .Subject = Sujet
    .Body = Description
    .Location = Locat
    .Start = maDate
    .Duration = duree
    .Categories = Cat
    .Save
End With
 
Set OkApp = Nothing
End Sub

Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Merci Franck,
Je viens de voir ta signature...

Alors c'est presque bon (désolé je suis chiant).
Le problème de ma colonne (D) est qu'elle contient une formule. Je m'explique, j'ai une colonne C ou je rentre la date d'aujourd'hui et la colonne D se met à jour automatiquement par le biais de la colonne E qui elle contient le nombre de mois ou je vais devoir effectuer ma maintenance.
Formule contenu dans la colonne D : =SI(C18="";"";C18+E18*30,5). C'est par cette colonne que je voudrais que outlook se mette à jour.
J'ai autre chose, chaque ligne qui contient une date diffèrente à aussi un travail diffèrent. Peut-on avoir automatiquement la mise à jour dans outlook lorsque je change la date?

Merci beaucoup pour ton aide Franck, c'est très fort, enfin en tout cas, moi ça me dépasse.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
De rien.
En fait, tout était expliqué dans les commentaires du code... Il convient, pour répondre à tes questions, d'utiliser Target.Offset...

Bon j'explique.
Le problème de ma colonne (D) est qu'elle contient une formule ==> Du coup ce n'est pas elle qu'il faut utiliser comme étant la cellule modifiée. Cette cellule servira pour stocker la date qu'on enverra à Outlook.

j'ai une colonne C ou je rentre la date d'aujourd'hui ==> c'est donc les cellules de la colonne C qui sont amenées à être modifiées. Donc, pour nous, Target sera en colonne C.
Donc, dans le code,
Set MaPlage = Range("E5:E261")
, devient
Set MaPlage = Range("C5:C261")
(tu peux augmenter 261 si tu veux plus de lignes).

Mais ce n'est pas cette date (en colonne C) qu'on veut utiliser, mais celle en colonne D...
Pas grave, c'était prévu. Dans le code, remplacer
datDate = CDate(Target.Value)
par :
datDate = CDate(Target.Offset(0, 1).Value)


Rappel : Offset(ligne, colonne) sert à décaler depuis la cellule référence de autant de lignes et de colonnes qu'on lui indique.
Exemple : Range("D5").Offset(-1, 4) pointe la cellule H4

J'ai autre chose, chaque ligne qui contient une date diffèrente à aussi un travail diffèrent. Peut-on avoir automatiquement la mise à jour dans outlook lorsque je change la date?
Plusieurs interprétations de cette phrase, donc je ne comprends pas ce que tu souhaites. Dis m'en davantage.
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Je suis un super novice. J'ai fait une demande de formation sur excel à mon supérieur pour pouvoir y arrivé par moi-même. Par contre je sais que se sera difficile de faire des macro tout seul... Je reviendrais surement vers vous.

Voila se que j'ai dans mes colonnes :
B C
pignons intralox 01/10/2014
4 paliers t.m 04/06/2014
4 roulements t.m 01/10/2014
axe fou 04/08/2014

Se que je voudrais c'est lorsque je change ma date en C l'intitulé de la colonne B se mette en objet dans outlook.

J'ai commencé à faire tes explications. Je vais chercher. Et si je ne trouve pas je reviendrais vers toi. De tout façon, si je trouve je vindrais te le dire.

Merci coach :-)
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
L'objet dans Outlook est représenté, dans ma macro, par la variable strSujet.
Il faut donc lui attribuer la valeur de la colonne B, soit :
au lieu de :
strSujet = "Alerte3"
Mettre :
strSujet = Target.Offset(0, -1).Value
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Bonjour Franck,

J'ai encore trois demandes et après c'est fini, je t'embête plus.
- Peut-on aussi faire aussi un changement de l'alerte outlook quand je change ma date, par exemple mettre l'alerte une semaine avant au lieu de quinze minutes?
- Peut-on aussi demander à excel, lors du changement de date, d'éviter les week-ends et jour férié?
- Et la dernière c'est dans ma formule =SI(C18="";"";C18+E18*30,5), est-ce que je peux instaurer le même système que ma demande ci-dessus?

J'en demande beaucoup, mais là déjà c'est super bien, cela va m'énormément m'aider pour mon travail.

Merci beaucoup pour ton aide.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Bonjour,

Mais ça tu sais le faire.....
Tu as bien une formule pour calculer la date de ton rappel? En colonne D si je ne m'abuse...
- Peut-on aussi faire aussi un changement de l'alerte outlook quand je change ma date, par exemple mettre l'alerte une semaine avant au lieu de quinze minutes?
Suffit, dans ta formule, d'en tenir compte...

- Peut-on aussi demander à excel, lors du changement de date, d'éviter les week-ends et jour férié?
C'est possible, suffit d'en tenir compte dans ta formule également.
Selon les versions d'excel...
Par exemple : https://support.microsoft.com/fr-fr/office/fonction-serie-jour-ouvre-intl-a378391c-9ba7-4678-8a39-39611a9bf81d?ocmsassetid=ha010354380&correlationid=0a5c75e5-028f-46a6-8987-5ee5cb80db1d&ui=fr-fr&rs=fr-fr&ad=fr
et
http://www.excelabo.net/excel/jours_feries_mobiles
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Je me parle bien du rappel? Dans ma formule, je peux inclure le rappel d'outlook? Je n'ai cherché mais j'ai pas trouvé.

Merci pour les deux liens je vais me pencher sur le problème. Je reviens vers toi quand c'est fait.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
La formule en colonne D nous donne bien la date du rappel? ou alors j'ai mal compris...
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Non pas la date, mais le rappel que fait outlook lorsqu'on arrive à échéance pour le jour de ma maintenance. Je voudrais que outlook me face le rappel une semaine avant pour que je puisse préparer mon chantier.
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Ca marche pas, il me met un message d'erreur :
erreur de compilation : type d'argument byref incompatible
Il me surligne en jaune la première ligne et surligne en bleu (madate) de la ligne 21.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Adapte à ta sauce.
Saisie manuelle de date en colonne C :
Set MaPlage = Range("C5:C261") 'A ADAPTER
date obtenue par formule en colonne D :
datDate = CDate(Target.Offset(0, 1).Value - 7) ' A ADAPTER si pas colonne D...
Etc.

Sinon, as tu copié collé la macro?
Je l'ai testée et ça fonctionne bien....
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
J'ai fait un copié coller de la macro et je n'ai rien changé dans la macro que tu as créée, mais j'ai tjs le même message d'erreur.
La saisie manuelle est bien en colonne C et la date obtenue par formule est en colonne D.
Avant ça fonctionnait bien pourtant. Je comprends pas.
Si tu veux je peux t'envoyer un bout de mon fichier? Faut juste me dire comment faire?
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Tu peux m'envoyer un bout de ton fichier en utilisant http:cjoint.com.
Tu va sur ce site créer un lien vers ton fichier, copie ce lien et viens le coller ici dans une réponse.
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Erreur dans mon copié-collé...
Pas ta faute, la mienne!
remplace :
Do While Not JoursOuvres(madate)
par
Do While Not JoursOuvres(datDate)
Messages postés
332
Date d'inscription
dimanche 21 octobre 2007
Statut
Membre
Dernière intervention
3 septembre 2019
6
C'est nikel.

Je peux mettre résolu au message maintenant.

Un grand merci à toi pour ce travail. Je suis vraiment content que cela fonctionne.
Merci beaucoup Franck, un très bon après-midi et ainsi qu'un bon week-end à toi.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 472
Mais de rien.
Un très bon week end à toi également.
Messages postés
1
Date d'inscription
jeudi 30 avril 2015
Statut
Membre
Dernière intervention
30 avril 2015

Bonjour,
J ai exactement la même application que Izen pour mon travail.
Je me suis permis de récupérer ta macros mais je n'arrive pas a l'executer. Soit j'ai une fenêtre qui me demande le nom de la macros, soit (quand je met dans un UserForm la fenêtre UserForm s'ouvre sous Excel mais grise et sans aucune donnée.
C'est bon =) !
Messages postés
1
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
9 juillet 2015

Bonjour,

Merci pour ce code dont je me sers également. Cependant, je me demandais s'il serait possible de l'améliorer.

Actuellement, lorsqu'un RDV est généré, et que la date est modifiée, un second RDV est généré avec les mêmes attributs que le premier, sans pour autant que le premier soit supprimé.
Serait-il donc possible de faire en sorte soit que le premier RDV soit modifié des nouveaux attributs (notamment de la date), soit que le premier RDV soit supprimé pour laisser place au second RDV ?

Merci d'avance pour votre aide :)