Envoyer des mails à partir du résultat d'une requête.

Anonyme
2020-05-03T14:14:40+00:00

bonjour tout le monde,

je débute sous access.

j'ai créé une table stagiaire, une table formation.

à partir d'un formulaire et d'une requête regroupant les 2 je crée un état "convocation", je suis capable avec un bouton de faire partir par mail cet étatl, mais seulement à la première personne de mon résultat. je traine sur le net mais ne trouve pas de solution pour envoyer à chaque personne sa propre convocation.

si vous avez des pistes de recherche, je suis preneur, avec les codes vba, je tourne en rond et avec les macros intégrés, j'ai l'impression d'être limité.

je suis sous office 365.

merci à vous et belle journée "confinée".

Jérôme.

Microsoft 365 et Office | Access | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

8 réponses

  1. Anonyme
    2020-05-05T17:19:38+00:00

    C'est par ce que ta requête a des parametres, donc il te faut les évaluer pour fonctionner.

    Consulte https://www.devhut.net/2011/11/07/ms-access-vba-run-parameter-query-in-vba/ pour en savoir plus.

    Ceci dit, tu peux soit modifier la requête en te servant de Eval() ou le code VBA.

    Donc, si on reste avec le code VBA, tu devrais être en mesure de faire quelque chose du genre

    Private Sub CmdEnvoiConvocation_Click()

        Dim db                    As DAO.Database

        Dim qdf                   As DAO.QueryDef

        Dim prm                   As DAO.Parameter

        Dim rs                    As DAO.Recordset

        On Error GoTo Error_Handler

        Set db = CurrentDb

        Set qdf = db.QueryDefs("convocationvmai")

        For Each prm In qdf.Parameters

            prm = Eval(prm.Name)

        Next prm

        Set rs = qdf.OpenRecordset

        With rs

            If .RecordCount <> 0 Then

                Do While Not .EOF

                    DoCmd.SendObject acSendReport, "Convocation", acFormatPDF, ![email], , , "Convocation", _

                                     "Bonjour," & vbCrLf & vbCrLf & "Suite à votre inscription, veuillez trouver en pièce jointe votre convocation."

                    .MoveNext

                Loop

            End If

        End With

    Error_Handler_Exit:

        On Error Resume Next

        If Not rs Is Nothing Then

            rs.Close

            Set rs = Nothing

        End If

        If Not prm Is Nothing Then Set prm = Nothing

        If Not qdf Is Nothing Then Set qdf = Nothing

        If Not db Is Nothing Then Set db = Nothing

        Exit Sub

    Error_Handler:

        If Err.Number <> 2501 Then

            MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _

                   "Error Number: " & Err.Number & vbCrLf & _

                   "Error Source: CmdEnvoiConvocation_Click" & vbCrLf & _

                   "Error Description: " & Err.Description & _

                   Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl), _

                   vbOKOnly + vbCritical, "An Error has Occurred!"

        End If

        Resume Error_Handler_Exit

    End Sub

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  2. Anonyme
    2020-05-05T13:06:01+00:00

    Merci, je prends note de vos instructions.

    j'ai renommé mes boutons et ma requête.

    en lançant votre code, j'obtiens comme erreur : 

    • erreur nombre: 3061
    • erreur source : CmdEnvoiConvocation_Clik
    • erreur Description : Trop peu de paramètres. 1 attendu.

    je met ici ma requête au cas ou: 

    et le code repris :

    Private Sub CmdEnvoiConvocation_Click()

        Dim db                    As DAO.Database

        Dim rs                    As DAO.Recordset

        On Error GoTo Error_Handler

        Set db = CurrentDb

        Set rs = db.OpenRecordset("convocationvmai", dbOpenSnapshot)

        With rs

            If .RecordCount <> 0 Then

                Do While Not .EOF

                    DoCmd.SendObject acSendReport, "Convocation", acFormatPDF, ![EMAIL], , , "Convocation", _

                                     "Bonjour," & vbCrLf & vbCrLf & "Suite à votre inscription, veuillez trouver en pièce jointe votre convocation."

                    .MoveNext

                Loop

            End If

        End With

    Error_Handler_Exit:

        On Error Resume Next

        If Not rs Is Nothing Then

            rs.Close

            Set rs = Nothing

        End If

        If Not db Is Nothing Then Set db = Nothing

        Exit Sub

    Error_Handler:

        If Err.Number <> 2501 Then

            MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _

                   "Error Number: " & Err.Number & vbCrLf & _

                   "Error Source: CmdEnvoiConvocation_Click" & vbCrLf & _

                   "Error Description: " & Err.Description & _

                   Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl), _

                   vbOKOnly + vbCritical, "An Error has Occurred!"

        End If

        Resume Error_Handler_Exit

    End Sub

    merci pour le temps que vous apportez à mon aide.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  3. Anonyme
    2020-05-05T11:18:53+00:00

    La procédure devrait plutot être comme

    Private Sub Commande254_Click()

        Dim db                    As DAO.Database

        Dim rs                    As DAO.Recordset

        On Error GoTo Error_Handler

        Set db = CurrentDb

        Set rs = db.OpenRecordset("convocation_v_03_mai_2020", dbOpenSnapshot)

        With rs

            If .RecordCount <> 0 Then

                Do While Not .EOF

                    DoCmd.SendObject acSendReport, "Convocation", acFormatPDF, ![email], , , "Convocation", _

                                     "Bonjour," & vbCrLf & vbCrLf & "Suite à votre inscription, veuillez trouver en pièce jointe votre convocation."

                    .MoveNext

                Loop

            End If

        End With

    Error_Handler_Exit:

        On Error Resume Next

        If Not rs Is Nothing Then

            rs.Close

            Set rs = Nothing

        End If

        If Not db Is Nothing Then Set db = Nothing

        Exit Sub

    Error_Handler:

        If Err.Number <> 2501 Then

            MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _

                   "Error Number: " & Err.Number & vbCrLf & _

                   "Error Source: Commande254_Click" & vbCrLf & _

                   "Error Description: " & Err.Description & _

                   Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl), _

                   vbOKOnly + vbCritical, "An Error has Occurred!"

        End If

        Resume Error_Handler_Exit

    End Sub

    Aussi, tu dois donner des noms a tes contrôles et non utiliser les noms attribués par Access.  Commande254 ne veut rien dire, mais un nom comme cmd_EnvoieConvocation, ça sa m'aide à rapidement me retrouver dans le code.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  4. Anonyme
    2020-05-05T10:03:52+00:00

    Bonjour Mr PINEAULT,

    merci de l'intérêt porté à ma question.

    je teste votre code depuis ce matin, mais étant débutant en la matière, je rencontre quelques difficultés.

    une erreur redondante intervient, soit erreur de syntaxe, soit erreur de compilation.

    je tourne en rond sur les explications fournit par microsoft dans l'aide.

    voici le code mis en place :

    Private Sub Commande254_Click()

    Dim db As DAO.Database

    Dim rs As DAO.Recordset

    Set db = CurrentDb

    Set rs = db.OpenRecordset(convocation_v_03_mai_2020, dbOpenSnapshot)

    With rs

    If .RecordCount <> 0 Then

    Do While Not .EOF

    DoCmd.SendObject(acSendReport, "convocation", acFormatPDF, [EMAIL],,, "Convocation", "bonjour suite à votre inscription veuillez trouver en pièce jointe votre convocation", True,,"")

    .MoveNext

    Loop

    End If

    End With

    rs.Close

    Set rs = Nothing

    Set db = Nothing

    End Sub

    une nouvelle aide de votre part ne serait pas de refus, merci.

    Jérôme.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  5. Anonyme
    2020-05-05T01:14:52+00:00

    Tu peux te créer une procédure qui itère sir les résultats de ta requête

    Quelque chose du genre (de mémoire, donc a valider)

    Dim db as DAO.Database

    Dim rs as DAO.Recordset

    Set db = Currentdb

    Set rs = db.OpenRecordset("NomDeTaRequête", dbOpenSnapshot)

    With rs

       If .RecordCount <> 0 Then

          Do While Not .EOF

             DoCmd.SendObject acSendNoObject, , , ![NomDuChampCourriel], , , "Sujet", "Message"

             .MoveNext

          Loop

       End If

    End With

    rs.close

    Set rs = Nothing

    Set db = Nothing

    Oublie les macros intégrés, ils te causeront simplement des problèmes!  Code absolument tout en VBA!!!!

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire