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 :

[Article] Envoyer des documents individuels depuis Access


Sujet :

Access

  1. #1
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 434
    Points : 20 022
    Points
    20 022
    Billets dans le blog
    67
    Par défaut [Article] Envoyer des documents individuels depuis Access
    Bonjour à tous,

    Je vous présente un nouvel article concernant la génération et l'envoi par e-mails de documents individuels en utilisant Outlook :


    Objectif : mettre en place un système permettant de générer et d'envoyer des documents individuels par e-mails depuis Access.
    J'ai pris comme exemple l'envoi de documents pour des réabonnements dans une maison de la presse.

    Chaque fichier pdf est généré dans un dossier, pour ensuite être transmis à son destinataire.

    Bonne lecture,
    Cordialement,

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 888
    Points : 15 032
    Points
    15 032
    Par défaut
    bonsoir User,
    bonne initiative ... et

  3. #3
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 434
    Points : 20 022
    Points
    20 022
    Billets dans le blog
    67
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonsoir User,
    bonne initiative ... et

  4. #4
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 577
    Points : 2 558
    Points
    2 558
    Par défaut
    Bonjour User,

    sujet récurent que de pouvoir envoyer des mails via Access (ou Excel d'ailleurs)
    Merci et bravo pour le tuto (la mise en pdf et le stockage est un plus)

    Curt

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 434
    Points : 20 022
    Points
    20 022
    Billets dans le blog
    67
    Par défaut
    Citation Envoyé par curt Voir le message
    Bonjour User,

    sujet récurent que de pouvoir envoyer des mails via Access (ou Excel d'ailleurs)
    Merci et bravo pour le tuto (la mise en pdf et le stockage est un plus)

    Curt
    Merci à toi curt

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut à tous,

    J'ai survolé l'article, je n'ai même pas testé le code... mais j'ai des critiques : (j'ai lu succinctement le code quand même )
    - Le module M_Replace ne sert pas. Il serait préférable de ne pas le mettre.
    - nomDossier = CurrentProject.Path :
    il serait préférable :
    nomDossier = environ("temp")
    - il serait préférable d'avoir une variable que de mettre en dur "Réabonnements" (si c'est dans le temp ce n'est plus utile)
    - le pdf généré n'est pas détruit alors qu'il ne sera jamais réutilisé. (le temp ferait dans ce cas encore très bien l'affaire surtout lors d'un arrêt intempestif)
    - il n'y a pas de gestion d'erreur pour EnvoiDocuments dans TestReabonnements alors qu'il est bien traité dans CmdEnvoyerDocuments_Click
    - mais ce que je déplore c'est qu'il n'y pas de gestion sur les erreurs d'envoi. Sans entrer dans quelque chose d'élaboré, je pense qu'à minima il serait bon d'avoir une table ou fichier log.
    ... je regarde pas plus en détail, je voudrai pas te rendre dépressif User

    histoire de pas me faire descendre, un peu de flatterie :
    J'ai apprécié la forme, le codage structuré, clair et bien commenté.

    Au passage Je n'ai pas testé la base, je me suis arrêté avant l'envoi. J'ai eu un doute :
    J'espère que les emails sont factices parce que sinon j'en connais qui vont te maudire.

    Merci pour ta (tes) contribution(s).

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 434
    Points : 20 022
    Points
    20 022
    Billets dans le blog
    67
    Par défaut
    Salut Vodiem,

    Je crois en effet qu'il faudrait que je rajoute une gestion d'erreur, j'essaie toujours de garder juste l'essentiel du code pour que ça soit plus clair pour les débutants, mais ça me semble utile dans ce cas.

    Concernant le module M_Replace, je vais aussi le supprimer.

    Pour l'emploi de CurrentProjet, et l'utilisation du dossier "Réabonnements", je préfère garder un dossier à côté de la base Access, je trouve que c'est plus simple à expliquer et à gérer pour les débutants.

    En tout cas merci pour tes remarques

    Cdlt,

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Octobre 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut test du code
    Bonjour
    Merci pour cet article très intéressant et surtout pour le code bien détaillé
    Je l'ai testé et j'ai un message d'erreur ' La méthode Run de l'objet Inshell3 a echoué'
    Une idée du problème?

    Merci

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 434
    Points : 20 022
    Points
    20 022
    Billets dans le blog
    67
    Par défaut
    Bonjour et merci,

    A première vue, c'est possible qu'il tente d'ouvrir Outlook sans succès.

    Le code est au début de la procédure principale d'envoi :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ' Teste si outlook est ouvert, si pas ouvert le lance :
                If Not IsOutLookRunning() Then
                    Dim oShell As Object
                    Set oShell = CreateObject("WScript.Shell")
                    oShell.Run "outlook"
                    Set oShell = Nothing
                End If

    Il faudrait ôter la gestion d'erreur pour voir la ligne concernée dans EnvoiDocuments.

    Cdlt,

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2021
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Je me permets de vous solliciter.
    J'ai repris votre descriptif et utilisé dans ma base de données.
    Cela fonctionne plutôt bien, mise à part mon filtre qui ne fonctionne pas.

    Il me met "Type de donnée incompatibles dans l'expression du critère".
    Je ne comprends pas, j'ai également mes 2 tables Clients et Planning
    Dans ma table client, un ID Client (Texte) et dans mon Planning (un ID aléatoire, et un champ ID Client (texte également), relié à celui de ma table client. Comme dans votre exemple de table T_abonnement et T_abonné.

    Avez vous une idée ?
    Pour la partie filtre, voici le code noté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "Planning_quotidien", acViewPreview, , "N_Dossier=" & rsReabo!N_Dossier
    Pour info, je débute avec Access!

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 888
    Points : 15 032
    Points
    15 032
    Par défaut
    bonsoir,
    peut-on voir ton code complet ?
    Merci

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2021
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Code
    J'avais repris le modèle, et personnalisé quelques éléments pour que cela fonctionne dans ma base de données.
    Je n'avais pas terminé la personnalisation, je voulais juste être certaine que cela fonctionne.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    Public Function EnvoiDocuments(Optional Automatique As Boolean = False) As Boolean
        'Automatique : argument optionnel indiquant si la fonction s'exécute automatiquement ou pas.
        On Error GoTo err_EnvoiDocuments
        Dim fso As Object ' variable objet FSO
        Dim nomDossier As String ' variable pour le nom du dossier de sauvegarde des documents pdf
        Dim cheminfichier As String ' variable pour le chemin complet du document pdf
        Dim NomAbonne As String ' nom de l'abonné
        Dim db As DAO.Database ' variable objet pour faire référence à la base de données
        Dim rsMsg As DAO.Recordset ' variable objet pour faire référence au recordset lié au message à envoyer
        Dim rsReabo As DAO.Recordset ' variable objet pour faire référence au recordset lié aux réabonnements
        Dim objOutLook As Object ' variable objet pour faire référence à l'application Outlook
     
        Set db = CurrentDb ' référence à la base de données courante
     
        ' on ouvre le recordset basé sur la table T_Message_Reabonnement
        Set rsMsg = db.OpenRecordset("Message_Envoi_Planning", dbOpenSnapshot)
     
        ' on vérifie si l'objet et le corps du message ont été saisis
        If Nz(rsMsg!ObjetMessage, "") = "" Then
            MsgBox ("Saisir un objet pour le message des destinataires !")
            Exit Function
        End If
     
        If Nz(rsMsg!CorpsMessage, "") = "" Then
            MsgBox ("Saisir un message pour les destinataires !")
            Exit Function
        End If
     
        ' on ouvre le recordset contenant la liste des réabonnement en attente n'ayant pas encore fait l'objet d'un envoi
        Set rsReabo = db.OpenRecordset("select * from R_EnvoiPlanning where (EnvoiPlanning2022=False) and nz(Clients_mail,"""")<>"""";", dbOpenDynaset)
     
        If Not rsReabo.EOF Then ' s'il y a des documents à envoyer
     
            If MsgBox("Souhaitez-vous envoyer les documents pour les réabonnements ?", vbYesNo + vbQuestion) = vbYes Then ' si on confirme l'envoi
     
                ' Teste si outlook est ouvert, si pas ouvert le lance :
                If Not IsOutLookRunning() Then
                    Dim oShell As Object
                    Set oShell = CreateObject("WScript.Shell")
                    oShell.Run "outlook"
                    Set oShell = Nothing
                End If
     
                'Assigner l'objet Outlook
                Set objOutLook = CreateObject("Outlook.Application") 'New Outlook.Application
     
                ' création de l'objet FSO
                Set fso = CreateObject("Scripting.FileSystemObject")
     
                ' indique le chemin du dossier de destination pour les fichiers générés, si pas de dossier d'enregistré dans la table T_Dossier_Documents,
                ' alors copie le chemin du dossier situé dans le répertoire de la base de données Access
                nomDossier = Nz(DLookup("CheminDossier", "T_Dossier_Documents"), CurrentProject.Path & "\Planning") ' indiquez ici le chemin de votre dossier de destination pour les fichiers pdf
     
                If Dir(nomDossier, vbDirectory) = "" Then  '
                    fso.CreateFolder nomDossier
                End If
     
                Do Until rsReabo.EOF  ' on parcourt la liste des abonnements à renouveler
     
                    NomAbonne = rsReabo!N_Dossier ' on copie le nom complet de l'abonné dans la variable
     
                    ' on copie le chemin complet dans la variable
                    cheminfichier = nomDossier & "\Planning 2022- " & NomAbonne & ".pdf"
     
                    ' ouverture de l'état filtré avec l'identifiant de l'abonné
                    DoCmd.OpenReport "Planning_quotidien", acViewPreview, , "N_Dossier= " & rsReabo!N_Dossier
     
                    ' génération du document pdf à partir de l'état filtré avec l'identifiant de l'abonné
                    DoCmd.OutputTo acOutputReport, "Planning_quotidien", "PDF", cheminfichier
     
                    ' fermeture de l'état
                    DoCmd.Close acReport, "Planning_quotidien"
     
                    ' envoi du message au destinataire
                    If EnvoiEmail(cheminfichier, rsReabo!Clients_mail, rsMsg!ObjetMessage, rsMsg!CorpsMessage, objOutLook) Then ' si l'envoi du mail s'est bien passé
                        rsReabo.Edit
                        rsReabo!DateEnvoiPlanning2022 = Date ' on met à jour le champ DateEnvoiReabo pour indiquer que l'envoi a bien été effectué
                        rsReabo.Update
                    End If
     
                    ' on passe à l'enregistrement suivant
                    rsReabo.MoveNext
     
                Loop
     
                EnvoiDocuments = True ' on indique que les documents ont été envoyés
                MsgBox "Documents envoyés !", vbExclamation ' on affiche un message pour indiquer que les documents ont bien été envoyés
     
            End If
     
        Else ' sinon, si pas de document à envoyer
     
            If Not Automatique Then ' si la fonction ne s'exécute pas à l'ouverture de la base
                MsgBox "Pas de document à envoyer pour les réabonnements !", vbExclamation ' on affiche un message pour indiquer qu'il n'y a pas d'abonnement à renouveler
            End If
     
            EnvoiDocuments = False ' la fonction renvoie False
     
        End If
     
    err_EnvoiDocuments:
     
        ' gestion d'erreur
        If Err.Number <> 0 And Not EnvoiDocuments Then ' si une erreur s'est produite et que les documents n'ont pas été envoyés
            MsgBox Err.Description, vbExclamation ' on affiche le message d'erreur
            MsgBox "Erreur au cours de l'envoi !", vbExclamation
            EnvoiDocuments = False
        End If
     
        ' libère les variables objet
        Set fso = Nothing
     
        If Not (rsMsg Is Nothing) Then
            rsMsg.Close
        End If
     
        If Not (rsReabo Is Nothing) Then
            rsReabo.Close
        End If
     
        Set rsMsg = Nothing
        Set rsReabo = Nothing
     
        Set db = Nothing
        Set objOutLook = Nothing
     
    End Function

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 888
    Points : 15 032
    Points
    15 032
    Par défaut
    je ne vois pas le type de données pour N_Dossier, mais par rapport au message d'erreur, si c'est du texte il faut ajouter des apostrophes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "Planning_quotidien", acViewPreview, , "N_Dossier='" & rsReabo!N_Dossier & "'"

Discussions similaires

  1. [AC-2013] Envoyer des données à Excel depuis Access
    Par abel.ludba dans le forum VBA Access
    Réponses: 8
    Dernier message: 25/01/2016, 11h37
  2. Réponses: 1
    Dernier message: 15/07/2008, 11h37

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