VBA: Envoyer un email par Gmail avec feuilles en pièces jointes

GuillaumA

XLDnaute Occasionnel
EDIT : Fichier Disponible page 3 : Post #35


Cordialement,
Guillaume A.
 
Dernière édition:

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Merci JNP.
Je découvre la fonction Kill.
Cette dernière me semble très intéressante et à la fois très dangereuse !

Par le plus grand des hasard. Saurais-tu faire une liste déroulante avec en choix le nom de toutes les feuilles du classeur ?

Par exemple j'ai un classeur avec 3 feuilles: Feuil1, Feuil2, Feuil3 et une liste déroulante en A1 de la Feuil3,
La liste déroulante me propose: Feuil1 , Feuil2, Feuil3

J'imagine qu'une liste doit être construite mais alors je vois pas du tout comment injecter dans cette liste le nom de mes feuilles, surtout si des feuilles sont rajoutées au fur et à mesure.

a+
Guillaume
 
Dernière édition:

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Ok ça commence à prendre forme!
J'ai un dernier problème:

Les feuilles à joindres se situent sur la plage C15:C25 (chaque cellule à son lien vers la liste déroulante des onglets du classeur, donc l'utilisateur peut choisir jusqu'à 10 onglets pour créer 10 feuilles.

Je souhaite que les onglets sélectionnées soient tous copiés dans chacun un classeur différent. Mais je ne sais faire que pour un ...

Pour un seul:
Code:
NomDeLaFeuille = Range("C15").Value

If Range("D15").Value = "OK" 
Then
ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close
Ci dessous ce que j'ai commencé à faire:
Code:
ZoneSelectionNomDesFeuillesACopier = Range("C15:C25").Value [COLOR="Green"]'Je sais que je dois passer par une sélection de zone mais je ne sais pas comment l'implementer[/COLOR]
NomDeLaFeuille = [COLOR="Red"]Range("C15").Value[/COLOR] [COLOR="Green"]'C'est là ou je sais pas comment on peut sélectionner plusieurs feuilles pour créer des classeurs multiples.[/COLOR]

If Range("D15").Value = "OK" [COLOR="Green"] 'a coté de chaque feuille choisi, il devra valider OK[/COLOR]
And If Not Range ("C15").Value = "" [COLOR="Green"]'afin de ne choisir dans la zone que les cellules ou un nom apparaît[/COLOR]
Then
ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close

Je continue à chercher mais si tu as des pistes je les accepterai avec grandes joie ! :)

Guillaume
 
Dernière édition:

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

J'ai intégré une boucle mais je n'arrive pas à la stopper. Cette dernière ne fait que recréer continuellement un classeur correspondant à la Feuil1 (identifié en C15) sans passer à la cellule C16 etc pour les autres feuilles...

Code:
Do While Not IsEmpty("C15:C25")

NomDeLaFeuille = Range("C15").Value


If Range("D15").Value = "OK" And Not Range("C15").Value = "" Then
Then
ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close
End If
Loop
 
Dernière édition:

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Re bonjour:

Je suis parti sur une autre voie, en partageant la macro d'envoi de mail en deux. Une première qui crée les classeurs, une seconde qui envoie.


Sub EnvoiMail()

Dim NomDeLaFeuille(1 To 11) As Long
NomDeLaFeuille(1) = Range("C15").Value
NomDeLaFeuille(2) = Range("C16").Value
NomDeLaFeuille(3) = Range("C17").Value
NomDeLaFeuille(4) = Range("C18").Value
NomDeLaFeuille(5) = Range("C19").Value
NomDeLaFeuille(6) = Range("C20").Value
NomDeLaFeuille(7) = Range("C21").Value
NomDeLaFeuille(8) = Range("C22").Value
NomDeLaFeuille(9) = Range("C23").Value
NomDeLaFeuille(10) = Range("C24").Value
NomDeLaFeuille(11) = Range("C25").Value

If Not NomDeLaFeuille.Value = ""
Then
ThisWorkbook.Sheets(NomDeLaFeuille).Copy
ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
ActiveWorkbook.Close
End if

Call Module3.SendMailCDO 'appel de la macro d'envoi

Kill "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille & ".xls"

End Sub

Le logiciel me dit en erreur "incompatibilité de type."
Quelqu'un saurait'il ce qui ne va pas ?

Cordialement,
Guillaume
 
Dernière édition:
G

Guest

Guest
Re : Envoyer feuille excel par mail (gmail)

Bonjour,

Voici une chose possible. Je n'ai pas traité l'envoi car je n'en connais pas la macro.

Code:
Dim i As Integer
Dim NomDeLaFeuille As String
Dim NomDesClasseurs(1 To 11)
For i = 15 To 25
    If Not IsEmpty(Range("C" & i)) And Range("D" & i) = "OK" Then
    NomDeLaFeuille = Range("C" & i)
    NomDesClasseurs(i - 15 + 1) = "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille
    ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close
Next i
For i = 1 To 11
    Kill NomDesClasseurs(i)
Next

A+
 

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Bonjour hasco,
Merci pour ta proposition c'est effectivement ce que je recherchai!

Cela m'affiche une erreur: "Erreur d’exécution 13: Incompatibilité de type"
Dim i As Integer
Dim NomDeLaFeuille As String
Dim NomDesClasseurs(1 To 11)
For i = 15 To 25
If Not IsEmpty(Range("C" & i)) And Range("D" & i) = "OK" Then
NomDeLaFeuille = Range("C" & i)
NomDesClasseurs(i - 15 + 1) = "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille
ThisWorkbook.Sheets(NomDeLaFeuille).Copy
ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
ActiveWorkbook.Close
End If
Next i
For i = 1 To 11
Kill NomDesClasseurs(i)
Next

De même si je change NomDesClasseurs par:
NomDesClasseurs(i - 15 + 1) = "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille & ".xls"


Guillaume
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Envoyer feuille excel par mail (gmail)

Re :),
Très bonne solution Ges ;).
Je compléterais en intégrant un argument à la sub
Code:
Public Sub SendMailCDO(NomDesClasseurs)
et en ajoutant pour les pièces jointes
Code:
For i = 1 To 11
    If NomDesClasseurs(i) <> "" Then .AddAttachment NomDesClasseurs(i)
Next
et il ne resterait plus qu'à appeler dans ton code
Code:
For i = 15 To 25
    If Not IsEmpty(Range("C" & i)) And Range("D" & i) = "OK" Then
    NomDeLaFeuille = Range("C" & i)
    NomDesClasseurs(i - 15 + 1) = "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille
    ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close
[COLOR=red][B]End If[/B][/COLOR]
Next i
[COLOR=red][B]Call SendMailCDO(NomDesClasseurs)[/B][/COLOR]
For i = 1 To 11
    Kill NomDesClasseurs(i)
Next
Le End If doit être ce qui provoque l'erreur que Guillaume a décrite pendant que je rédigeais ce post :p.
A + :cool:
 
Dernière édition:

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Trop fort ça marche!

Plus qu'a l’implémenter avec ma macro d'envoi et je vous envoi la version finale!

Un grand merci à vous deux sans qui je n'aurai pu en arriver là!

Keep in touch

Guillaume
 

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Voila la macro avec la fonction envoyer mail dedans:
Code:
 Sub EnvoyerMail1()

Dim i As Integer
Dim NomDeLaFeuille As String
Dim NomDesClasseurs(1 To 11)
Dim ZonePJ As Range
Set ZonePJ = Range("C18:C28")

For i = 18 To 28
    If Not IsEmpty(Range("C" & i)) And Range("D" & i) = "OK" Then
    NomDeLaFeuille = Range("C" & i)
    NomDesClasseurs(i - 18 + 1) = "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille & ".xls"
    ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close
    End If
Next i
[COLOR="Red"]Range("C34").Value = NomDesClasseurs(i1);NomDesClasseurs(i2);NomDesClasseurs(i3);etc[/COLOR]

Dim D As String
Dim CC As String
Dim E As String
Dim S As String
Dim T As String
Dim pj As String

D = Range("C33").Value
CC = Range("C35").Value
E = Range("C15").Value
S = Range("C3").Value
T = Range("C6").Value & Chr(10) & Chr(10) & Range("C9").Value
[COLOR="Red"]pj = Range("C34").Value[/COLOR]

Dim Cdo_Message As New CDO.Message
Set Cdo_Message.Configuration = GetSMTPServerConfig()
With Cdo_Message
.To = D
.CC = CC
.From = E
.Subject = S
.TextBody = T
     If Not IsMissing(pj) Then
     .AddAttachment pj
     End If

.send
End With

success = MsgBox(" envoyés avec succès !", vbInformation)

Exit Sub
SMTPSendMail_Err:
    'Gestion des erreurs
    tmp = MsgBox("Erreur lors de l'envoi de votre message." & Chr(10) & "Détails : " & Err.Description, vbCritical)

For i = 1 To 11
    If NomDesClasseurs(i) <> "" Then Kill NomDesClasseurs(i)
Next
ZonePJ.ClearContents

End Sub

Je dois pouvoir attacher tous les classeurs créés dans la pèce jointe.

Je sais que multiplier les pièces jointe marche:
Code:
     If Not IsMissing(pj1) Then
     .AddAttachment pj1
     End If
     If Not IsMissing(pj2) Then
     .AddAttachment pj2
     End If
     If Not IsMissing(pj3) Then
     .AddAttachment pj3
     End If
Mais je ne sais pas l'adapter.

Une autre solution serait d'envoyer les noms des pièces jointes dans une même cellule, toutes séparée par des ;
Je devrais sans doute l'utiliser avant la partie de la macro qui s'occupe d'envoyer le mail:
.Range("C34").Value = NomDesClasseurs(i1);NomDesClasseurs(i2);NomDesClasseurs(i3);etc
Et mettre pj = Range("C34").Value
mais je ne sais pas comment l'écrire en VBA.

Cordialement,
Guillaume
 
Dernière édition:

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Bonjour a tous.
J'ai compris qu'il fallait que je mette deux Loop pour que ça marche.

Une première ici, afin d'écrire le nom des classeurs créés dans l'intervale C38:C48:
Code:
[COLOR="DarkSlateGray"]
Dim i As Integer
Dim j As Integer
Dim NomDeLaFeuille As String
Dim NomDesClasseurs(1 To 11)
Dim ZonePJ As Range
Set ZonePJ = Range("C18:D28")

For i = 18 To 28
    If Not IsEmpty(Range("C" & i)) And Range("D" & i) = "OK" Then
    NomDeLaFeuille = Range("C" & i)
    NomDesClasseurs(i - 18 + 1) = "C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille & ".xls"
    ThisWorkbook.Sheets(NomDeLaFeuille).Copy
    ActiveWorkbook.SaveAs ("C:\Documents and Settings\user\Mes documents\" & NomDeLaFeuille)
    ActiveWorkbook.Close
    End If
Next i
[/COLOR]
[COLOR="Red"]For j = [C38] To [C48]
Do
Do While Not IsEmpty(Range("C" & j))
Range(j).Value = NomDesClasseurs
Exit Do
Loop
Loop Until i = 28
Next j[/COLOR]


Et une deuxième loop pour considérer ces noms comme les pièces jointes à liéer dans le code d'envoi du mail:
Code:
  [COLOR="DarkSlateGray"]
Dim D As String
Dim CC As String
Dim E As String
Dim S As String
Dim T As String[/COLOR]
[COLOR="red"]Dim pj As String  <=== Devrait être As Integer ?[/COLOR]

[COLOR="DarkSlateGray"]D = Range("C33").Value
CC = Range("C35").Value
E = Range("C15").Value
S = Range("C3").Value
T = Range("C6").Value & Chr(10) & Chr(10) & Range("C9").Value[/COLOR]
[COLOR="Red"]pj = Range("C34").Value   <== Devrai cibler la zone C38:C48 ?[/COLOR]

[COLOR="rgb(47, 79, 79)"]
Dim Cdo_Message As New CDO.Message
Set Cdo_Message.Configuration = GetSMTPServerConfig()
With Cdo_Message
.To = D
.CC = CC
.From = E
.Subject = S
.TextBody = T[/COLOR]
   [COLOR="red"]If Not IsMissing(pj) Then   <=== La loop doit être ici pour faire correspondre une pièce jointe pour chaque cellule de C38 à C48 en ne comptant pas les cellules vides
     .AddAttachment pj
     End If[/COLOR]


Problème, je ne comprend pas encore le système des Loop et je ne sait pas comment les faire marcher. Pour l'instant ça me fait bugger.
Auriez vous l'amabilité de m'aider dans cette dernière étape ?

Cordialement,
Guillaume
 
Dernière édition:
G

Guest

Guest
Re : Envoyer feuille excel par mail (gmail)

Bonjour,

Pour faire une chaine de caractère à partir d'un tableau à une dimension (NomsDesClasseurs):

LaChaine = Join(NomsDesClasseurs,";")

Donnera "NomDuClasseur1;NomDuClasseur2;NomDuClasseur3....Etc."

Pas besoin de passer par des cellules.

A+
 

GuillaumA

XLDnaute Occasionnel
Re : Envoyer feuille excel par mail (gmail)

Bonjour Hasco

Et bien apparemment la méthode des ";" entre les Pièces jointes ne marche pas avec CDO. Il faut déterminer une pièce jointe par cellule (pj1 = C38, pj2 = C39, pj3= C40, ...)

C'est pour cela que je cherche à utiliser les Loop afin qu'il check automatiquement dans la zone C38:c48 les cellules avec le nom des classeurs et qu'il les utilisent.

Grossièrement, cela doit faire l'équivalent de:(cela marche, j'ai testé. Il a juste un problème lorsque une des pj cible une cellule vide. Comme si If Not IsMissing() ne servait a rien...)
If Not IsMissing(pj1) Then
.AddAttachment pj1
End If
If Not IsMissing(pj2) Then
.AddAttachment pj2
End If
If Not IsMissing(pj3) Then
.AddAttachment pj3
End If

Guillaume
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 349
Messages
2 087 513
Membres
103 572
dernier inscrit
hamzahaha