Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 23h38   #1
Invité de passage
 
Inscription : février 2010
Messages : 25
Détails du profil
Informations personnelles :
Localisation : France, Drôme (Rhône Alpes)

Informations forums :
Inscription : février 2010
Messages : 25
Points : 4
Points : 4
Par défaut envoi mail à x destinataires

Bonsoir à tous
j'aimerais savoir s'il était possible d'envoyer à plusieurs destinataires un mail par CDO.
Le code ci dessous est OK
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub SendMailCDO_Click()
 
 'ENVOI MAIL
With CreateObject("CDO.Message")
.From = "Monmail@free.fr"
.To = "************"
.Subject = "Résultats du Match"
.TextBody = "Bonne réception" & vbCrLf & "Salutations Sportives"
.AddAttachment ("C:\Documents and Settings\admin\Mes documents\TEST_BASES\Resultats_ouv.pdf")
'.AddAttachment ("C:\Documents and Settings\admin\Mes documents\TEST_BASES\Equipes_ouv.pdf")
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.free.fr"
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Configuration.Fields.Update
On Error Resume Next
.Send
If Err Then MsgBox "Le message n'a pas été expédié."
On Error GoTo 0
End With
End Sub
sur la ligne TO je voudrais mettre Les valeurs de MAIL de l'etat(Clubs Participants) ou de la requete(R-Club) sépares par des ;.
Est-ce possible ?
Dans l'état et la requete ,j'ai le nom du club et son MAIL.
Contenu de la requete:
Code :
1
2
3
4
5
 
club	   COMPETITION	        DATE COMPET	      MAIL
TOV	   MATCH D'OUVERTURE	   09/10/2011	 xxxx@wanadoo.fr
CTSM    MATCH D'OUVERTURE   09/10/2011	 yyyy@cegetel.net
CTSBLV MATCH D'OUVERTURE	   09/10/2011	 zzzz@free.fr
Etc........
Il ne devrait pas y avoir plus d'une quinzaine d'@
Merci
ctsblv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 00h12   #2
Rédacteur/Modérateur
 
Avatar de Dolphy35
 
Homme Morgan BILLY
Technicien de Production
Inscription : octobre 2004
Messages : 4 103
Détails du profil
Informations personnelles :
Nom : Homme Morgan BILLY
Âge : 33
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Technicien de Production
Secteur : Industrie

Informations forums :
Inscription : octobre 2004
Messages : 4 103
Points : 8 729
Points : 8 729
Salut,

Oui tu peux faire un Recordset DAO sur ta table ou requête et dans la boucle tu charge ta variable:

Code :
1
2
3
4
While Not (rstRecordset.EOF)
        MaVariableTo = MaVariableTo & ";" & rstRecordset.Fields("MonChampTo")
        rstRecordset.MoveLast
Wend
A la sortie tu as ta liste de diffusion dans la variable MaVariableTo
Dolphy
__________________
Personnaliser la vue Backstage d'Access 2010
Découvrez avec nous Office 2010
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 10h00   #3
Invité de passage
 
Inscription : février 2010
Messages : 25
Détails du profil
Informations personnelles :
Localisation : France, Drôme (Rhône Alpes)

Informations forums :
Inscription : février 2010
Messages : 25
Points : 4
Points : 4
Bonjour Dolphy

Merci pour ta réponse.
Comme je suis un bleu en vba,il faut que je regarde la doc pour créer le recordSet sur ma requete (R_Club)
Dois-je l'intégrer dans le module d'envoi du Mail ?
Je vais faire des tests et je te tiens au courant.
Encore merci
ctsblv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 12h03   #4
Rédacteur/Modérateur
 
Avatar de Dolphy35
 
Homme Morgan BILLY
Technicien de Production
Inscription : octobre 2004
Messages : 4 103
Détails du profil
Informations personnelles :
Nom : Homme Morgan BILLY
Âge : 33
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Technicien de Production
Secteur : Industrie

Informations forums :
Inscription : octobre 2004
Messages : 4 103
Points : 8 729
Points : 8 729
Salut,

Perso je ne le mettrais pas dans le sub d'envoi mail.

pour le recordset je te propose ce tuto très bien fait http://warin.developpez.com/access/dao/

jette un oeil et revient nous si tu as des questions

Dolphy
__________________
Personnaliser la vue Backstage d'Access 2010
Découvrez avec nous Office 2010
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 22h59   #5
Invité de passage
 
Inscription : février 2010
Messages : 25
Détails du profil
Informations personnelles :
Localisation : France, Drôme (Rhône Alpes)

Informations forums :
Inscription : février 2010
Messages : 25
Points : 4
Points : 4
Bonsoir
J'ai parcouru plusieurs posts ainsi que la doc Recordset.Je lis bien la requete,je compte le nombre d'enregistrements il me renvoie 3 ,ce qui est OK.
Jusque là tout va bien.par contre la suite est moins encourageante.
J'ai mis la varible MaVariableTO sur la ligne .TO de l'envoi_mail,mais rien ne se passe.Le module tourne et occupe 50% de la cpu.Je suis obligé de planter ACCESS.
J'ai atteint les limites de mes connaissances vba .J'ai beau lire et relire la doc,je sèche lamentablement.
Peux-tu me dire où tu créerais le module "recordset" et ce qui ne va pas dans le code ci-dessous ?
Merci d'avance


Code :
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 ENVMAIL_Click()
 
Dim Db As DAO.Database
    Dim rst As DAO.Recordset
    Dim qry As DAO.QueryDef
    Dim NbEnreg As Integer
 
    'Ouverture de la requête
    Set Db = CurrentDb
    Set qry = CurrentDb.QueryDefs("R-club")      'Ma requete
    Set rst = qry.OpenRecordset
 
    NbEnreg = rst.RecordCount
   MsgBox "Nombre de mails " & NbEnreg
 
    While Not (rst.EOF)
         MaVariableTO = MaVariableTO & ";" & rst.Fields("MAIL") ' le champ 
         rst.MoveLast
    Wend
 'ENVOI MAIL
 With CreateObject("CDO.Message")
 .From = "moi@free.fr"
 .To = "bibi@free.fr;MaVariableTO"
 .Subject = "Résultats du Match"
 .TextBody = "Bonne réception" & vbCrLf & "Salutations Sportives"
 .AddAttachment ("C:\Documents and Settings\admin\Mes documents\TEST_BASES\Resultats_ouv.pdf")
 .AddAttachment ("C:\Documents and Settings\admin\Mes documents\TEST_BASES\Equipes_ouv.pdf")
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.free.fr"
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
 .Configuration.Fields.Update
 On Error Resume Next
 .Display
 '.Send
 If Err Then MsgBox "Le message n'a pas été expédié."
 On Error GoTo 0
 End With
End Sub
ctsblv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 23h17   #6
Rédacteur/Modérateur
 
Avatar de Dolphy35
 
Homme Morgan BILLY
Technicien de Production
Inscription : octobre 2004
Messages : 4 103
Détails du profil
Informations personnelles :
Nom : Homme Morgan BILLY
Âge : 33
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Technicien de Production
Secteur : Industrie

Informations forums :
Inscription : octobre 2004
Messages : 4 103
Points : 8 729
Points : 8 729
Salut,

En fait tu as mis ta variable dans la chaîne de caractère avec l'adresse bibi.
lorsque tu ajoute une variable à une chaîne de caractères il faut l'exclure de la chaîne To="toto@free.fr" & Mavariable

Ligne ajoutée :
Dim MaVariableTO As String '-> Ajout du type de la variable

MaVariableTO = "bibi@free.fr" '-> Permet de mettre la première adresse de la liste de diffusion
Ligne modifiée :

.To = MaVariableTO
Le code complet :
Code :
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
Private Sub ENVMAIL_Click()
 
Dim Db As DAO.Database
    Dim rst As DAO.Recordset
    Dim qry As DAO.QueryDef
    Dim NbEnreg As Integer
    Dim MaVariableTO As String '-> Ajout du type de la variable
 
    'Ouverture de la requête
    Set Db = CurrentDb
    Set qry = CurrentDb.QueryDefs("R-club")      'Ma requete
    Set rst = qry.OpenRecordset
 
   NbEnreg = rst.RecordCount
   MsgBox "Nombre de mails " & NbEnreg
 
   MaVariableTO = "bibi@free.fr" '-> Permet de mettre la première adresse de la liste de diffusion
 
    While Not (rst.EOF)
         MaVariableTO = MaVariableTO & ";" & rst.Fields("MAIL") ' le champ 
         rst.MoveLast
    Wend
 
 'ENVOI MAIL
 With CreateObject("CDO.Message")
 .From = "moi@free.fr"
 .To = MaVariableTO
 .Subject = "Résultats du Match"
 .TextBody = "Bonne réception" & vbCrLf & "Salutations Sportives"
 .AddAttachment ("C:\Documents and Settings\admin\Mes documents\TEST_BASES\Resultats_ouv.pdf")
 .AddAttachment ("C:\Documents and Settings\admin\Mes documents\TEST_BASES\Equipes_ouv.pdf")
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.free.fr"
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
 .Configuration.Fields.Update
 On Error Resume Next
 .Display
 '.Send
 If Err Then MsgBox "Le message n'a pas été expédié."
 On Error GoTo 0
 End With
End Sub
Dolphy
__________________
Personnaliser la vue Backstage d'Access 2010
Découvrez avec nous Office 2010
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 01h03   #7
Invité de passage
 
Inscription : février 2010
Messages : 25
Détails du profil
Informations personnelles :
Localisation : France, Drôme (Rhône Alpes)

Informations forums :
Inscription : février 2010
Messages : 25
Points : 4
Points : 4
Re bonsoir
J'ai un souci ,lorsque je lance l'envoi,comme indiqué précédemment,la proc va jusqu'a Msgbox ,puis plus rien .Access.exe tourne sur la becane et monopolise 50% du cpu.
Si je regarde les taches en cours,j'ai le VBA avec la mention:
Pas de reponse et 2 taches Access qui ne repondent pas non plus.
Je cancelle la tache vba. La base en cours se ferme et il me signale un souci avec la dll oleaut32.
Je ferais des verifs demain.Là je fatigue.
Merci pour ta patience.
ctsblv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 09h48   #8
Membre actif
 
Homme Dominique
Gestion parc machine, assistance informatique, développement Access, Excel...
Inscription : février 2007
Messages : 130
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 56
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Gestion parc machine, assistance informatique, développement Access, Excel...
Secteur : Service public

Informations forums :
Inscription : février 2007
Messages : 130
Points : 161
Points : 161
Bonjour.
Je pense que ton problème se situe dans ta boucle While Wend dans laquelle la condition de sortie n'est jamais valide.
Place un point d'arrêt au début de ta boucle, affiche ton destinataire par un Debug.Print et exécute ton code en pas à pas.
Vérifie ainsi ta condition de sortie de boucle et corige le problème.
Autre solution, remplace ta boucle While Wend par une boucle For Next puisque que tu connait le nombre de destinataires.
Cordialement, Dominique.
PapouDomi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 11h41   #9
Rédacteur/Modérateur
 
Avatar de Dolphy35
 
Homme Morgan BILLY
Technicien de Production
Inscription : octobre 2004
Messages : 4 103
Détails du profil
Informations personnelles :
Nom : Homme Morgan BILLY
Âge : 33
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Technicien de Production
Secteur : Industrie

Informations forums :
Inscription : octobre 2004
Messages : 4 103
Points : 8 729
Points : 8 729
Salut,
Citation:
Envoyé par PapouDomi Voir le message
Je pense que ton problème se situe dans ta boucle While Wend dans laquelle la condition de sortie n'est jamais valide.
Non je ne suis pas d'accord la boucle fonctionne très bien.

Citation:
Envoyé par PapouDomi Voir le message
Autre solution, remplace ta boucle While Wend par une boucle For Next puisque que tu connait le nombre de destinataires.
Oui c'est une solution, le soucis est que dans un recordset tu ne récupère pas le nombre d'enregistrement seulement avec RecordCount il faut te mettre sur le dernier Record et ensuite revenir sur le premier pour effectuer la boucle. L'avantage du While évite de charger le nombre de Record. Dans son cas le MsgBox est à titre informatif pendant la phase de mise en place.

Pour revenir sur ton Code ctsblv, je t'ai donné une mauvaise indication sur mon premier post ce n'est pas MoveLast mais MoveNext , le premier déplace le curseur sur le dernier Record que le second te bascule sur le Record suivant.
Sinon je te conseil de réaliser un test si tu as des Records dans le Recordset Voici le code type que j'utilise :
Code :
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
Private Sub btnLancement_Click()
    ' déclaration des variables
    Dim dbAccess As DAO.Database
    Dim qry As DAO.QueryDef
    Dim rst As DAO.Recordset
 
    ' instance
    Set dbAccess = CurrentDb()
    Set qry = dbAccess.QueryDefs("rqt")
    Set rst = qry.OpenRecordset
 
    ' contrôle si il y a des enregistrements dans le Recordset
    ' ceci évite les erreurs
    If rst.RecordCount <> 0 Then
        ' placement sur le dernier enregistrements, obligé si on veux récupérer le Nombre de Record
        rst.MoveLast
        ' nombre d'enregistrements
        MsgBox rst.RecordCount
        ' replace le curseur sur le premier enregistrement
        rst.MoveFirst
        ' boucle tant que l'on n'arrive pas à la fin des enregistrements
        While Not (rst.EOF)
            ' affiche la deuxième colonne
            MsgBox rst.Fields(1)
            ' enregistrement suivant
            rst.MoveNext
        Wend
    End If
 
    ' fin de traitement
    MsgBox "Fin"
 
    ' fermeture et raz des instances
    rst.Close: Set rst = Nothing
    qry.Close: Set qry = Nothing
    dbAccess.Close: Set dbAccess = Nothing
End Sub
Sachant que ces deux lignes peuvent être enlevées si tu en as pas besoin
Code :
1
2
3
4
 ' placement sur le dernier enregistrements, obligé si on veux récupérer le Nombre de Record
        rst.MoveLast
        ' nombre d'enregistrements
        MsgBox rst.RecordCount
Dolphy
__________________
Personnaliser la vue Backstage d'Access 2010
Découvrez avec nous Office 2010
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 14h33   #10
Membre actif
 
Homme Dominique
Gestion parc machine, assistance informatique, développement Access, Excel...
Inscription : février 2007
Messages : 130
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 56
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Gestion parc machine, assistance informatique, développement Access, Excel...
Secteur : Service public

Informations forums :
Inscription : février 2007
Messages : 130
Points : 161
Points : 161
Bonjour Dolphy35.
Je suis d'accord avec toi, l'utilisation de la boucle While / Wend est nettement préférable.
Cordialement, Dominique.
PapouDomi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 16h39   #11
Invité de passage
 
Inscription : février 2010
Messages : 25
Détails du profil
Informations personnelles :
Localisation : France, Drôme (Rhône Alpes)

Informations forums :
Inscription : février 2010
Messages : 25
Points : 4
Points : 4
Bonjour Dominique,Dolphy
J'ai testé les 2 solutions c'est ok pour les 2
En effet le PB était dans la boucle.
Pour les 2 lignes facultatives,je les garde tant que je suis en phase d'essai.

Par contre afin de faire des tests de vérification,sans envoyer le message,j'ai changé .Send par .Display et là,j'ai une erreur Référence incorrecte ou non qualifiée.
Je n'ai rien trouvé sur le web si ce n'est un site anglo-saxon où il est dit que l'on ne peut pas avec CDO.
En tout cas merci pour vos réponses.
Félicitations à tous pour ce forum qui permet aux débutants comme moi de s'accrocher et de progresser.
ctsblv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 19h41   #12
Rédacteur/Modérateur
 
Avatar de Dolphy35
 
Homme Morgan BILLY
Technicien de Production
Inscription : octobre 2004
Messages : 4 103
Détails du profil
Informations personnelles :
Nom : Homme Morgan BILLY
Âge : 33
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Technicien de Production
Secteur : Industrie

Informations forums :
Inscription : octobre 2004
Messages : 4 103
Points : 8 729
Points : 8 729
Salut,
Citation:
Envoyé par PapouDomi Voir le message
Bonjour Dolphy35.
Je suis d'accord avec toi, l'utilisation de la boucle While / Wend est nettement préférable.
Cordialement, Dominique.

Citation:
Envoyé par ctsblv Voir le message
Bonjour Dominique,Dolphy
J'ai testé les 2 solutions c'est ok pour les 2
En effet le PB était dans la boucle.
Pour les 2 lignes facultatives,je les garde tant que je suis en phase d'essai.

Par contre afin de faire des tests de vérification,sans envoyer le message,j'ai changé .Send par .Display et là,j'ai une erreur Référence incorrecte ou non qualifiée.
Je n'ai rien trouvé sur le web si ce n'est un site anglo-saxon où il est dit que l'on ne peut pas avec CDO.
En tout cas merci pour vos réponses.
Félicitations à tous pour ce forum qui permet aux débutants comme moi de s'accrocher et de progresser.
Attention avec CDO cela n'a pas été maintenue avec la version 2010

Si les indications ont permis d'avancer sur ton problème tant mieux

Dolphy
__________________
Personnaliser la vue Backstage d'Access 2010
Découvrez avec nous Office 2010
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 22h16   #13
Invité de passage
 
Inscription : février 2010
Messages : 25
Détails du profil
Informations personnelles :
Localisation : France, Drôme (Rhône Alpes)

Informations forums :
Inscription : février 2010
Messages : 25
Points : 4
Points : 4
Bonsoir
J'ai rajouté un test sur Rst.Fields(Mail) car il peut y avoir des clubs sans @ mail
Dois-je mettre le code complet du module dans ce post ?
Pour ma part c'est OK . J'attends ta réponse pour le passer à RESOLU
Est-ce que autre chose remplace CDO dans la version 2010 ?
Encore MERCI
ctsblv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 00h17   #14
Rédacteur/Modérateur
 
Avatar de Dolphy35
 
Homme Morgan BILLY
Technicien de Production
Inscription : octobre 2004
Messages : 4 103
Détails du profil
Informations personnelles :
Nom : Homme Morgan BILLY
Âge : 33
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Technicien de Production
Secteur : Industrie

Informations forums :
Inscription : octobre 2004
Messages : 4 103
Points : 8 729
Points : 8 729
Salut,

Tu peux poster le code complet, au cas où une autre personne chercher à faire la même chose que toi

Pour CDO, non rien ne le remplace dans son intégralité, certaines méthodes ont été intégrées mais il y aura toujours des manques.

Dolphy
__________________
Personnaliser la vue Backstage d'Access 2010
Découvrez avec nous Office 2010
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h11.


 
 
 
 
Partenaires

Hébergement Web