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

VBA Access Discussion :

alimenter les destinataires et copies d'un mail VBA sur requetes [AC-2016]


Sujet :

VBA Access

  1. #1
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut alimenter les destinataires et copies d'un mail VBA sur requetes
    Bonjour à Tous,

    Je rencontre des soucis sur le code ci-dessous.
    Je n'ai qu'un destinataire dans le mail généré alors que je sais qu'il y en a plusieurs dans le résultat de la requête et je n'ai rien en copie alors qu'il y en a aussi
    je ne sais pas si mes boucles sont mal syntaxées.

    Et j'ai un autre souci sur la ligne 103, la date de la variable Vdate_fin ne s'affiche pas et je ne comprend pas pourquoi.

    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
    Private Sub but_mail_Click() 'envoi du mail du lundi
     
    'déclaration des variable
        Dim qry As DAO.QueryDef
        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        Dim rst1 As DAO.Recordset
        Dim sSQL As String
        Dim sSQL1 As String
        Dim j As Variant
        Dim j1 As Variant
        Dim destinataires As String
        Dim copies As String
        Dim Vdate_debut As Variant
        Dim Vdate_date_fin As Variant
     
        Vdate_debut = txt_date_debut.Value
        Vdate_date_fin = txt_date_fin.Value
        Vnom_immo = txt_nom_immo.Value
        Vprenom_immo = txt_prenom_immo.Value
        Vmail_immo = txt_mail_immo.Value
        Vn1_immo = txt_num1_immo.Value
        Vn2_immo = txt_num2_immo.Value
        Vn3_immo = txt_num3_immo.Value
        Vnom_BCM = txt_nom_BCM.Value
        Vprenom_BCM = txt_prenom_BCM.Value
        Vmail_BCM = txt_mail_BCM.Value
        Vn1_BCM = txt_num1_BCM.Value
        Vn2_BCM = txt_num2_BCM.Value
        Vn3_BCM = txt_num3_BCM.Value
        Vcomment = txt_commentaire.Value
     
    'requete de selection des destinataires
     
    sSQL = "SELECT T_adresse_mail.mail" & _
            " FROM T_adresse_mail" & _
            " WHERE (T_adresse_mail.type_envoi = 'dest') AND T_adresse_mail.type_liste Like '*Plhebdo*';"
     
     
    'requete de selection des copies
     
    sSQL1 = "SELECT T_adresse_mail.mail" & _
            " FROM T_adresse_mail" & _
            " WHERE (T_adresse_mail.type_envoi = 'copie') AND T_adresse_mail.type_liste Like '*Plhebdo*';"
     
     
     
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(sSQL, dbOpenSnapshot)
    Set rst1 = dbs.OpenRecordset(sSQL1, dbOpenSnapshot)
     
                'boucle venant alimenter la variable destinataires du résultat de la requete rst
                For j = 0 To rst.Fields.Count - 1
                Next j
     
                Do Until rst.EOF
                For j = 0 To rst.Fields.Count - 1
                destinataires = rst.Fields(j).Value
                Next j
                rst.MoveNext
                Loop
     
                'boucle venant alimenter la variable copies du résultat de la requete rst
                For j1 = 0 To rst1.Fields.Count - 1
                Next j1
     
                Do Until rst.EOF
                For j1 = 0 To rst1.Fields.Count - 1
                destinataires = rst1.Fields(j).Value
                Next j1
                rst1.MoveNext
                Loop
     
    'Création du mail
     
    Dim OutApp As Outlook.Application
    Dim objOutlookMsg As Outlook.MailItem
    Dim objOutlookRecip As Recipient
    Dim Recipients As Recipients
     
     
    Set OutApp = CreateObject("Outlook.Application")
    Set objOutlookMsg = OutApp.CreateItem(olMailItem)
     
    'destinataire
    Set Recipients = objOutlookMsg.Recipients
    Set objOutlookRecip = Recipients.Add(destinataires) 'mails des destinataires
    'Set objOutlookRecip = rst.Fields(0) 'mails des destinataires 'ne fonctionne pas
     
    'copie
        objOutlookMsg.CC = (copies) 'mails des copies
        'objOutlookMsg.CC = rst1.Fields(0) 'mails des copies
     
    objOutlookRecip.Type = 1
     
    'expéditeur
    objOutlookMsg.SentOnBehalfOfName = "locaux-par-astreinte-gbis.acces@sgcib.com"  ' insertion de l'adresse expéditrice
     
    'niveau d'importance
    objOutlookMsg.Importance = olImportanceHigh
     
    'objet du mail
    objOutlookMsg.Subject = " Planning d'astreinte de la semaine du : " & Vdate_debut & " au " & Vdate_fin  ' objet avec intégration des éléments"
     
    'création du corps de texte
    ....... suite du code en cours
    Je vous remercie pour votre aide et vous souhaite une Belle journée 🥵🌞

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For j = 0 To rst.Fields.Count - 1
        destinataires = rst.Fields(j).Value
    Next j
    A chaque tour de boucle, tu écrases la valeur précédente, donc au final, il n'y en a qu'une (la dernière).
    Fait des concaténations.

    De plus, sauf erreur de ma part, les destinataires doivent être séparés par un point virgule.

    Enfin, je ne suis pas sûr de voir l'intéret de boucler sur les colonnes retournées par les requêtes (il n'y en a qu'une seule).

  3. #3
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    merci deedolith,

    J'ai du mal avec le SQL et pas que car je me lance dans des projets complexes avec des connaissances très limités.
    Mais c'est dans la difficulté de l'on grandit

    J'avais déjà tenté avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objOutlookRecip = rst.Fields(0) 'mails des destinataires
    Mais je n'avais qu'un seul nom
    oui pour le ; mais si les adresse sont l'une en dessous de l'autre dans la variable, Outlook les acceptes.
    Par contre si les adresses sont à la filée le ; est indispensable

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    Garde en tête qu'un recordset représente un ensemble de plusieurs enregistrements,
    et chaque enregistrement représente une ligne renvoyée par la requête.
    C'est sur les enregistrements qu'il te faut boucler.

    Tu peux également accéder de plusieurs façons aux champs d'un recordset (chaque champ représente une colonne de l'enregistrement courrant):
    Soit par leur index,
    Soit par leur nom (les même que tu indique dans la requête).
    Par Exemple:
    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
    Dim Db As DAO.Database
    Set Db = CurrentDb
     
    Dim SQL As String
    SQL = "SELECT T_adresse_mail.mail" & _
            " FROM T_adresse_mail" & _
            " WHERE (T_adresse_mail.type_envoi = 'dest') AND T_adresse_mail.type_liste Like '*Plhebdo*';"
     
    Dim Rs As DAO.Recordset
    Set Rs = Db.OpenRecordset(SQL)
     
        '// Boucle sur les enregistrements
    While Not Rs.Eof
        Debug.Print Rs(0).Value    '// Accès au champ par son index
        Debug.Print Rs("mail").Value    '// Accès au champ par son nom
        Rs.MoveNext
    Wend
    oui pour le ; mais si les adresse sont l'une en dessous de l'autre dans la variable, Outlook les acceptes.
    Que les adresses soient l'une au dessus de l'autre ou séparées par des point virgule, dans les 2 cas il faut concaténer.
    Avec un retour à la ligne comme séparateur dans le 1er cas (VbCrLf),
    avec un point virgule dans le second cas.

    PS: Abandonne la notation hongroise, ca nuit à la lisibilité et n'apporte rien de bon.

  5. #5
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    merci deedolith,
    Je regarderai cela demain, plus de temps cet aprèm.
    question bête, qu'est ce que "la notation hongroise" ?
    Bel après midi

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    https://fr.wikipedia.org/wiki/Notation_hongroise

    Cette convention était défendable à l'époque où l'on codait avec un éditeur de texte bête et méchant (genre: Notepad).
    De nos jours, avec des IDE puissant, elle n'a plus de raison d'être.

  7. #7
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    Bonjour à Tous,

    merci deedolith, je ne suis pas développeur et me considère toujours comme débutant car ne pratique pas assez meme si j'ai réussi à créer 2 outils en grande partie grace au forum et les compétences de chacun d'entre vous.
    Le nommage et les commentaires me permettent de m'y retrouver, de comprendre si je dois y revenir dessus et surtout pour les personnes qui prendrons ma place par la suite.
    Je sais que c'est lourd mais je préfère ainsi.
    Je n'ai pas encore eu le temps de tester votre code mais cela va venir.

    Avec mes remerciements et une Belle journée à Tous 🌞

  8. #8
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    Je suis désolé mais malheureusement, je n'arrive pas à trouver comment récupérer les données pour les intégrer à mes destinataires

    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
    Dim Db As DAO.Database
    Set Db = CurrentDb
     
    Dim SQL As String
    SQL = "SELECT T_adresse_mail.mail" & _
            " FROM T_adresse_mail" & _
            " WHERE (T_adresse_mail.type_envoi = 'dest') AND T_adresse_mail.type_liste Like '*Plhebdo*';"
     
    Dim Rs As DAO.Recordset
    Set Rs = Db.OpenRecordset(SQL)
     
        '// Boucle sur les enregistrements
    While Not Rs.Eof
        Debug.Print Rs(0).Value    '// Accès au champ par son index
        Debug.Print Rs("mail").Value    '// Accès au champ par son nom
        Rs.MoveNext
    Wend
    J'avais créé la variable "destinataires" mais je ne sais pas comment l'alimenter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'destinataire
    Set Recipients = objOutlookMsg.Recipients
    Set objOutlookRecip = Recipients.Add(destinataires) 'mails des destinataires

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    Par concaténation.
    Exemple avec une collection (le principe est le même)
    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
    Dim Valeurs As Collection
    Set Valeurs = New Collection
    Valeurs.Add "Pierrot"
    Valeurs.Add "Vincent"
    Valeurs.Add "Babptiste"
    Valeurs.Add "Raphaël"
     
    Dim Destinataires As String:
    Dim Item As Variant
     
    '// Ce que tu fais:
    For Each Item In Valeurs
        Destinataires = Item        '// Ko, l'ancienne valeur est écrasée à chaque tour de boucle
    Next
     
    '// Ce qu'il faut faire:
    For Each Item In Valeurs
        Destinataires = Destinataires & Item        '// Ok, on concatène l'ancienne valeur avec la nouvelle
    Next

  10. #10
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    merci deedolith, je vais essayer

  11. #11
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    Bonjour à Tous,

    Je suis désolé mais je n'arrive pas à faire le lien entre les deux codes pour récupérer les données.
    Le fait que je ne baigne pas dans le métier et n'ai pas les connaissances y est surement pour quelque chose
    Dans le premier, je suis censé récupérer les enregistrements de la requête (les @mail)

    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
    Dim Db As DAO.Database
    Set Db = CurrentDb
     
    Dim SQL As String
    SQL = "SELECT T_adresse_mail.mail" & _
            " FROM T_adresse_mail" & _
            " WHERE (T_adresse_mail.type_envoi = 'dest') AND T_adresse_mail.type_liste Like '*Plhebdo*';"
     
    Dim Rs As DAO.Recordset
    Set Rs = Db.OpenRecordset(SQL)
     
        '// Boucle sur les enregistrements
    While Not Rs.Eof
        Debug.Print Rs("mail").Value    '// Accès au champ par son nom
        Rs.MoveNext
    Wend
    Dans le second, je doit concaténer les enregistrements afin de les stocker dans la variable "destinataire"

    meme si je sais que item in valeurs doivent etre remplacés, je ne sais pas comment faire .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    '// Ce qu'il faut faire:
    For Each Item In Valeurs
        Destinataires = Destinataires & Item        '// Ok, on concatène l'ancienne valeur avec la nouvelle
    Next
    Merci pour votre aide et Belle journée

  12. #12
    Invité
    Invité(e)
    Par défaut
    Placer la boucle apres la création de l'application Outlook pour charger les mails
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Set OutApp = CreateObject("Outlook.Application")
    Set objOutlookMsg = OutApp.CreateItem(olMailItem)
     
    'destinataire
    Set Recipients = objOutlookMsg.Recipients
     
    While Not Rs.Eof
        Recipients.Add  Rs("mail").Value   
        Rs.MoveNext
    Wend

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    @Volid:
    Ca fonctionne aussi.

    @mgascult:
    Ce que je me suis employé à te faire deviner est un changement mineur dans ton code d'origine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do Until rst.EOF
        destinataires = destinataire & rst.Fields("mail").Value    '// Concaténation de chaînes avec l'opérateur & !!!!!!
        rst.MoveNext
    Loop
    Avec plus de 470 messages au compteur, il est plus que temps d'acquérir ne serait-ce que les bases en VBA.
    On t'excusera tes lacunes (même moi, je pose des questions),
    par contre, attendre qu'une solution toute cuite te tombe entre les mains, le refus d'effectuer la moindre recherche quand la plus grand bibliothèque que le monde aie inventé est à portée de main (internet), ca ne passe pas.

    En moins de 4 heures tu peux acquérir les bases:
    - Les opérateurs (+, -, *, /, &, And, Or, Not)
    - Les variables et leurs types.
    - Les instructions décisionnelles (If, Switch)
    - Les boucles (For Next, For Each, Do While, While Do)
    - Les procédures et ls fonctions (Sub, Function).

  14. #14
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    merci pour la leçon, j'ai compris.

    Je n'attends pas forcément que l'on me donne du tout cuit.
    Et je ne vais pas non plus chercher à justifier mon comportement et ses causes.

    Merci quand même à tous pour votre aide précieuse.
    Belle fin de journée

  15. #15
    Membre régulier Avatar de mgascult
    Homme Profil pro
    Logistique Immobilière
    Inscrit en
    Août 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Logistique Immobilière
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 485
    Points : 124
    Points
    124
    Par défaut
    Bonjour à Tous,

    pour conclure sur une note positive.

    https://www.developpez.net/forums/d2.../#post12036286

    Je vous souhaite une Belle journée 🌞

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

Discussions similaires

  1. Cocher des destinataires avant d'envoyer un mail VBA EXCEL
    Par Baptistedu22 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/05/2018, 15h30
  2. [XL-2003] Envoi mail destinataire en copie et corps de message
    Par titoffe60 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/04/2014, 21h14
  3. Réponses: 1
    Dernier message: 16/12/2010, 11h39
  4. Faire une copie automatique des mails envoyés sur un autre PC
    Par shubakas dans le forum Outlook Express / Windows Mail
    Réponses: 0
    Dernier message: 22/06/2009, 18h21
  5. mailing automatique destinataire en copie
    Par calimero91 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/06/2006, 10h18

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