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.

13bilan-2021.xlsm (89.22 Ko)

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.

6bilan-2021.xlsm (89.38 Ko)

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.

Rechercher des sujets similaires à "envoyer feuille courriel"