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 :

Envoi Mail en fonction de choix liste déroulante


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Developpeur R-Shiny
    Inscrit en
    Février 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Developpeur R-Shiny

    Informations forums :
    Inscription : Février 2019
    Messages : 23
    Points : 32
    Points
    32
    Par défaut Envoi Mail en fonction de choix liste déroulante
    Bonjour à tous,
    Je suis relativement novice en Acess/VBA et me voici confronté à un problème.

    Contexte simple : j'ai à disposition une table Villes, une table Département et une table Contacts.

    J'ai créé mes relations qui fonctionnent bien, ai créé un formulaire qui demande la sélection du département dans un premier temps, puis de la ville (en fonction du département) dans un second temps, ça marche (ajout évenement sur changement : actualiser enregistrement, dans les propriétés).

    Mon but désormais est de récupérer les mails en fonction des critères prédéfinis par les listes déroulantes ci-dessus.
    J'ai donc créé une nouvelle liste, dans mon formulaire, avec comme contenu une requête de ce type, qui marche, puisque je récupère bien les bons mails :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Contacts.Courriel
    FROM (Departement INNER JOIN Villes ON Departement.NumDepartement = Villes.NumDepartement) INNER JOIN Contacts ON Villes.NomVille = Contacts.Ville
    WHERE (((Villes.NomVille)=[Formulaires]![Formulaire_Sortie]![Ville]) AND ((Departement.NumDepartement)=[Formulaires]![Formulaire_Sortie]![Departement]));
    Mon problème est le suivant :
    J'aimerai ajouter un bouton d'envoi mail, qui sélectionne la liste des destinataires en fonction des critères choisis (soit directement via la zone liste definie précédemment, soit par une requête créée à part).

    J'ai donc créé une requête Requête_Mail qui reprends le code ci dessus, l'ai éxécuté, fonctionne.

    En revanche, quand je fais appel à cette requête dans mon bouton de commande, dans le code VBA suivant, je me retrouve confronté faca à une erreur :

    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
     
    Option Compare Database
     
    Private Sub Commande7_Click()
    Dim oOutlook As Outlook.Application
    Dim oEmailItem As MailItem
    Dim rs As Recordset
    Dim recipientList As String
     
    If oOutlook Is Nothing Then
        Set oOutlook = New Outlook.Application
    End If
    Set oEmailItem = oOutlook.CreateItem(olMailItem)
    With oEmailItem
            Set rs = CurrentDb.OpenRecordset("SELECT Courriel FROM Requête_Mail")
            If rs.RecordCount > 0 Then
            rs.MoveFirst
            Do Until rs.EOF
                If IsNull(rs!Courriel) Then
                    rs.MoveNext
                Else
                    recipientList = recipientList & rs!Courriel & ";"
                    .To = recipientList
                    rs.MoveNext
                End If
            Loop
            Else
            MsgBox "Personne n'a d'adresse mail"
            End If
            Set rs = Nothing
     
          .CC = ""
          .Subject = "Test"
          .Display
    End With
     
    Set oEmailItem = Nothing
    Set oOutlook = Nothing
     
     
    End Sub
    Le problème vient évidemment de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = CurrentDb.OpenRecordset("SELECT Courriel FROM Requête_Mail")
    Je suppose que Requête_Mail ne renvoit rien car dépends de la sélection des zones déroulantes du formulaire.

    Dans le doute, j'ai bêtement testé dans le code VBA du bouton, même erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Contacts.Courriel
    FROM (Departement INNER JOIN Villes ON Departement.NumDepartement = Villes.NumDepartement) INNER JOIN Contacts ON Villes.NomVille = Contacts.Ville
    WHERE (((Villes.NomVille)=[Formulaires]![Formulaire_Sortie]![Ville]) AND ((Departement.NumDepartement)=[Formulaires]![Formulaire_Sortie]![Departement]))
    Pour être sur que ce code/bouton fonctionne correctement, j'ai remplacé par une requête plus basique, sans critère de sélection, et c'est OK.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = CurrentDb.OpenRecordset("SELECT Courriel FROM Contacts")
    Peut être y a t'il possibilité de directement récupérer les adresses mails de la zone de liste au lieu de passer par une requête créée en dehors du formulaire ?
    De type Me.ListBox (désolé je suis novice et ne connait pas les bons attributs).

    D'avance merci,
    Antoine

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    inutile de passer par une requête, autant utiliser le jeu d'enregistrements du formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = Me.RecordsetClone
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Developpeur R-Shiny
    Inscrit en
    Février 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Developpeur R-Shiny

    Informations forums :
    Inscription : Février 2019
    Messages : 23
    Points : 32
    Points
    32
    Par défaut
    Merci pour la rapide réponse.

    Je dois probablement mal utiliser cette solution car ça me renvoie l'ensemble des mails sans prendre en compte les filtres des listes déroulantes.

    N'est-il pas possible de prendre les valeurs remplies dans les listes déroulantes "Ville" et "Departement" dans les critères de la requête, cad Me.Ville.Value et Me.Departement.Value dans la clause where?

    Comme ce genre (message d'erreur : trop peu de paramètres) :

    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
    Private Sub Commande7_Click()
    Dim oOutlook As Outlook.Application
    Dim oEmailItem As MailItem
    Dim rs As Recordset
    Dim recipientList As String
    
    If oOutlook Is Nothing Then
        Set oOutlook = New Outlook.Application
    End If
    Set oEmailItem = oOutlook.CreateItem(olMailItem)
    With oEmailItem
             Set rs = CurrentDb.OpenRecordset("SELECT Contacts.Courriel FROM (Departement INNER JOIN Villes ON Departement.NumDepartement = Villes.NumDepartement) INNER JOIN Contacts ON Villes.NomVille = Contacts.Ville WHERE ((Villes.NomVille)=Me.Ville.Value) AND ((Departement.NumDepartement)=Me.Departement.Value)")
            If rs.RecordCount > 0 Then
            rs.MoveFirst
            Do Until rs.EOF
                If IsNull(rs!Courriel) Then
                    rs.MoveNext
                Else
                    recipientList = recipientList & rs!Courriel & ";"
                    .To = recipientList
                    rs.MoveNext
                End If
            Loop
            Else
            MsgBox "No one has email adress"
            End If
            Set rs = Nothing
          
          .CC = ""
          .Subject = "test"
          .Display
    End With
    
    Set oEmailItem = Nothing
    Set oOutlook = Nothing
    
    
    End Sub

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Ok,
    mais pour cette solution il faut mettre les champs du formulaire en dehors des guillemets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = CurrentDb.OpenRecordset("SELECT Contacts.Courriel FROM (Departement INNER JOIN Villes ON Departement.NumDepartement = Villes.NumDepartement) INNER JOIN Contacts ON Villes.NomVille = Contacts.Ville WHERE ((Villes.NomVille)= '" & Me.Ville & "') AND ((Departement.NumDepartement)=" & Me.Departement & ")")
    j'ai ajouté des apostrophes autour de Ville car, à priori, c'est du texte
    .Value est inutile car c'est la propriété par défaut d'un contrôle de formulaire
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. [XL-2010] Activer certaines feuilles excel en fonction choix liste déroulante
    Par wonderfulife37 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/08/2016, 16h26
  2. Réponses: 1
    Dernier message: 27/05/2013, 10h27
  3. [MySQL] fonction include selon choix liste déroulante
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/12/2007, 16h34
  4. [Fonction]tri sur liste déroulante
    Par maxeur dans le forum IHM
    Réponses: 8
    Dernier message: 16/04/2007, 10h00
  5. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54

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