Envoyer un feuille Excel par courriel
Bonsoir à toutes et à tous.
Je voudrais savoir si il est possible d'envoyer un feuille excel par courriel en utilisation thunderbird plutôt que outlook, et si oui comment faire ?
Merci d'avance.
Bonjour Ldopa,
Je pense que ça doit être possible, car d'autres y sont arrivés
Jette un oeil ici : https://forum.excel-pratique.com/excel/envoi-mail-avec-thunderbird-totalement-automatique-115259
Par contre n'ayant pas thunderbird, je ne peux pas tester, désolé.
Bon dimanche.
Joe
Bonjour joept69.
Merci pour ta réponse.
J'ai tester mais j'ai un problème l'erreur suivante s'affiche ;"Erreur de compilation Projet ou bibliothèque introuvable", et la commande "strCommand" est surligné en bleu.
Si tu peu m'aider.
Merci d'avance
Re-bonjour Ldopa,
Donne le code de ta macro ça va (peut-être) me parler un peu (même si je suis très loin d'être une pointure en VBA).
Joe
re :
Moi non plus je ne suis pas une flèche en VBA.
Je te joins le fichier.
Salut le fil ...
Commences par déclarer ta variable Dim strCommand As String
Je ne connais pas Thunderbird mais je pense qu'il fonctionne comme Outlook donc au lieu de faire une boucle et d'envoyer un courriel pour chaque adresse construit plutôt ton Destinataire
pour compiler toutes les adresses séparées par un point virgule. idem pour ta dernière cellule non vide crée une variable et fait ton calcul avant la boucle. cela t'évitera de mettre aussi des Application.Wait dans ton code
Bonsoir Jean Paul
Merci pour ta réponse.
Comme écrit précédemment je ne suis pas une flèche en VBA.
J'ai corrigé comme indiqué, mais maintenant j'ai une erreur
"For i = 20 To .[1048576].End(xlUp).Row"
Je joins le fichier.
Encore merci pour ton aide.
Re Jean Paul.
J'ai résolu le PB de For i ect.
Par contre quand Thundirbird ouvre la fenêtre d'envoi, il n'y a pas de pièce jointe et je voudrais que la pièce jointe Soit la plage A1 à R577.
Peux tu me guider.
Merci d'avance.
Re :
Merci, j'ai trouver la solution.
Ce n'est peut être pas idéal, mais cela fonctionne.
Private Sub EnvoyerEmail_Click()
'Permat d'envoyer par courriel la Ventilation de l'année en cours
Application.ScreenUpdating = False
Dim destinataire, fichierJoint, sujet, body As String
Dim strCommand As String
Unload Me
Range("A1:R579").Select
Application.CutCopyMode = False
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Application.Dialogs(xlDialogSaveAs).Show
MsgBox "Fichier enregistré !", vbInformation
ActiveWorkbook.Close
Range("A3").Select
Sheets(Worksheets.Count).Select
With Sheets(Worksheets.Count)
destinataire = Range("T1")
sujet = Range("U1")
body = Range("V1")
fichierJoint = "I:\ASPTT\APPLIS VELO\COMPTA\Classeur pour courriels.xlsx"
strCommand = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird"
strCommand = strCommand & " -compose " & "to='" & destinataire & "'"
strCommand = strCommand & "," & "subject=" & sujet & ","
strCommand = strCommand & "body='" & Chr(34) & body & Chr(34) & "'"
strCommand = strCommand & "," & "format='" & 1 & "'"
strCommand = strCommand & "," & "attachment=file:///" & fichierJoint
MsgBox strCommand
Call Shell(strCommand, vbNormalFocus)
Application.Wait (Now + TimeValue("0:00:03"))
SendKeys "^{ENTER}", True
End With
Application.ScreenUpdating = True
End Sub
Merci à vous deux.
A vous relire.
Petit oubli.
Je clos le post
Salut le fil ...
Juste quelques petites infos sur ton code mais cela n'engage que moi
Private Sub EnvoyerEmail_Click()
'Permat d'envoyer par courriel la Ventilation de l'année en cours
'// Dans la mesure ou tu va utilser des commades extérieure à ton code ici Shell en l'occurrence, utilise un On Error pour gerer les éventuelles erreurs
Application.ScreenUpdating = False
'// Attention dans tes déclarations pour un code plus compréhensible utilises des étiquettes pour chaque type
'// str ou s pour String, lg ou l pour long etc....
'// Dim destinataire ne parle pas beaucoup Dim strDestinataire est plus significatif
Dim destinataire, fichierJoint, sujet, body As String
Dim strCommand As String
Unload Me
'// Utilises plutôt le nommage sur tes plages surtout si elles sont amenées à évoluer en taille
Range("A1:R579").Select
Application.CutCopyMode = False
Selection.Copy
Workbooks.Add
'// Pour être plus efficace
'// With ActiveSheet
'// .Name = "Le nom de feuille"
'// .Paste
'// ...
'// End With
ActiveSheet.Paste
Application.Dialogs(xlDialogSaveAs).Show
'// Que ce passe-t-il si l'utilisateur clique sur annuler dans la boite de dialogue ? :)
'// Tu peux être plus efficace en utilisant une condition
'// If Application.Dialogs(xlDialogSaveAs).Show = True Then
'// Ici mettre ton code de validation
'// MsgBox "Fichier enregistré"
'// Else
'// MsgBox "le Fichier n'a pas été enregistré"
'// End If
MsgBox "Fichier enregistré !", vbInformation
ActiveWorkbook.Close
Range("A3").Select '// c'est inutile puisque tu fais un With dessous
Sheets(Worksheets.Count).Select
'// Ici utilise plutôt le nom de ta feuille si pour x raisons tu rajoutes une feuille tu devra changer ton code.
With Sheets(Worksheets.Count)
'// Puisque tu as fait un with tu dois mettre un . devant ton Range sinon le Range renvoyé est celui de la feuille active
'// Ici cela va fonctionner puisque tu as sélectionner ta feuille mais attention....
destinataire = Range("T1") '// destinataire = .Range("T1")
sujet = Range("U1") '//sujet = .Range("U1")
body = Range("V1") '// body = .Range("V1")
fichierJoint = "I:\ASPTT\APPLIS VELO\COMPTA\Classeur pour courriels.xlsx"
strCommand = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird"
strCommand = strCommand & " -compose " & "to='" & destinataire & "'"
strCommand = strCommand & "," & "subject=" & sujet & ","
strCommand = strCommand & "body='" & Chr(34) & body & Chr(34) & "'"
strCommand = strCommand & "," & "format='" & 1 & "'"
strCommand = strCommand & "," & "attachment=file:///" & fichierJoint
MsgBox strCommand '// Utilise plutôt Debug.Print qui ne sera pas pris en compte dans la compilation du code
Call Shell(strCommand, vbNormalFocus)
Application.Wait (Now + TimeValue("0:00:03"))
SendKeys "^{ENTER}", True
End With
Application.ScreenUpdating = True
End Sub
Voili, voilou bonne programmation
Bonjour Jean Paul
Merci beaucoup pour ton aide.
J'ai modifier le code pour la partie enregistrement comme tu me le conseille.
Concernant les plages ranges, j'ai déjà modifié, car maintenant j'envoi 3 feuille complètes, deux dont le nom est fixe et qui ne devrait pas changer
et une qui sera en "worksheets.count".
Par contre, je voudrai modifier " fichierJoint = "I:\ASPTT\APPLIS VELO\COMPTA\Classeur pour courriels.xlsx".
Si quelqu'un d'autre utilise ce fichier sur son ordinateur, l'adresse du fichier joint sera différente, il faudrait donc obliger le code à aller chercher la nouvlle adresse automatiquement et la je cale.
Si tu peux m'aider cela m'arrangerai.
Merci d'avance.
Re: Jean Paul.
C'est bon j'ai trouver la solution.
'Ouvre le fichier à envoyer
Myfile_Name = Application.GetOpenFilename(FileFilter:="Excel Files (*. Xl *), *. Xl *)")
If Myfile_Name <> False Then
Workbooks.Open Filename:=Myfile_Name
End If
J'ai aussi suivi ton conseil j'ai remplacer "Mgsbox srtCommand" par "Debug.Print".
Je remet le code complet pour voir.
Private Sub EnvoyerEmail_Click()
'Permat d'envoyer par courriel la Ventilation de l'année en cours
Dim destinataire, fichierJoint, sujet, body As String
Dim strCommand As String
Dim Myfile_Name As Variant
Application.ScreenUpdating = False
Unload Me
'Copie les feuilles dans un nouveau classeur
Sheets(Array("Bordereau Dépôt Chèques", "Solde Cotisation a Recevoir", Worksheets.Count)) _
.Select
Sheets(Array("Bordereau Dépôt Chèques", "Solde Cotisation a Recevoir", Worksheets.Count)) _
.Copy
ActiveSheet.Shapes.Range(Array("Rounded Rectangle 4")).Select
Selection.Delete
Sheets("Solde Cotisation a Recevoir").Select
ActiveSheet.Shapes.Range(Array("Oval 1")).Select
Selection.Delete
Sheets(Worksheets.Count).Select
ActiveSheet.Shapes.Range(Array("Oval 2")).Select
Selection.Delete
If Application.Dialogs(xlDialogSaveAs).Show = True Then
MsgBox "Fichier enregistré"
Else
MsgBox "le Fichier n'a pas été enregistré"
ActiveWorkbook.Saved = True 'Evite l'ouverture de la fenêtre demande enregistrement
End If
ActiveWorkbook.Close
'envoi le fichier par courriel
Range("A3").Select
Application.ScreenUpdating = False
Sheets("Adresses").Select
With Sheets("Adresses")
destinataire = Range("A1")
sujet = Range("B1")
body = Range("C1")
'Ouvre le fichier à envoyer
Myfile_Name = Application.GetOpenFilename(FileFilter:="Excel Files (*. Xl *), *. Xl *)")
If Myfile_Name <> False Then
Workbooks.Open Filename:=Myfile_Name
End If
strCommand = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird"
strCommand = strCommand & " -compose " & "to='" & destinataire & "'"
strCommand = strCommand & "," & "subject=" & sujet & ","
strCommand = strCommand & "body='" & Chr(34) & body & Chr(34) & "'"
strCommand = strCommand & "," & "format='" & 1 & "'"
strCommand = strCommand & "," & "attachment=file:///" & Myfile_Name
Debug.Print
Call Shell(strCommand, vbNormalFocus)
Application.Wait (Now + TimeValue("0:00:03"))
SendKeys "^{ENTER}", True
ActiveWorkbook.Saved = True 'Evite l'ouverture de la fenêtre demande enregistrement
ActiveWorkbook.Close
End With
Sheets("Accueil").Select
End Sub
Merci encore
Au plaisir de te relire.
Amicalement
Salut le fil ...
J'ai modifier le code pour la partie enregistrement comme tu me le conseille.
Concernant les plages ranges, j'ai déjà modifié, car maintenant j'envoi 3 feuille complètes, deux dont le nom est fixe et qui ne devrait pas changer
'// Refermes ton With dès que possible
'// N'oublie pas les points devant ton Range
With Sheets(Worksheets.Count)
destinataire = .Range("T1")
sujet = .Range("U1")
Body = .Range("V1")
End With
Par contre, je voudrai modifier " fichierJoint = "I:\ASPTT\APPLIS VELO\COMPTA\Classeur pour courriels.xlsx".
Si quelqu'un d'autre utilise ce fichier sur son ordinateur, l'adresse du fichier joint sera différente, il faudrait donc obliger le code à aller chercher la nouvlle adresse automatiquement et la je cale.
'// Petite astuce pour ne pas ouvrir le document pour rien
If ThisWorkbook.BuiltinDocumentProperties("Last Author").Value <> Mon_Nom Then
'// Ouverture du classeur
End If
Et pour Debug.Print
...
'// Debug.Print doit être utiliser comme pour un MessageBox
'// Tout d'abords tu dois afficher la fenêtre d'exécution dans VBA en faisant [CTRL G] pour pouvoir voir les information de Debug.Print
Debug.Print "Le Fichier a été enregistré sous : " & chemin
Bonne programmation.
Bonjour Jean Paul.
J'ai intégré tes lignes de code. Avec quelques petits ajouts.
Private Sub EnvoyerEmail_Click()
'Permat d'envoyer par courriel la Ventilation de l'année en cours
Dim destinataire, fichierJoint, sujet, body As String
Dim strCommand As String
Dim Chemin As Variant
Dim Myfile_Name As Variant
Application.ScreenUpdating = False
Unload Me
'Copie les feuilles dans un nouveau classeur
Sheets(Array("Bordereau Dépôt Chèques", "Solde Cotisation a Recevoir", Worksheets.Count)) _
.Select
Sheets(Array("Bordereau Dépôt Chèques", "Solde Cotisation a Recevoir", Worksheets.Count)) _
.Copy
ActiveSheet.Shapes.Range(Array("Rounded Rectangle 4")).Select
Selection.Delete
Sheets("Solde Cotisation a Recevoir").Select
ActiveSheet.Shapes.Range(Array("Oval 1")).Select
Selection.Delete
Sheets(Worksheets.Count).Select
ActiveSheet.Shapes.Range(Array("Oval 2")).Select
Selection.Delete
If Application.Dialogs(xlDialogSaveAs).Show = True Then
MsgBox "Fichier enregistré"
Else
MsgBox "le Fichier n'a pas été enregistré"
ActiveWorkbook.Saved = True 'Evite l'ouverture de la fenêtre demande enregistrement
End If
ActiveWorkbook.Close
'Prépare le fichier pour le courriel
Range("A3").Select
Application.ScreenUpdating = False
Sheets("Adresses").Select
With Sheets("Adresses")
destinataire = Range("A1")
sujet = Range("B1")
body = Range("C1")
End With
'Ouvre le fichier à envoyer
On Error GoTo Fin
If ThisWorkbook.BuiltinDocumentProperties("Last Author").Value <> Myfile_Name Then
Myfile_Name = Application.GetOpenFilename(FileFilter:="Excel Files (*. Xl *), *. Xl *)")
Workbooks.Open Filename:=Myfile_Name
End If
' envoi le courriel
Application.ScreenUpdating = False
strCommand = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird"
strCommand = strCommand & " -compose " & "to='" & destinataire & "'"
strCommand = strCommand & "," & "subject=" & sujet & ","
strCommand = strCommand & "body='" & Chr(34) & body & Chr(34) & "'"
strCommand = strCommand & "," & "format='" & 1 & "'"
strCommand = strCommand & "," & "attachment=file:///" & Myfile_Name
Debug.Print "Le Fichier a été enregistré sous : " & Chemin
Call Shell(strCommand, vbNormalFocus)
Application.Wait (Now + TimeValue("0:00:03"))
SendKeys "^{ENTER}", True
'Evite l'ouverture de la fenêtre demande enregistrement
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
Sheets("Accueil").Select
Exit Sub
Fin:
MsgBox " Veuillez Veuillez selectionner le fichier à envoyer "
End Sub
J'espère que j'ai bien compris.
A te relire
Salut le fil...
A mon avis non tu n'as pas tout compris...
Donc mon premier conseil est d'abuser de la touche F1 tu verra elle fait des miracles dans l'environnement VBA.
Mon deuxième c'est de ne pas recopier le code "bêtement" sans comprendre ce que tu fais. certaines lignes que j'ai posté n'étaient que des exemples.
Aller on démarre, vas dans menu Outils\Options\Editeur et tu vérifie que "Complément automatique des instructions" soit coché, et aussi "Déclaration des variables obligatoire. c'est deux instructions vont te faire gagner du temps et éviter pas mal d'erreurs de débutants. tu peut aussi mettre en tête de ton module Option Explicit
si tu ne veux traiter qu'un seul module avec les déclarations obligatoires.
Regardons d'abord le complément automatique des instructions. car tu n'a toujours pas modifier ton code sur le With ... End With
Crée un module modTest
et tu colles le code ci dessous.
Sub Test
Dim MyRange As Range
'// On défini la plage de cellules
Set MyRange = Range("A1:A10")
'// Et le fameux With
With MyRange
.Name = "Patients" '// On attribut un nom
End With
End SUb
Voilà maintenant tu pose le curseur sous la ligne .Name ...
Tu tapes un .
et tu regardes le résultat :)
Maintenant regardons cette ligne de code If ThisWorkbook.BuiltinDocumentProperties("Last Author").Value <> Myfile_Name Then
que fait-elle ? elle demande à Excel de nous renvoyer le nom de celui qui à fait la dernière modification, et toi tu le compares avec Myfile_Name
qui est un chemin, et qui est de sur quoi, vide à ce moment. (A déclarer en tant que String). Tu aurais du le comparer avec ton nom d'utilisateur, tu ne le connais pas colles ce texte dans la fenêtre d'exécution et valide par entrée, ?ThisWorkbook.BuiltinDocumentProperties("Last Author").Value
sans oublier le ?
Par exemple pour moi le code aurait été If ThisWorkbook.BuiltinDocumentProperties("Last Author").Value <> "Jean-Paul (Valtrase)" Then...
Donc en gros si c'est pas moi qui ai fait la dernière modification alors j'ouvre l'explorateur de fichiers.
Aller Debug.print
lui il te sert à voir ce que contient une variable par exemple tu aurais pu le coller après la concaténation de la variable srtCommand
Application.ScreenUpdating = False
strCommand = "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird"
strCommand = strCommand & " -compose " & "to='" & destinataire & "'"
strCommand = strCommand & "," & "subject=" & sujet & ","
strCommand = strCommand & "body='" & Chr(34) & body & Chr(34) & "'"
strCommand = strCommand & "," & "format='" & 1 & "'"
strCommand = strCommand & "," & "attachment=file:///" & Myfile_Name
Debug.Print "strCommand : " & srtCommand
Et pour finir je ne te parlerais pas de tous les .Select beaucoup de sujets l'on évoqué fait une petite recherche..
Bonne programmation.
Re jean Paul.
Merci pour le Bêtement
J'ai encore besoin de ton aide, car la partie If ThisWorkbook.BuiltinDocumentProperties("Last Author").Value <> "LDOPA" Then...
Me pose problème. Je n'arive pas à récuperer le données sans ouvrir le fichier et surtout je voudrais savoir si le fichier est utiliser sur un autre PC avec un autre nom,
comment changer le nom dans le code.
Merci beaucoup.
A te relire
Re :
c'est bon cela fonctionne.
Encore merci. Je clos le post.