IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Envoyer des mails avec des infos contenues dans une table : ça sent le problème de boucle [AC-2003]


Sujet :

Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2015
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Envoyer des mails avec des infos contenues dans une table : ça sent le problème de boucle
    Bonjour,

    Je cherche à envoyer des mails de rappels aux managers de gens n'ayant pas effectué certaines formations obligatoires.

    Mes infos sont contenues dans une table, et j'ai réussi à faire envoyer automatiquement un mail par employé et par manager en VBA par Access, pour tous les employés n'ayant pas effectué leur formation.
    Mon problème, c'est que certains managers ont plusieurs employés n'ayant pas effectué les formations, ils reçoivent donc 10 mails !

    Je cherche donc à envoyer un seul mail par manager, en disant "Les employés X, Y et Z n'ont pas effectué leur formation" (X, Y et Z étant contenus dans une table).

    De plus, quand je génère mes mails, le premier mail a une pièce jointe, le deuxième mail 2 pièces jointes etc... le 20ème mail 20 pièces jointes !!!

    Voilà mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Private Sub AML_Mail_Button_Click()
      Dim rst As DAO.Recordset
      Dim strSQL As String
      Dim strMessageType As String
      Dim strTitre As String
      Dim strMsg As String
      Dim c As New Collection
      Dim elementChemin As String
      Dim element As String
     
     
      ' Titre du message
      strTitre = "En retard !"
     
      ' Message type à expédier
      ' Les signes {...} seront remplacés plus loin par
      ' les infos de l'employé
      strMessageType = "Cher manager," _
        & vbCrLf & vbCrLf _
        & "Nous avons remarqué que {Worker_Name} - qui vous rapporte, est en retard pour bla bla bla... " & vbCrLf & vbCrLf _
        & vbCrLf & "Merci de votre collaboration"
     
     
      ' Ouverture de la requête
      ' (seuls les employés n'ayant pas de completion status sont concernés ici)
      strSQL = "SELECT * FROM [QRY_AML_Contractors_ToEmail]" _
        & " WHERE [Completion_Status] IS NULL"
      Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
     
      ' Parcourir la liste des contractors
      While Not rst.EOF
        ' Construire un message personnalisé
        ' (on remplace chaque {...} du message par les champs
        ' équivalents de la requête
        strMsg = Replace(strMessageType, "{Worker_Name}", rst("Contract_Worker_Name"))
     
       'On joint le job-aid
       element = "S:\CG"
     
        ' Expédier le mail
        SendMail "adressemailxxx", rst("Email"), strTitre, strMsg, "", c
        c.Add element
     
        ' Employé suivant
        rst.MoveNext
      Wend
     
      ' On libère les ressources
      rst.Close
      Set rst = Nothing
     
      ' Un petit message de confirmation
      Msgbox "Opération terminée !", vbInformation, "V"
     
    End Sub
    J'ai également la sous-fonction suivante (pas faite par moi, et que je ne comprends donc pas très bien, peut-être mon problème sur les PJ vient-il de là....)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub SendMail(monFrom As String, SendTo As String, Subject As String, Body As String, Optional SendToCC As String, Optional monFichier As Collection)
    Dim MonMail As Outlook.MailItem
    Dim element As Variant
    Set MonMail = Outlook.Application.CreateItem(olMailItem)
    MonMail.Subject = Subject
    MonMail.BodyFormat = olFormatRichText
    MonMail.Body = Body
    MonMail.To = SendTo
    MonMail.CC = SendToCC
    MonMail.SentOnBehalfOfName = monFrom
    For Each element In monFichier
        MonMail.Attachments.Add element
    Next
    MonMail.HTMLBody = MonMail.HTMLBody & GetBoiler("H:\AppData\Microsoft\Signatures\Signature1.htm")
    MonMail.display
    End Sub
    Pourriez-vous svp m'aider à corriger mes erreurs, qui viennent je pense de ma boucles ??

    Merci,

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonsoir,

    Cela pourrait être effectivement un problème de boucle. Tu mets l'envoi du mail dans la boucle alors que tu n'envoies qu'à 1 manager:
    1. Il faut sortir l'appel de la fonction Sendmail de ta boucle.
    2. Ta boucle devrait te servir uniiquement pour alimenter la collection des pièces jointes.
    On devrait avoir j'imagine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Private Sub AML_Mail_Button_Click()
      Dim rst As DAO.Recordset
      Dim strSQL As String
      Dim strMessageType As String
      Dim strTitre As String
      Dim strMsg As String
      Dim c As New Collection
      Dim elementChemin As String
      Dim element As String
      Dim strContractor as String
     
      ' Titre du message
      strTitre = "En retard !"
     
      ' Message type à expédier
      ' Les signes {...} seront remplacés plus loin par
      ' les infos de l'employé
      strMessageType = "Cher manager," _
        & vbCrLf & vbCrLf _
        & "Nous avons remarqué que {Worker_Name} - qui vous rapporte, est en retard pour bla bla bla... " & vbCrLf & vbCrLf _
        & vbCrLf & "Merci de votre collaboration"
     
      ' Ouverture de la requête
      ' (seuls les employés n'ayant pas de completion status sont concernés ici)
      strSQL = "SELECT * FROM [QRY_AML_Contractors_ToEmail]" _
        & " WHERE [Completion_Status] IS NULL"
      Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
      strContractor =""
      ' Parcourir la liste des contractors
      While Not rst.EOF
        'Construire la suite des noms des contractors défaillants
        strContractor = strContractor & "," &  rst("Contract_Worker_Name")
       'On joint le job-aid
       element = "S:\CG"
        c.Add element
     
        ' Employé suivant
        rst.MoveNext
      Wend
         'On enlève la dernière virgule rajoutée
         strContractor =left(strContractor,len(strContractor)-1)
        ' Construire un message personnalisé
        ' (on remplace chaque {...} du message par la concaténation des noms des contractors
         strMsg = Replace(strMessageType, "{Worker_Name}", strContractor ) 
        ' Expédier le mail
        SendMail "adressemailxxx", rst("Email"), strTitre, strMsg, "", c
      ' On libère les ressources
      rst.Close
      Set rst = Nothing
     
      ' Un petit message de confirmation
      Msgbox "Opération terminée !", vbInformation, "V"
     
    End Sub
    Cordialement,

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2015
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci Madefemere pour cette piste !

    Le problème, c'est que là tu as construit la chaine des contractors comme s'ils étaient tous rattachés à un même manager, mais ce n'est pas le cas.

    Je ne peux pas attacher ma table ici car il y a des noms et des données confidentielles, mais admettons que je donne des lettres à des employés et des numéros ax managers, j'ai une table du style

    A rattaché à 1 : a fait son cours
    B rattaché à 1 : pas fait
    C rattaché à 2 : pas fait
    D rattaché à 1 : pas fait

    Et moi, je voudrais générer un mail : Cher 1, vos employés B et D n'ont pas fait leur cours
    Et un autre mail : Cher 2, votre employé D n'a pas fait son cours

    Pour info, dans le code que tu m'as indiqué, ça bug sur la ligne "Send mail", avec l'erreur "No current record".

    Ca dépasse mes compétences (...

  4. #4
    Membre à l'essai
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2015
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Nouvel update :

    J'ai finalement trouvé une solution qui consiste à créér un module en VBA qui crée une requête qui concatène dans une colonne tous les employés d'un manager n'ayant pas fait leur cours.

    J'ai donc une requête avec
    Manager Email Employés
    1 email B,D
    2 email C

    Et j'ai gardé mon code précédent en bouclant sur tous les managers pour envoyer un mail disant "voilà les personnes concernées" et j'intègre ma liste des employés, donc ça ça marche !

    Mon dernier problème concerne les pièces jointes, si je génère 10 mails, le premier mail a bien une pièce jointe, mais le dernier mail en a 10 !

    J'ai essayé dans mon code ci-dessous d'enlever "c. Add element", mais il n'y a plus de pièce jointe du tout !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Expédier le mail
        SendMail "adressemailxxx", rst("Email"), strTitre, strMsg, "", c
        c.Add element
    C'est peut-être une question bête, mais j'apprends par l'expérience !!

  5. #5
    Membre à l'essai
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2015
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    J'ai l'impression de me parler à moi toute seule mais c'est bon j'ai trouvé, il fallait rajouter
    Set c = nothing pour libérer la collection de pièce jointe avant de recommencer la boucle !

    Bon ben c'est résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classe pour envoyer des mails avec des template
    Par RobertP dans le forum Langage
    Réponses: 1
    Dernier message: 24/12/2011, 10h49
  2. [VB6] Envoyer un mail avec des fichiers.
    Par megamario dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 22/11/2010, 13h15
  3. Réponses: 2
    Dernier message: 11/05/2009, 09h36
  4. Réponses: 0
    Dernier message: 02/01/2009, 15h40
  5. Envoyer un mail avec des photos
    Par maverick91 dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/07/2007, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo