begin process at 2010 02 10 16:02:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VBA

 > ENVOI AUTOMATIQUE DE MAIL (AVEC PIÈCE JOINTE) EN VBA : EXCEL, WORD OU ACCESS PAR OULOOK EXPRESS OU MODZILLA THUNDERBIRD OU D'AUTRES

ENVOI AUTOMATIQUE DE MAIL (AVEC PIÈCE JOINTE) EN VBA : EXCEL, WORD OU ACCESS PAR OULOOK EXPRESS OU MODZILLA THUNDERBIRD OU D'AUTRES


 Information sur la source

Note :
9,52 / 10 - par 25 personnes
9,52 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :VBA Classé sous :mail, automatique, pièce jointe, envoi mail, VBA Niveau :Débutant Date de création :22/05/2005 Date de mise à jour :08/10/2008 02:36:59 Vu / téléchargé :130 155 / 7 734

Auteur : nerim

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (169)
Ajouter un commentaire et/ou une note


 Description

Module en VBA qui s'utilise aussi bien avec Access qu'avec Word ou Excel.
Il envoie automatiquement un mail (avec pièce jointe si on désire).
Ce Programme est sans prétention : Pas d'appel à des API plus ou moins obscures pour les débutants.
Il s'adresse plutôt à ces derniers car il est TRES documenté (environ les 3/4 des lignes sont des commentaires)
Je l'ai testé avec Word, Excel et Access. Et avec 3 clients de messagerie Outlook Express, Mozilla Thunderbird et Office Outlook. Mais il est très facile à adapter à d'autres clients (Eudora....).
Je fournis un exemple d'utilisation avec Excel : A l'ouverture du classeur on vérifie si, dans une liste de tâches, certaines sont arrivées à échéance et on envoie automatiquement un mail avec le nom des tâches en question.

Cette version comporte quelques améliorations suggérées dans les commentaires depuis la parution (mai 2005) jusqu'à aujourd'hui (16/01/2008) :

Des clients de messagerie nouveaux
La possibilité d'envoyer des plages Excel
La gestion des copies et copies cachées
L'utilisation du copier coller pour des corps volumineux...

Un résumé des questions posées jusqu'à présent dans les commentaires
- Si vous voulez éviter l'ouverture de la fenêtre et que vous utilisez Outlook 2003 (à essayer avec les autres versions d'Outlook), vous pouvez utiliser une autre méthode indiquée en fin de de Code(Elle ne figure pas dans le zip).
- Pour placer des caractères spéciaux dans le corps, utiliser les codes Hexa de ces caractères (exemple pour placer un saut de ligne dans le corps du message utiliser "%0A")
- La taille de l'URL transmise (donc du message) est limitée (à 817 caractères semble-t-il). Au delà il faut utiliser le copier/coller (cf dans le code)

Nouveautés dans le ZIP posté le 08/10/2008 :
-le choix de l'expéditeur du mail avec Thunderbird (certainement facile à adapter pour Outlook...).
-Toujours avec Thundrbird, forcer l'envoi du mail en HTML (c'est mieux pour les tableaux)
- Enfin j'ai amélioré le classeur Excel qui demande désormais le client mail utilisé avant d'envoyer le mail (avec les versions précédentes, l'envoi automatique à l'ouverture du classeur ne fonctionnait qu'avec thunderbird)

Merci pour toutes les questions posées (et les réponses fournies) qui me permettent d'améliorer cette source.

Source

  • '
  • ' Ce module permet l'envoi d'un mail par le logiciel client SMTP par défaut du système
  • '
  • ' le principe est de créer un lien de type "mailto:"
  • ' et de demander au programme appelant de suivre ce lien
  • '
  • ' Les arguments Adresse, Objet, Corps et Adresses de copie et de copie cachés sont fournis à la procédure
  • ' qui les utilise pour définir l'hyperlien qui sera activé par la méthode
  • ' FollowHyperLink du classeur actif
  • '
  • ' le problème est que VB suit le lien
  • ' (ici il lance le programme de messagerie en lui fournissant les infos nécessaires)
  • ' puis se désintéresse du problème
  • ' c'est donc à l'utilisateur de finir le travail :
  • ' choix éventuel de la pièce jointe et envoi du message.
  • '
  • ' pour automatiser complètement le processus,
  • ' on utilise une méthode un peu simpliste mais efficace :
  • ' simuler l'appui sur les touches à utiliser pour envoyer le message
  • ' à l'aide de l'instruction SendKeys.
  • ' en temporisant les envois successifs de touches, on y arrive très bien
  • '
  • ' Inconvénient de la méthode : chaque logiciel de messagerie utilise ses propres
  • ' menus (donc touches) pour joindre un fichier et envoyer le message
  • ' par exemple : Outlook Express utilise le menu Intsertion (touche : Alt-I)
  • ' puis le sous menu Pièce (touche : P)
  • ' et l'envoi du message se fait par Alt-Entrée
  • '
  • ' pour pallier à cet inconvénient, je propose de stocker dans 2 tableaux
  • ' TouchesPJ() et TouchesEnvoi()
  • ' l'enchaînement de touches à utiliser
  • ' je fournis ici l'initialisation des tableaux pour les 3 clients de messagerie
  • ' dont je dispose sur ma machine :
  • ' Mozilla ThunderBird,
  • ' Outlook Express,
  • ' et Office 2003 Outlook (je ne pense pas que cela change pour les autres versions))
  • ' il suffit donc d'activer l'initialisation qui va bien pour le client utilisé.
  • ' on pourrait aller gratter dans la base de registre de Windows pour le trouver
  • ' mais outre que si on tombe sur un logiciel de messagerie un peu exotique
  • ' et non prévu dans notre liste, on est mal,
  • ' surtout cela compliquerait un programme sans prétention mais qui est simple et accessible à tous
  • '
  • ' Bon, assez parlé, un peu de code maintenant
  • ' ------------------------------------------------------------------
  • Option Explicit
  • ' ------------------------------------------------------------------
  • 'Déclaration des tableaux qui recevront les touches à utiliser suivant
  • ' le logiciel de messagerie par défaut du système.
  • ' Déclarés ici, les tableaux ont une portée qui couvre tout le module
  • Dim TouchesPJ(5) As String, TouchesEnvoi(5) As String
  • ' ------------------------------------------------------------------
  • ' Procédure principale qui compose les éléments du message
  • ' et effectue la demande d'envoi
  • ' c'est cette procédure qui sera appelée par le programme principal (ici Excel)
  • '
  • Sub EnvoiEmail(Adresse As String, Objet As String, Corps As String, Optional PJ As String, Optional Cc As String, Optional Bcc As String, Optional Collage As Boolean)
  • ' Remarques : seuls les arguments : Adresse, Objet et Corps sont obligatoires
  • ' l'argument PJ (pièce jointe) est optionnel. S'il est fourni,
  • ' c'est le chemin complet du fichier à joindre qui doit être fourni
  • ' pour joindre plusieurs pièces,
  • ' il faudrait que PJ soit un tableau et qu'il soit traité + bas par une boucle...
  • ' les arguements Cc (copie) et Bcc (copie cachée) sont également facultatifs
  • ' l'argument Collage permet d'indiquer à la procédure si elle doit coller
  • ' le contenu du presse papier dans le corps du message
  • ' Pour Excel, On peut envoyer une plage de cellule au lieu d'une cellule
  • ' en utilisant dans le programme appelant les fonctions PH() ou PT() fournies + bas
  • '-----------------------------------------------------------------------------
  • ' Quelques exemples d'appel de la procédure EnvoiMail depuis un classeur Excel
  • '
  • ' Envoi simple sans pièce jointe :
  • ' EnvoiMail Range("A1"), Range("A2"), Range("A3")
  • ' Si les cellules sont nommées :
  • ' EnvoiMail Range("Adresse"),Range("Sujet"),Range("Corps")
  • ' Pour envoyer une plage :
  • ' EnvoiMail Range("Adressse"),Range("Sujet"),PT(Range("A3:A10"))
  • ' En utilisant les arguements nommés (c'est le plus clair):
  • ' EnvoiMail Adresse:= Range("A1"), _
  • ' Objet:= Range("A2"), _
  • ' Corps:= PH(Range("A3:A10")), _
  • ' Collage:= True _
  • ' PJ:= Application.Path & "\AJoindre.jpg" _
  • ' Bcc:="zorro@fantomas.com"
  • '--------------------------------------------------------------------------------
  • Dim HyperLien As String ' Reçoit les éléments de l'hyperlien
  • ' composés à partir des arguments fournis à la procédure
  • Dim i As Integer ' un compteur
  • Dim Client As Integer
  • ' la syntaxe de base du mailto est la suivante :
  • ' mailto:dest@domaine.bof?Subject=Le sujet du message _
  • &Body=Le corps du message _
  • &cc=Destinataire copie _
  • &bcc=Destinataire copie cachée
  • HyperLien = "mailto:" & Adresse & "?" ' Le ? introduit les arguments
  • HyperLien = HyperLien & "Subject=" & Objet & "" & Time() & ")"
  • If Not Collage Then ' (en cas de collage, le corps est ajouté juste avant le collage)
  • HyperLien = HyperLien & "&Body=" & Corps ' le & sépare les arguments
  • End If
  • If Cc <> "" Then HyperLien = HyperLien & "&cc=" & Cc
  • If Bcc <> "" Then HyperLien = HyperLien & "&bcc=" & Bcc
  • ' Activation du lien
  • '
  • ActiveWorkbook.FollowHyperlink HyperLien ' Pour Excel (les autres doivent être en commentaire)
  • 'ThisDocument.FollowHyperlink HyperLien ' Pour Word (les autres doivent être en commentaire)
  • 'Application.FollowHyperlink HyperLien ' Pour Access (les autres doivent être en commentaire)
  • Attendre 2 ' Appel d'une procédure qui temporise
  • ' c'est à dire que la procédure courante
  • ' (ici EnvoiMail) est suspendue pendant 5s
  • ' cela permet d'Attendre que le client
  • ' de messagerie soit lancé et prêt
  • ' avant d'envoyer les touches
  • ' sinon ce serait le programme appelant
  • ' (ici Excel) qui recevrait les touches
  • ' A REGLER selon votre config
  • ' l'argument de FollowHyperlink se plante au delà de 817 caractères
  • ' donc pour les long messages, on peut utiliser le copier/coller
  • ' C'est le programme appelant qui effectue le COPIER
  • ' (éventuellement même une copie de cellules en tant qu'image : Selection.CopyPicture)
  • ' la présente procédure se contente de COLLER le contenu du presse-papier
  • ' si l'arguement Collage est à True
  • If Collage Then
  • ' colle puis insère le texte du message au début du message
  • SendKeys "+{INSERT}", True ' collage
  • SendKeys "^{HOME}", True ' début du message
  • SendKeys Corps, True ' envoi du corps du message
  • SendKeys "{Enter}", True ' ligne suivante
  • End If
  • Client = 2 ' 1=Outlook Express
  • ' 2=Mozilla Thunderbird
  • ' 3=Office Outlook
  • ' Suivent des configurations pour d'autres clients de messagerie
  • ' trouvées sur le forum
  • ' 4=Une autre version pour Outlook2003
  • ' 5=Incredimail
  • ' 6=Office Outlook 2007
  • ' 7=...à vous d'ajouter d'autres clients
  • Select Case Client ' appel du chargement des tableaux des touches selon le
  • ' client de messagerie indiqué
  • Case 1
  • OutLookExpress
  • Case 2
  • MozillaThunderbird
  • Case 3
  • Office2003OutLook
  • Case 4
  • Office2003OutLookV2
  • Case 5
  • Incredimail
  • Case 6
  • Office2007OutLook
  • Case 7
  • Office2000OutLook
  • Case Else
  • MsgBox "Aucun client de messagerie connu n'est indiqué"
  • Exit Sub
  • End Select
  • ' Le traitement de la pièce jointe ne s'exécute que si la procédure à reçu qqchose
  • ' dans l'argument PJ (Optional<=>Facultatif)
  • If PJ <> "" Then
  • For i = 1 To TouchesPJ(0) ' dans TouchesPJ(0) on a stocké le nombre de touches
  • ' à envoyer au programme pour joindre une pièce
  • SendKeys TouchesPJ(i), True ' Envoie les touches d'ajout d'1 pièce jointe
  • Attendre 1 ' temporise (à règler éventuellement)
  • Next i
  • SendKeys PJ, True ' A ce stade le programme Attend un nom de fichier
  • ' on lui envoie
  • Attendre 1 ' on temporise
  • SendKeys "{ENTER}", True ' et on valide ce nom de fichier
  • Attendre 1
  • End If
  • For i = 1 To TouchesEnvoi(0)
  • SendKeys TouchesEnvoi(i), True ' on envoie le message
  • Next i
  • End Sub
  • Sub Attendre(Secondes As Integer)
  • ' Cette procédure temporise pendant le nombre de secondes qu'on lui transmet en argument
  • Dim Début As Long, Fin As Long, Chrono As Long
  • Début = Timer
  • Fin = Début + Secondes
  • Do Until Timer >= Fin
  • DoEvents
  • Loop
  • End Sub
  • Sub OutLookExpress()
  • 'Initialisation des tableaux de touches pour Outlook Express
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 2 ' Nombre de touches nécessaires
  • TouchesPJ(1) = "%i" ' Appel du menu Insertion par la touche Alt-i
  • TouchesPJ(2) = "p" ' appel du sous-menu pièce par la touche p
  • ' Pour l'envoi du mail
  • TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "%s" ' Envoi du message avec Alt-s
  • End Sub
  • Sub MozillaThunderbird()
  • 'Initialisation des tableaux de touches pour Mozilla Thunderbird
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 4 ' Nombre de touches nécessaires
  • ' il semble que l'appel par Alt-f du menu fichier ne marche pas
  • ' à tous les coups donc (merci à FRED65200)
  • TouchesPJ(1) = "{F10}" ' Appel des menus par {F10}
  • TouchesPJ(2) = "f" ' Appel du menu Fichier par la touche f
  • TouchesPJ(3) = "j" ' appel du sous-menu Joindre par la touche j
  • TouchesPJ(4) = "f" ' appel du sous-sous-menu Fichier par la touche f
  • ' Pour l'envoi du mail
  • TouchesEnvoi(0) = 4 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "%xf" ' choisit l'expéditeur qui commence par F
  • ' à changer bien sur pour votre cas perso
  • TouchesEnvoi(2) = "^{ENTER}" ' Envoi du message avec Ctrl-Entrée
  • TouchesEnvoi(3) = "{DOWN}" ' Flèche bas pour choisir l'option "Envoyer en HTML seul"
  • ' dans la boite dialogue
  • TouchesEnvoi(4) = "{ENTER}" ' confirmation par Entrée
  • End Sub
  • Sub Office2003OutLook()
  • 'Initialisation des tableaux de touches pour Office Outlook 2003
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 2 ' Nombre de touches nécessaires
  • TouchesPJ(1) = "%i" ' Appel du menu Insertion par la touche Alt-i
  • TouchesPJ(2) = "f" ' appel du sous-menu fichier par la touche f
  • ' Pour l'envoi du mail
  • TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "%v" ' Envoi du message avec Alt-v
  • End Sub
  • '--------------------------------------------------------
  • ' Voici quelques contributions trouvées sur le forum
  • ' pour d'autres logiciels de messagerie
  • ' merci à leurs auteurs
  • ' par contre, je ne les ai pas vérifiés
  • '--------------------------------------------------------
  • Sub Incredimail()
  • ' Contribution de KOLOCO pour Incredimail
  • ' Initialisation des tableaux de touches pour Incrédimail
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 1 ' Nombre de touches nécessaires
  • TouchesPJ(1) = "^+a" 'Appel du menu Insertion Fichier par la touche Ctrl+Shift+A
  • ' Pour l'envoi du mail
  • TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "%s" 'Envoi du message avecAlt-s
  • End Sub
  • Sub Office2003OutLookV2()
  • ' Version corrigée par CLARK1978 à essayer si la version d'origine ne gère pas
  • ' la touche Alt-i correctement
  • ' Initialisation des tableaux de touches pour Office Outlook 2003
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 3 ' Nombre de touches nécessaires
  • TouchesPJ(1) = "%a" 'Appel du menu Insertion par la touche Alt-a (affichage)
  • TouchesPJ(2) = "{RIGHT}" ' puis flèche à droite
  • TouchesPJ(3) = "f" ' appel du sous-menu fichier par la touche f
  • ' Pour l 'envoi du mail
  • TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "%v" ' Envoi du message avecAlt-v
  • End Sub
  • Sub Office2007OutLook()
  • ' Contribution de PC512 pour Office 2007
  • ' Initialisation des tableaux de touches pour Office Outlook 2007
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 2 ' Nombre de touches nécessaires
  • TouchesPJ(1) = "%s" ' Appel du menu Insertion par la touche Alt-i
  • TouchesPJ(2) = "jf" ' appel du sous-menu fichier par la touche f
  • ' Pour l'envoi du mail
  • TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "%v" 'Envoi du message avecAlt-v
  • End Sub
  • Sub Office2000OutLook()
  • ' Contribution de TANATLOC92 pour Office Outlook 2000
  • ' Initialisation des tableaux de touches pour Office Outlook 2000
  • ' Pour une pièce jointe
  • TouchesPJ(0) = 2 ' Nombre de touches nécessaires
  • TouchesPJ(1) = "%i" ' Appel du menu Insertion par la touche Alt-i
  • TouchesPJ(2) = "f" ' appel du sous-menu fichier par la touche f
  • ' Pour l'envoi du mail
  • TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
  • TouchesEnvoi(1) = "^{ENTER}" ' Envoi du message avec Ctrl-Entrée
  • End Sub
  • '----------------------------------------------------------------------------------
  • ' POUR ENVOYER UNE PLAGE DE CELLULES
  • '----------------------------------------------------------------------------------
  • ' Les fonctions qui suivent sont adaptées à Excel
  • ' elles permettent d'envoyer une plage de cellules plutôt qu'une seule cellule
  • ' elles sont utilisées par le PROGRAMME APPELANT pour préparer le corps du message
  • ' ------------------
  • ' avant de le transmettre à la procédure EnvoiMail
  • ' Première Version:
  • ' Transforme une plage en tableau HTML
  • ' (mais votre programme de messagerie risque de vous demander une confirmation
  • ' pour un envoi de message en HTML, ce qui rompt l'automatisme)
  • Function PH(LaPlage As Range) As String
  • ' transforme une plage en tableau HTML
  • Dim l As Long, c As Long
  • PH = "<html><table width='100%'>" 'balises de début du code HTML et de début de table
  • For l = 1 To LaPlage.Rows.Count ' pour chaque ligne de la plage
  • PH = PH & "<tr>" ' balise de début de ligne
  • For c = 1 To LaPlage.Columns.Count 'pour chaque colonne de la ligne
  • ' balise début de colonne + contenu de la cellule + balise fin de colonne
  • PH = PH & "<td>" & LaPlage.Cells(l, c) & "</td>"
  • Next c
  • PH = PH & "</tr>" ' balise fin de ligne
  • Next l
  • PH = PH & "</table></html>" ' balises de fin de table et de fin de code HTML
  • 'MsgBox PH
  • End Function
  • ' Deuxième Version:
  • ' Transforme une plage en texte délimité avec Tabulations
  • Function PT(LaPlage As Range) As String
  • ' transforme une plage en texte avec tabulations et retours ligne
  • Dim l As Long, c As Long
  • PT = ""
  • For l = 1 To LaPlage.Rows.Count
  • For c = 1 To LaPlage.Columns.Count
  • PT = PT & LaPlage.Cells(l, c)
  • If c < LaPlage.Columns.Count Then
  • ' on ajoute une tabulation que si on n'est pas sur la dernière colonne
  • PT = PT & "%09" ' %09 est le code pour la tabulation (vbTab ne fonctionne pas ici)
  • End If
  • Next c
  • PT = PT & "%0A" ' %0A est le code pour le retour ligne (vbCrLf ne fonctionne pas ici)
  • Next l
  • 'MsgBox PT
  • End Function
  • '---------------------------------------------------------------------------
  • 'Autre méthode totalement différente et indépendante mais qui ne fonctionne
  • ' QU'AVEC OUTLOOK. Elle fait appel à la technologie Automation (OLE)
  • ' il faut ajouter la bibliothèque "Microsoft Outlook 11.0 Object Library"
  • ' à votre projet
  • ' son avantage principal : la fenêtre Outlook ne s'ouvre pas !!!
  • ' autre avantage : c'est un peu plus élégant
  • ' (merci à JeanMimi75)
  • ' Pour le programme appelant l'utilisation est identique, il suffit de changer
  • ' le nom de la procédure appelée (EnvoiMailMéthodeOLE au lieu de EnvoiEmail)
  • ' par exemple :
  • ' En utilisant les arguements nommés (c'est le plus clair):
  • ' EnvoiMailMéthodeOLE Adresse:= Range("A1"), _
  • ' Objet:= Range("A2"), _
  • ' Corps:= PH(Range("A3:A10")), _
  • ' PJ:= Application.Path & "\AJoindre.jpg" _
  • ' Bcc:="zorro@fantomas.com"
  • ' Attention avec cette technique, le collage du contenu du presse-papier n'est pas géré
  • '----------------------------------------------------------------------------
  • Sub EnvoiMailMéthodeOLE(Adresse As String, Objet As String, Corps As String, Optional Pièce As String, Optional Cc As String, Optional Bcc As String)
  • Dim MonAppliOutlook As New Outlook.Application
  • Dim MonMail As Outlook.MailItem
  • Dim MaPièce As Outlook.Attachments
  • Set MonMail = MonAppliOutlook.CreateItem(olMailItem)
  • With MonMail
  • '.Display ' retirer le commentaire si vous voulez que le fenêtre Outlook s'affiche
  • .To = Adresse
  • If Not IsNull(Cc) Then .Cc = Cc
  • If Not IsNull(Bcc) Then .Bcc = Bcc
  • .Subject = Objet
  • .Body = Corps
  • If Not IsNull(Pièce) Then
  • Set MaPièce = .Attachments
  • MaPièce.Add Pièce, olByValue
  • End If
  • .Send
  • End With
  • End Sub
'
' Ce module permet l'envoi d'un mail par le logiciel client SMTP par défaut du système
'
' le principe est de créer un lien de type "mailto:"
' et de demander au programme appelant de suivre ce lien
'
' Les arguments Adresse, Objet, Corps et Adresses de copie et de copie cachés sont fournis à la procédure
' qui les utilise pour définir l'hyperlien qui sera activé par la méthode
' FollowHyperLink du classeur actif
'
' le problème est que VB suit le lien
' (ici il lance le programme de messagerie en lui fournissant les infos nécessaires)
' puis se désintéresse du problème
' c'est donc à l'utilisateur de finir le travail :
' choix éventuel de la pièce jointe et envoi du message.
'
' pour automatiser complètement le processus,
' on utilise une méthode un peu simpliste mais efficace :
' simuler l'appui sur les touches à utiliser pour envoyer le message
' à l'aide de l'instruction SendKeys.
' en temporisant les envois successifs de touches, on y arrive très bien
'
' Inconvénient de la méthode : chaque logiciel de messagerie utilise ses propres
' menus (donc touches) pour joindre un fichier et envoyer le message
' par exemple : Outlook Express utilise le menu Intsertion (touche : Alt-I)
' puis le sous menu Pièce (touche : P)
' et l'envoi du message se fait par Alt-Entrée
'
' pour pallier à cet inconvénient, je propose de stocker dans 2 tableaux
' TouchesPJ() et TouchesEnvoi()
' l'enchaînement de touches à utiliser
' je fournis ici l'initialisation des tableaux pour les 3 clients de messagerie
' dont je dispose sur ma machine :
' Mozilla ThunderBird,
' Outlook Express,
' et Office 2003 Outlook (je ne pense pas que cela change pour les autres versions))
' il suffit donc d'activer l'initialisation qui va bien pour le client utilisé.
' on pourrait aller gratter dans la base de registre de Windows pour le trouver
' mais outre que si on tombe sur un logiciel de messagerie un peu exotique
' et non prévu dans notre liste, on est mal,
' surtout cela compliquerait un programme sans prétention mais qui est simple et accessible à tous
'
' Bon, assez parlé, un peu de code maintenant
' ------------------------------------------------------------------
Option Explicit
' ------------------------------------------------------------------
'Déclaration des tableaux qui recevront les touches à utiliser suivant
' le logiciel de messagerie par défaut du système.
' Déclarés ici, les tableaux ont une portée qui couvre tout le module
Dim TouchesPJ(5) As String, TouchesEnvoi(5) As String
' ------------------------------------------------------------------
' Procédure principale qui compose les éléments du message
' et effectue la demande d'envoi
' c'est cette procédure qui sera appelée par le programme principal (ici Excel)
'
Sub EnvoiEmail(Adresse As String, Objet As String, Corps As String, Optional PJ As String, Optional Cc As String, Optional Bcc As String, Optional Collage As Boolean)
' Remarques : seuls les arguments : Adresse, Objet et Corps sont obligatoires
' l'argument PJ (pièce jointe) est optionnel. S'il est fourni,
' c'est le chemin complet du fichier à joindre qui doit être fourni
' pour joindre plusieurs pièces,
' il faudrait que PJ soit un tableau et qu'il soit traité + bas par une boucle...
' les arguements Cc (copie) et Bcc (copie cachée) sont également facultatifs
' l'argument Collage permet d'indiquer à la procédure si elle doit coller
' le contenu du presse papier dans le corps du message
' Pour Excel, On peut envoyer une plage de cellule au lieu d'une cellule
' en utilisant dans le programme appelant les fonctions PH() ou PT() fournies + bas
'-----------------------------------------------------------------------------
' Quelques exemples d'appel de la procédure EnvoiMail depuis un classeur Excel
'
' Envoi simple sans pièce jointe :
' EnvoiMail Range("A1"), Range("A2"), Range("A3")

' Si les cellules sont nommées :
' EnvoiMail Range("Adresse"),Range("Sujet"),Range("Corps")

' Pour envoyer une plage :
' EnvoiMail Range("Adressse"),Range("Sujet"),PT(Range("A3:A10"))

' En utilisant les  arguements nommés (c'est le plus clair):
' EnvoiMail Adresse:= Range("A1"), _
'           Objet:= Range("A2"), _
'           Corps:= PH(Range("A3:A10")), _
'           Collage:= True _
'           PJ:= Application.Path & "\AJoindre.jpg" _
'           Bcc:="zorro@fantomas.com"
'--------------------------------------------------------------------------------
Dim HyperLien As String ' Reçoit les éléments de l'hyperlien
                        ' composés à partir des arguments fournis à la procédure
Dim i As Integer        ' un compteur
Dim Client As Integer
' la syntaxe de base du mailto est la suivante :
' mailto:dest@domaine.bof?Subject=Le sujet du message _
                         &Body=Le corps du message _
                         &cc=Destinataire copie _
                         &bcc=Destinataire copie cachée

HyperLien = "mailto:" & Adresse & "?"       ' Le ? introduit les arguments
HyperLien = HyperLien & "Subject=" & Objet & " (à " & Time() & ")"
If Not Collage Then ' (en cas de collage, le corps est ajouté juste avant le collage)
    HyperLien = HyperLien & "&Body=" & Corps    ' le & sépare les arguments
End If
If Cc <> "" Then HyperLien = HyperLien & "&cc=" & Cc
If Bcc <> "" Then HyperLien = HyperLien & "&bcc=" & Bcc

' Activation du lien
'
ActiveWorkbook.FollowHyperlink HyperLien    ' Pour Excel (les autres doivent être en commentaire)
'ThisDocument.FollowHyperlink HyperLien      ' Pour Word (les autres doivent être en commentaire)
'Application.FollowHyperlink HyperLien       ' Pour Access (les autres doivent être en commentaire)

        
Attendre 2                                  ' Appel d'une procédure qui temporise
                                            ' c'est à dire que la procédure courante
                                            ' (ici EnvoiMail) est suspendue pendant 5s
                                            ' cela permet d'Attendre que le client
                                            ' de messagerie soit lancé et prêt
                                            ' avant d'envoyer les touches
                                            ' sinon ce serait le programme appelant
                                            ' (ici Excel) qui recevrait les touches
                                            ' A REGLER selon votre config
                                            
' l'argument  de FollowHyperlink se plante au delà de 817 caractères
' donc pour les long messages, on peut utiliser le copier/coller
' C'est le programme appelant qui effectue le COPIER
' (éventuellement même une copie de cellules en tant qu'image : Selection.CopyPicture)
' la présente procédure se contente de COLLER le contenu du presse-papier
' si l'arguement Collage est à True
If Collage Then
    ' colle puis insère le texte du message au début du message
    SendKeys "+{INSERT}", True  ' collage
    SendKeys "^{HOME}", True    ' début du message
    SendKeys Corps, True        ' envoi du corps du message
    SendKeys "{Enter}", True    ' ligne suivante
End If
Client = 2  ' 1=Outlook Express
            ' 2=Mozilla Thunderbird
            ' 3=Office Outlook
            ' Suivent des configurations pour d'autres clients de messagerie
            ' trouvées sur le forum
            ' 4=Une autre version pour Outlook2003
            ' 5=Incredimail
            ' 6=Office Outlook 2007
            ' 7=...à vous d'ajouter d'autres clients

Select Case Client      ' appel du chargement des tableaux des touches selon le
                        ' client de messagerie indiqué
    Case 1
        OutLookExpress
    Case 2
        MozillaThunderbird
    Case 3
        Office2003OutLook
    Case 4
        Office2003OutLookV2
    Case 5
        Incredimail
    Case 6
        Office2007OutLook
    Case 7
        Office2000OutLook
    Case Else
        MsgBox "Aucun client de messagerie connu n'est indiqué"
        Exit Sub
End Select

' Le traitement de la pièce jointe ne s'exécute que si la procédure à reçu qqchose
' dans l'argument PJ (Optional<=>Facultatif)

If PJ <> "" Then
    For i = 1 To TouchesPJ(0)   ' dans TouchesPJ(0) on a stocké le nombre de touches
                                ' à envoyer au programme pour joindre une pièce
        SendKeys TouchesPJ(i), True     ' Envoie les touches d'ajout d'1 pièce jointe
        Attendre 1                        ' temporise (à règler éventuellement)
    Next i
    SendKeys PJ, True       ' A ce stade le programme Attend un nom de fichier
                            ' on lui envoie
    Attendre 1                ' on temporise
    SendKeys "{ENTER}", True    ' et on valide ce nom de fichier
    Attendre 1
End If
For i = 1 To TouchesEnvoi(0)
    SendKeys TouchesEnvoi(i), True  ' on envoie le message
Next i
End Sub

Sub Attendre(Secondes As Integer)
' Cette procédure temporise pendant le nombre de secondes qu'on lui transmet en argument
Dim Début As Long, Fin As Long, Chrono As Long
Début = Timer
Fin = Début + Secondes
Do Until Timer >= Fin
    DoEvents
Loop
End Sub


Sub OutLookExpress()
'Initialisation des tableaux de touches pour Outlook Express
    ' Pour une pièce jointe
    TouchesPJ(0) = 2        ' Nombre de touches nécessaires
    TouchesPJ(1) = "%i"     ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "p"      ' appel du sous-menu pièce par la touche p
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%s"  ' Envoi du message avec Alt-s
End Sub

Sub MozillaThunderbird()
'Initialisation des tableaux de touches pour Mozilla Thunderbird
    ' Pour une pièce jointe
    TouchesPJ(0) = 4        ' Nombre de touches nécessaires
    ' il semble que l'appel par Alt-f du menu fichier ne marche pas
    ' à tous les coups donc (merci à FRED65200)
    TouchesPJ(1) = "{F10}"     ' Appel des menus par {F10}
    TouchesPJ(2) = "f"     ' Appel du menu Fichier par la touche f
    TouchesPJ(3) = "j"      ' appel du sous-menu Joindre par la touche j
    TouchesPJ(4) = "f"      ' appel du sous-sous-menu Fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 4             ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%xf"         ' choisit l'expéditeur qui commence par F
                                    ' à changer bien sur pour votre cas perso
    TouchesEnvoi(2) = "^{ENTER}"    ' Envoi du message avec Ctrl-Entrée
    TouchesEnvoi(3) = "{DOWN}"  ' Flèche bas pour choisir l'option "Envoyer en HTML seul"
                                    ' dans la boite dialogue
    TouchesEnvoi(4) = "{ENTER}"     ' confirmation par Entrée
End Sub

Sub Office2003OutLook()
'Initialisation des tableaux de touches pour Office Outlook 2003
    ' Pour une pièce jointe
    TouchesPJ(0) = 2        ' Nombre de touches nécessaires
    TouchesPJ(1) = "%i"     ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "f"      ' appel du sous-menu fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%v"  ' Envoi du message avec Alt-v
End Sub

'--------------------------------------------------------
' Voici quelques contributions trouvées sur le forum
' pour d'autres logiciels de messagerie
' merci à leurs auteurs
' par contre, je ne les ai pas vérifiés
'--------------------------------------------------------

Sub Incredimail()
    ' Contribution de KOLOCO pour Incredimail
    ' Initialisation des tableaux de touches pour Incrédimail
    ' Pour une pièce jointe
    TouchesPJ(0) = 1        ' Nombre de touches nécessaires
    TouchesPJ(1) = "^+a"    'Appel du menu Insertion Fichier par la touche Ctrl+Shift+A
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%s"  'Envoi du message avecAlt-s
End Sub

Sub Office2003OutLookV2()
    ' Version corrigée par CLARK1978 à essayer si la version d'origine ne gère pas
    ' la touche Alt-i correctement
    ' Initialisation des tableaux de touches pour Office Outlook 2003
    ' Pour une pièce jointe
    TouchesPJ(0) = 3            ' Nombre de touches nécessaires
    TouchesPJ(1) = "%a"         'Appel du menu Insertion par la touche Alt-a (affichage)
    TouchesPJ(2) = "{RIGHT}"    ' puis flèche à droite
    TouchesPJ(3) = "f"          ' appel du sous-menu fichier par la touche f
    ' Pour l 'envoi du mail
    TouchesEnvoi(0) = 1         ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%v"      ' Envoi du message avecAlt-v
End Sub

Sub Office2007OutLook()
    ' Contribution de PC512 pour Office 2007
    ' Initialisation des tableaux de touches pour Office Outlook 2007
    ' Pour une pièce jointe
    TouchesPJ(0) = 2        ' Nombre de touches nécessaires
    TouchesPJ(1) = "%s"     ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "jf"     ' appel du sous-menu fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%v"  'Envoi du message avecAlt-v
End Sub

Sub Office2000OutLook()
    ' Contribution de TANATLOC92 pour Office Outlook 2000
    ' Initialisation des tableaux de touches pour Office Outlook 2000
    ' Pour une pièce jointe
    TouchesPJ(0) = 2 ' Nombre de touches nécessaires
    TouchesPJ(1) = "%i" ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "f" ' appel du sous-menu fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^{ENTER}" ' Envoi du message avec Ctrl-Entrée
End Sub
'----------------------------------------------------------------------------------
' POUR ENVOYER UNE PLAGE DE CELLULES
'----------------------------------------------------------------------------------
' Les fonctions qui suivent sont adaptées à Excel
' elles permettent d'envoyer une plage de cellules plutôt qu'une seule cellule
' elles sont utilisées par le PROGRAMME APPELANT pour préparer le corps du message
'                             ------------------
' avant de le transmettre à la procédure EnvoiMail

' Première Version:
' Transforme une plage en tableau HTML
' (mais votre programme de messagerie risque de vous demander une confirmation
'  pour un envoi de message en HTML, ce qui rompt l'automatisme)

Function PH(LaPlage As Range) As String
    ' transforme une plage en tableau HTML
    Dim l As Long, c As Long
    PH = "<html><table width='100%'>" 'balises de début du code HTML et de début de  table
    For l = 1 To LaPlage.Rows.Count   ' pour chaque ligne de la plage
        PH = PH & "<tr>"              ' balise de début de ligne
        For c = 1 To LaPlage.Columns.Count  'pour chaque colonne de la ligne
            ' balise début de colonne +  contenu de la cellule + balise fin de colonne
            PH = PH & "<td>" & LaPlage.Cells(l, c) & "</td>"
        Next c
        PH = PH & "</tr>" ' balise fin de ligne
    Next l
    PH = PH & "</table></html>"  ' balises de fin de table et de fin de code HTML
    'MsgBox PH
End Function

' Deuxième Version:
' Transforme une plage en texte délimité avec Tabulations
Function PT(LaPlage As Range) As String
    ' transforme une plage en texte avec tabulations et retours ligne
    Dim l As Long, c As Long
    PT = ""
    For l = 1 To LaPlage.Rows.Count
        For c = 1 To LaPlage.Columns.Count
            PT = PT & LaPlage.Cells(l, c)
            If c < LaPlage.Columns.Count Then
                ' on ajoute une tabulation que si on n'est pas sur la dernière colonne
                PT = PT & "%09"  ' %09 est le code pour la tabulation (vbTab ne fonctionne pas ici)
            End If
        Next c
        PT = PT & "%0A"  ' %0A est le code pour le retour ligne (vbCrLf ne fonctionne pas ici)
    Next l
    'MsgBox PT
End Function

'---------------------------------------------------------------------------
'Autre méthode totalement différente et indépendante mais qui ne fonctionne
' QU'AVEC OUTLOOK. Elle fait appel à la technologie Automation (OLE)
' il faut ajouter la bibliothèque "Microsoft Outlook 11.0 Object Library"
' à votre projet
' son avantage principal : la fenêtre Outlook ne s'ouvre pas !!!
' autre avantage : c'est un peu plus élégant
' (merci à JeanMimi75)
' Pour le programme appelant l'utilisation est identique, il suffit de changer
' le nom de la procédure appelée (EnvoiMailMéthodeOLE au lieu de EnvoiEmail)
' par exemple :
' En utilisant les  arguements nommés (c'est le plus clair):
' EnvoiMailMéthodeOLE Adresse:= Range("A1"), _
'           Objet:= Range("A2"), _
'           Corps:= PH(Range("A3:A10")), _
'           PJ:= Application.Path & "\AJoindre.jpg" _
'           Bcc:="zorro@fantomas.com"
' Attention avec cette technique, le collage du contenu du presse-papier n'est pas géré
'----------------------------------------------------------------------------
Sub EnvoiMailMéthodeOLE(Adresse As String, Objet As String, Corps As String, Optional Pièce As String, Optional Cc As String, Optional Bcc As String)
    Dim MonAppliOutlook As New Outlook.Application
    Dim MonMail As Outlook.MailItem
    Dim MaPièce As Outlook.Attachments
    Set MonMail = MonAppliOutlook.CreateItem(olMailItem)
    With MonMail
        '.Display ' retirer le commentaire si vous voulez que le fenêtre Outlook s'affiche
        .To = Adresse
        If Not IsNull(Cc) Then .Cc = Cc
        If Not IsNull(Bcc) Then .Bcc = Bcc
        .Subject = Objet
        .Body = Corps
        If Not IsNull(Pièce) Then
            Set MaPièce = .Attachments
            MaPièce.Add Pièce, olByValue
        End If
        .Send
    End With
End Sub

 Conclusion

Placez ce code dans un module de votre document Excel, Word ou Access. Pour l'activation du lien, choisissez votre application (il est fourni ici pour Excel) et choisissez votre client (ici Mozilla ThunderBird). Si vous utilisez un autre logiciel de messagerie lisez les commentaires pour adapter le module à votre cas.

Si ça marche, utilisez le classeur Excel pour m'envoyer un mail ;-)

Si vous utilisez Word ou Access, supprimez les fonctions PH et PT qui ne fonctionnent qu'avec Excel.

Vous pouvez régler les temporisations en fonction de votre machine et de votre logiciel de messagerie

Si vous avez des séquences de touches pour d'autre clients de messagerie, envoyez-les moi que je les ajoute.

Bon codage
Jean

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • Envoi mail depuis Excel.xlsTélécharger ce fichier [Réservé aux membres club]121 856 octets

Télécharger le zip


 Historique

22 mai 2005 20:37:33 :
c'est juste une amélioration de la présentation (lisibilité des commentaires)
24 septembre 2007 13:27:11 :
24 septembre 2007 13:33:50 :
Mise à jour de la procédure d'envoi automatique de mail en VBA (Excel, Word ou Access) pour intégrer d'autres clients de messagerie, l'envoi d'une plage de cellules, la gestion des copies et des copies cachées, l'envoi du contenu du presse-papier
24 septembre 2007 13:40:52 :
Changement de mot clé de rechèrche
16 janvier 2008 12:20:42 :
Mise à jour de la description et ajout d'une nouvelle procédure pour Outlook 2003 qui permet d'éviter l'ouverture de la fenêtre Outlook lors de l'envoi du mail
16 janvier 2008 12:40:53 :
Modification de la description et ajout d'une autre méthode (pour OUTLOOK SEULEMENT)qui évite l'affichage de la fenêtre de messagerie lors de l'envoi du mail
16 janvier 2008 12:52:25 :
Mise d'une ligne inutile en commentaire dans le code (.Display dans la procédure EnvoiMailMéthodeOLE)
08 octobre 2008 02:22:03 :
POUR THUNDERBIRD : J'ai ajouté une touche envoyée par SendKeys qui permet de choisir l'expéditeur du mail dans Thunderbird ainsi qu'une touche {DOWN} qui permet d'imposer un envoi du mail au format HTML quand la boite dialogue demande si on veut envoyer le mail en Texte et HTML, Texte seul ou HTML seul Procédure Sub Thunderbird() ... ' pour l'envoi du mail TouchesEnvoi(0) = 4 ' Nombre de touches nécessaires TouchesEnvoi(1) = "%xf" ' choix expédit. qui commence par F ' à changer bien sur pour votre cas perso TouchesEnvoi(2) = "^{ENTER}" 'Envoi message avec Ctrl-Entrée TouchesEnvoi(3) = "{DOWN}" ' Flèche bas pour choisir 'l'option "Envoyer en HTML seul" ' dans la boite dialogue TouchesEnvoi(4) = "{ENTER}" ' confirmation par Entrée
08 octobre 2008 02:29:56 :
Ajout du choix de l'expéditeur avec Thunderbird Forçage de l'envoi du mail en HTML seul avec Thunderbird Classeur d'exemple amélioré
08 octobre 2008 02:34:13 :
Ajout du choix de l'expéditeur avec Thunderbird Forçage de l'envoi en HTML seul avec Thunderbird Amélioration du classeur exemple fourni
08 octobre 2008 02:36:59 :
Ajout du choix de l'expéditeur avec Thunderbird Forçage de l'envoi du mail en HTML seul avec Thunderbird Amélioration du classeur d'exemple fourni dans le ZIP

 Sources du même auteur

Source avec Zip FONCTION JOURSFÉRIÉS (FIXES ET MOBILES) JUSQU'EN 2030 UTILIS...
Source avec Zip Source avec une capture VBA EXCEL - GESTION DE MENUS CONTEXTUELS (CLIC-DROIT) PRÊTE ...

 Sources de la même categorie

Source avec Zip Source avec une capture METTRE À JOUR MASSIVEMENT L’ACTIVE DIRECTORY par legranche
SUPPRESSION DES DOUBLONS DANS PLAGE EXCEL par ucfoutu
Source avec Zip Source avec une capture SIMULATEUR DE VITESSE. par artgile
Source avec Zip Source avec une capture EDITEUR DE COMANDE VB6 ET VBA EXCEL par artgile
Source avec Zip Source avec une capture VBA EXCEL AFFICHER UN NUANCIER DES COULEURS AFIN DE CHOISIR ... par BILLOTmi

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) ENVOYER DES EMAILS AVEC PIECES JOINTES EN EXÉCUTANT BLAT par mays
Source avec Zip Source avec une capture Source .NET (Dotnet) FICHIERS_CACHÉS_LECTURE_SEULE par Le Pivert
Source avec Zip Source avec une capture DÉMINEUR VBA EXCEL par SylvainDev
Source avec Zip Source avec une capture Source .NET (Dotnet) LISTVIEW_TRI_EXTENSIONS par Le Pivert
Source avec Zip MAILEUR LOTUS AUTOMATIQUE par Sphaxs

Commentaires et avis

Commentaire de Pirotes31 le 26/05/2005 08:45:19

Merci merci merci et encore merci!

Voilà la source que j'attendais depuis tant de temps!
J'ai laissé des messages sur tout un tas de forum sans obtenir aucune réponse et ton code arrive comme par magie!
Il m'a été d'un grand secours.
Je dois souligner le fait qu'il est particulièrement bien commenté et modulable à souhait.
Je t'ai mis 10/10 afin de te prouver ma gratitude car je désespérais de voir un tel code d'envoi de mail automatique.

C super, et encore merci.

Miss P. :-)

Commentaire de papatte62360 le 31/05/2005 09:22:25

impecc!
merki

Commentaire de seanflip le 06/06/2005 17:21:04

Salut papatte62360,
Vraiment un joli code bien expliqué et tout...
Mais j'ai deux problèmes :
-Je voulais le faire marcher sur Mozilla thunderbird, mais rien a faire c toujours outlook express qui s'ouvre,...
-deuxiéme problème surlequel je commence à me tendre, c'est celui des copies du message, j'arrive à accéder à ce champs, mais y vient s'y coller la ligne suivante : "subject=....";
alors ban, c'est vrai qu'il est super ton code, d'ailleurs si je votais je lui mettrais  10 car t'as fait un gros efforts sur les explications et ça c'est super; mais pour ce que je veux en faire, c'est pas le top de ce que devrait être le top.
Bon ben si t'as une idée pour m'aider, tant mieux, sinon tu voulais des remarques sur ton prog, en voila.
salut

Commentaire de nerim le 06/06/2005 23:31:35

Bjr SEANFLIP

En ce qui concerne Thunderbird ou OutLookExpress, tu dois définir thunderbird comme logiciel de messagerie par défaut. Le prg VBA se contente de communiquer les données au client de messagerie PAR DEFAUT du système. Lorsque tu lance (manuellement) Thunderbird il doit te demander si tu veux qu'il devienne ton client mail par défaut

En ce qui concerne les copies. J'ai essayé avec Cc="adresse" ça fonctionne

Cela donne après la ligne 81 :

Hyperlien=Hyperlien & "&Cc=" & VariableAdresse

ou

Hyperlien=Hyperlien & "&Cc=toto@xxx.fr"

Il ne faut pas oublier le & à l'intérieur des "" avant Cc

Essaie ça

JC

Commentaire de seanflip le 07/06/2005 09:49:13

Salut JC,
Merci pour ces précieux conseils, c'est bo ça marche impeccable.
Mais j'ai encore un souci, c'est pour la mise en forme du mail, j'ai essayé <br>, vbCrLf et ch(13)(10), mais y a rien qui fait revenir le prompt à la ligne, tout mon mail est écrit sans saut de ligne.
ça me pose quand même un problème....
Si vous avez des idées merci d'avance

Commentaire de seanflip le 07/06/2005 09:53:38

Salut,
Merci pour ta réponse JC, ça marche impeccable.
Mais j'ai un souci dans la mise en forme du mail, j'arrive pas à revenir à la ligne, j'ai essayé <br>, ch(13)ch10),vbCrLf mais rien à faire ça revient pas a la ligne...
Si vous avez des idées, je suis preneur, merci d'avance
Salut les mecs

Commentaire de nerim le 07/06/2005 10:56:40

Slt SEANFLIP

Va voir dans le code du classeur Excel, c'est utilisé pour lister les taches lignes par lignes

(LeMessage=LeMessage & NbTaches & " : " & Selection.Value & "%0A")

Il faut utiliser 0A en hexa : %0A

Ne me demande pas pourquoi VbCrLf ne fonctionne pas... je ne sais pas

JC

Commentaire de jypandre le 04/08/2005 15:52:38

Bonjour, très bon ton code, j'aurais voulu savoir si c'est possible d'y ajouter une commande (shell ou autre) afin d'y mettre par défaut un papier à lettre... Merci d'avance

Commentaire de dodii le 16/08/2005 18:12:58

bonjour; l'idée de ce code m'a bien plu mais le probleme c'est que je suis vraiment debutant si vous permettez bien de m'expliquer comment faire pour l'executer j'ai recopié le code dans un module excel et apres ?? je suis sur office excel 2003 .

Commentaire de ordino le 14/09/2005 20:21:12

14 sept. 2005
Je te donnes une note de 10/10.
J'ai trouvé ton code par Google. Code simple et efficace.
Merci beaucoup.
ordino

Commentaire de cap34 le 23/09/2005 16:50:38

Merci!
c'est exactement ce que je cherchais (c'est mon chef qui va être content!!)

Chris

Commentaire de jfvernoud le 15/10/2005 19:37:25

Bonjour à tous,

Excellent code mais je rencontre un problème de pièce jointe et ce malgré un paramétrage de la macro pour outlook 2003.

En effet l’envoie automatique se déroule très bien mais aucune pièce jointe n’est insérée en revanche il apparaît dans le corps du message le texte suivant :

Fc :Envoi mail depuis Excel.xls

Ici un petit texte m'indiquant les améliorations, critiques ou autres. Enfin bref un texte pour vérifier qu'il est bien envoyé - (suivant cellule B3)

Adresse : OK envoi et réception en B1
Objet : Ok en B2
Texte : OK en B3
Pièce jointe : c:\Envoi mail depuis Excel.xls en B4 le fichier Envoi mail depuis Excel.xls est bien sous C

Je ne vois pas ou peut être mon erreur.

Merci d’avance de votre aimable réponse,

Cordialement,

JFV

Commentaire de cbr600fs le 24/10/2005 21:17:48

Bonjour,

Je suis également débutante et j'aurai voulu savoir comment indiquer que je veux qu'une partie du corps du message soit en gras ou en couleur rouge. J'arrive à effectuer les sauts de lignes via chr(10) et les retours via chr(13) mais en ce qui concerne Gras/Italique ou changement de couleur c'est une autre histoire...
De l'aide serait la bienvenue.
Merci,
Christelle

Commentaire de nerim le 25/10/2005 23:07:35

Ce n'est pas que je me désinteresse des questions posées mais je n'étais pas revenu sur vbfrance depuis le mois de juin et je viens de les découvrir. Je vais essayer d'y réfléchir mais je ne promets pas une (des) réponse(s) rapide(s) ni même des réponses tout court...

Jean

Commentaire de nerim le 25/10/2005 23:23:07

A l'intention de DODII

Il faut ecrire une procédure (macro) dans le classeur du type

Sub EssaiEnvoi
    dim Adr,Obj,Cps,Pièce
    Adr="toto@adresse.xxx"
    Obj="sujet du message"
    Pièce="c:\.......\MonFichier.jpg"

    EnvoiMail Adr,Obj,Cps,Pièce
End Sub

Et associer cette procédure (macro) EssaiEnvoi à un bouton du classeur par exemple


Vous pouvez en trouver un exemple d'utilisation dans le classeur Excel fourni dans le zip

Bonne utilisation

Jean

Commentaire de PhV42 le 02/11/2005 21:58:25

Merci pour cet excellent bout de code; une fois lancé dans la bonne direction permet de (presque) tout faire; dans mon cas envoi de mails personnalisés contenant un tableau XL, collé comme une image dans le mail ...
Merci !
PhV

Commentaire de dg69 le 25/11/2005 19:54:57

celà a l'air bien et je vais l'essayer.
Les explications sont claires.

Mais est il possible de l'adapter pour que la pièce jointe soit en fait le document sur lequel on travail dans word ou excel

c'est à dire automatiser : fchier/envoyer vers/destinataire du message (en tant que pièces jointe) et compléter automatiquement les champs A:, le message et l'action d'envoyer.
merci

Commentaire de biwann le 29/12/2005 14:29:50

Bravo, très bonne idée le coup du mailto: qui permet de pallier au fait que la methode ActiveDocument.SendMail ne permet pas de spécifier le destinataire ni l'objet directement.

Je l'ai modifié pour prendre le nom du fichier courant directement et pour récupérer des champs de mon document qui me permettent de renseigner l'objet du mail de manière générique (j'utilise ActiveDocument.Fields(1).Result pour le champ 1 par exemple).

Autre remarque : les "Attendre 1" au niveau de la boucle de la piece jointe ne sont pas utiles pour Thunderbird. C'est marrant de voir les menus se dérouler tous seuls pour aller chercher la PJ.

Commentaire de biwann le 29/12/2005 14:32:19

Reponse pour dg69
il suffit simplement de remplacer la ligne  :

SendKeys PJ, True

par :

SendKeys ActiveDocument.FullName, True

Commentaire de dg69 le 29/12/2005 19:48:07

Merci BIWANN,

Mais je n'arrive pas à envoyer le document word sur lequel je travail même en utilisant SendKeys ActiveDocument.FullName, True.

Je n'ai aucune pièce jointe dans mon mail (j'ai outlook 2003).

Commentaire de papillongj le 30/01/2006 20:24:21

Reponse à DG69

Sauve le document actif
ActiveDocument.SaveAs FileName:="c:\temp\nom_fichier.doc"
Puis lance la macro avec en parametre PJ le chemin du fichier enregistré "c:\temp\nom_fichier.doc"

Question :
Tout fonctionne à merveille. Sauf que je souhaite insérer dans le corps du mail un lien vers une page web qui comporte le caractère "&" dans son adresse.
Lorsque je fait:
texte_a_inserer = "toto&&tot"
HyperLien = HyperLien & "&Body=" & texte_a_inserer
Il m'écrit uniquement "toto" et pas le reste

Il interprete le "&" et ne le considère pas comme un caractère à écrire comme du texte dans le mail.
est ce que qqun à une solution?

Merci !!


Commentaire de papillongj le 30/01/2006 20:28:10

Bonjour

pour DG69:
Sauve le document puis envoi le avec en parametre le chemin
ActiveDocument.SaveAs FileName:="c:\temp\document_en_cours.doc"

J'ai une question:
Je souhaite insérer dans le corps du mail une adresse web qui comprend le caractère "&". Le problème c'est qu'il l'interprète et ne le considère pas comme un caractère.

Exemple:
Corps = "tototo&toto"
Il écrit uniquement tototo

Est ce que qqun à une solution?

Merci!!!

Commentaire de papillongj le 31/01/2006 10:26:00



"%26"

http://www.lookuptables.com/

Commentaire de sebosiris le 12/02/2006 20:57:02

Bonjour,

je suis un vrai debutant en matiere de VBA et ce module me parait etre très pratique.
Le problème c'est que sous Word 2000 je n'arrive pas à l'utiliser.
Je souhaiterai envoyer automatiquement le document sur lequel je travaille. Lorsque je crrée une procedure pour appeler ce module, voila ce qui s'affiche dans l'adresse et le sujet : "vrai"

voici la procedure que j'ai placée dans le module du document actif :
Sub EssaiEnvoi
    dim Adr,Obj,Cps,Pièce
    Adr="toto@adresse.xxx"
    Obj="sujet du message"
    Pièce="c:\.......\MonFichier.jpg"

    EnvoiEMail Adresse="adresse desirée", Obj="...",Cps,Pièce
End Sub
Bref cela ne fonctionne pas comme je le voudrai.
De plus je souhaiterai associer cette procedure d'envoi de mail a un bouton de commande "valider" d'un userform mais je ne sais pas faire.

Pourriez vous m'aider svp?
ceci m'aiderai bcp pour mon travail
seb

Commentaire de nerim le 12/03/2006 23:20:27

Pour seb (SEBOSIRIS)

Sub EssaiEnvoi
    dim Adr,Obj,Cps,Pièce
    ' Ces instructions alimentent les variables Adr,Obj et Pièce
    ' qui sont transmises à la procédure EnvoiMail
    Adr="toto@adresse.xxx"
    Obj="sujet du message"
    Pièce="c:\.......\MonFichier.jpg"
    Cps="Ici le corps du message"
    ' et si le corps et trop long, on peut l'aliementer en plusieurs fois :
    Cps=Cps & " la suite du corps" & vbCrLf
    Cps=Cps & " encore une suite après un saut de ligne ajouté par la variable vbCrLf"

    EnvoiEMail Adr, Obj,Cps,Pièce
End Sub

La réaction de vb qui affiche 'vrai' est normale car ce qui est transmis à la procédure
EnvoiMail, ce n'est pas le contenu de Adr mais l'expression : Adr="toto@adresse.xxx"
et cette expression est vraie

Donc, il faut écrire soit

  Adr="toto@adresse.ddd"
  puis
  EnvoiMail Adr

soit directement

  EnvoiMail "toto@adresse.ddd"

idem bien sur pour l'objet, le corps et les pièces jointes

En ce qui concerne l'utilisation du bouton dans un form, il faut placer votre procédure dans la procédure événementielle Click associée au bouton (double click sur le bouton et vb affiche la procédure) :

Sub MonBouton_Click()
    dim Adr,Obj,Cps,Pièce
    ' Ces instructions alimentent les variables Adr,Obj et Pièce
    ' qui sont transmises à la procédure EnvoiMail
    Adr="toto@adresse.xxx"
    Obj="sujet du message"
    Pièce="c:\.......\MonFichier.jpg"
    Cps="Ici le corps du message"
    ' et si le corps et trop long, on peut l'aliementer en plusieurs fois :
    Cps=Cps & " la suite du corps" & vbCrLf
    Cps=Cps & " encore une suite après un saut de ligne ajouté par la variable vbCrLf"

    EnvoiEMail Adr, Obj,Cps,Pièce
End sub

bonne utilisation

Jean

Commentaire de Tanatloc92 le 27/03/2006 11:54:58

Excellent code !

Un petit rajout pour les utilisateurs de Outlook Office 2000, non compatible pour l'envoi (bon, OK, ya pô grande différence...)

Sub Office2000OutLook()
'Initialisation des tableaux de touches pour Office Outlook 2000
    ' Pour une pièce jointe
    TouchesPJ(0) = 2 ' Nombre de touches nécessaires
    TouchesPJ(1) = "%i" ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "f" ' appel du sous-menu fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^{ENTER}" ' Envoi du message avec Ctrl-Entrée
End Sub

Et encore merci nerim ;-)

Commentaire de sanyohan13 le 15/06/2006 09:15:45

salut,
tu n'utilise pas le chrono que tu as mis dans ta partie temporisation???

Commentaire de cyprien35 le 26/06/2006 09:52:28

Bonjour, j'ai un petit problème pour envoyer des é des è et des & (je compose mon mail en HTML, un é=&eacute;)
Quelqu'un aura t-il une solution ?
Merci pour la réponse et pour ce bout de code !

Commentaire de mechive le 12/08/2006 18:35:43

Bonjour, merci pour ce code.
Mais j'aimerais que l'on ne voit pas les fenetres s'ouvrir pour l'envoi du mail.
J'ai essayé de mettre dans le code :
application.screenupdating=false (au début du code)
application.screenupdating=true (à la fin du code)
Mais cela ne fonctionne pas. Auriez-vous une solution ?
Merci

Commentaire de jeanmich33 le 30/08/2006 22:55:04

Excellent l'exploitation du "mail to".

j'ai cependant quelques réserves qui me sont apparues à l'usage:
limitation de l'URL à 1024 octets ce qui ampute largement le corps du message, à moins qu'il me manque des éléments?

D'autre part, j'aimerais connaître l'astuce de  PhV42 pour intégrer un tableau "sous forme d'image" dans le corps du message avec cette même méthode "mailto".

Et enfin, je confirme que %0A ou %0D fonctionnent pour les retours chariot dans le corpus....

valal vala....

Amitiés à tous!
Jean Michel

Commentaire de VraiGligli le 26/09/2006 14:45:46

Ce n'est pas original, mais... merci pour ce code ;-)

J'ai réussi à le faire fonctionner sans connaître VB.

Pour Outlook 2002 utilisant Word comme éditeur de mail, le code pour envoyer le message est Ctrl+Alt+Maj E, soit pour VB : ^%E

Commentaire de Padawan62 le 05/10/2006 15:00:14

Bonjour à tous,

Pour commencer, je précise que je suis plus qu'un novice de VB! J'ai essayé de suivre le fil de ces messages mais ça part un peu dans tous les sens. Est-ce que quelqu'un pourrait m'aider à émerger SVP??? Car je suis complétement perdu!!
En fait, je désire envoyer (avec une messagerie particulière à mon entreprise) le document word sur lequel je travaille en pièce jointe à l'aide d'un bouton.. Quel code dois-je utiliser? il y en a tellement sur cette page.. D'avance merci ,pour toute proposition..
Padawan

Commentaire de nesos le 01/12/2006 21:03:14

Bonjour,
Félicitation pour ce code, cependant j'ai un soucis avec Outlook 2000 et windows xp, j'ai une boite de dialogue qui apparait avec le message suivant : "L'argument de la ligne de commande n'est pas valide. Vérifiez le commutateur que vous utilisez."
C'est quoi un commutateur ? et de quelle ligne de commande s'agit il ?
Merci

Commentaire de nerim le 02/12/2006 22:38:00

Bonjour,

Pour sanyohan13

J'utilise mon Timer Attendre en ligne 93 (Attendre 5 lors de l'appel du client de messagerie)
puis en lignes 128, 132 et 134 pour l'envoi des touches pour les pièces jointes
Normalement, ces trois "Attendre 1" sont inutiles... mais je conseille de les garder (voire même d'augmenter le délai) en phase de mise au point pour bien voir les menus se dérouler et corriger les éventuels appels de touches qui ne fonctionnent pas.

J'avoue que je n'ai pas essayé avec les dernières versions d'Outlook (2002, 2003 et pourquoi pas 2007 version béta)

Jean

Commentaire de chasss75016 le 06/12/2006 12:41:07

Bonjour à tous,

Je suis moi aussi novice en VB... et je me heurte à un problème  sur l'envoi d'e-mails avec pièce jointe sur outlook 2003...
Le code "%i" sensé reproduire l'action Alt+i ne fonctionne pas... Résultat : au lieu d'insérer une pièce jointe à l'e-mail, je me retrouve avec l'insertion dans le corps de texte de la lettre "f" suivie de l'adresse renseignée en B4 sur le fichier excel... Qu'en pensez vous ? Quelle solution potentielle ?

Merci pour votre aide... je ne vois pas trop quoi faire là...

Commentaire de jm_r22000 le 18/12/2006 16:13:31

Bonjour à tous,
J'ai le même souci que CHASSS75016 : pas de pièce jointe avec outlook 2003, la commande Alt+i ne fonctionne pas car le curseur se trouve au niveau du corps du message.
Peut-être qu'il faut rajouter une commande pour placer le curseur dans la sujet du message avant d'attacher la pièce jointe.

Commentaire de clark1978 le 13/02/2007 12:25:54

Bonjour,

ce code et top, il répond à une question que j'ai eu la semaine dernière.
Pour aider chasss75016 et jm_r22000, j'utilise aussi Outlook 2003 et j'ai apporté une petite modif suivante:

Sub Office2003OutLook()
'Initialisation des tableaux de touches pour Office Outlook
    ' Pour une pièce jointe
    TouchesPJ(0) = 3        ' Nombre de touches nécessaires
    TouchesPJ(1) = "%a"     ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "{RIGHT}"      ' appel du sous-menu fichier par la touche f
    TouchesPJ(3) = "f"
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%v"  ' Envoi du message avec Alt-v
End Sub

J'ai remplacé l'envoie de la touche "%i" par l'envoie des touches "%a" et flèche de droite.
En effet le "%i" ouvrait une fenêtre de recherche de contact au lieu du menu Insertion. Surement un bug D'outlook2003.

Encore brevo pour ce code superbement documenté.

Commentaire de seanbat le 15/03/2007 15:03:27

Bonjour,
merci pour ce code vraiment excellent, je l'utilise avec Excel et Outlook 2003, et ca fonctionne très bien.
Le seul problème que je rencontre est que lorsque le mail se compose, il désactive la touche VerrNum et ne la réactive pas.
Je ne sais pas d'ou cela peut venir???

Commentaire de SUMACNAJ le 04/05/2007 09:54:17

Bonjour,

J'aimerais obtenir de l'aide sur l'utilisation de ce code. Mon but est de mettre à disposition un formulaire sous Excel avec des cellules à remplir et des menus déroulants. Une fois que  mon utilisateur aura complété son document, il pourra l'envoyer via le bouton mis à disposition sous Excel vers une adresse mail unique.

Mais je suis novice en VB et j'ai un grand besoin de conseils.

Par avance merci de vos réponses, mon adresse mail est tof.jan@laposte.net

Commentaire de SUMACNAJ le 09/05/2007 11:56:05

Bonjour,

Le code me pose un problème parce que je voudrais pouvoir envoyer plusieurs cellules mais dans le code il est indiqué Range("B3") pour le texte et Range("B4") pour la pièce jointe, moi je voudrais que mon texte aille de Range("B3") à Range("B13"), comment faire ?

Merci de vos réponses et de votre aide.

Commentaire de Crusoe30 le 10/05/2007 21:47:25

Bonjour

Moi j'ai un petit souci, j'utilise Outlook 2003, le code à l'air de bien marcher, le fichier est bien présent dans l'onglet "Elements envoyès" mais je ne recois aucun fichier

Commentaire de Crusoe30 le 11/05/2007 12:46:33

Ouppsssss,

Autant pour moi, tout marche trés bien, simplement les mails sont arrivés aprés avoir posté le mess ci dessus

Par contre je cherche les combinaisons de touches pour utiliser ce programme avec Lotus Notes 4.6...   si quelqu'un les connait ....

Merci

Commentaire de jen2204 le 31/05/2007 13:32:55

Très bon programme !
Je voudrais en plus que les fenêtre ne s'affichent pas lors de l'envoi du message ! est-ce possible ?
Merci d'avance.

Commentaire de nerim le 11/06/2007 11:58:57

Pour SUMACNAJ

Comme dit dans ma réponse à votre mail, l'envoi d'une plage nécessite la mise en forme de cette plage en texte (c'est un texte (String) qu'attend la procédure EnvoiMail). On ne peut se contenter de juxtaposer le contenu de toutes les cellules de la plage, il faut reconstituer le tableau

Deux solutions :

*Transformer la page Excel en tableau HTML (mais votre programme de messagerie risque de vous demander une confirmation pour un envoi de message en HTML, ce qui rompt l'automatisme)

*Transformer la plage Excel en texte avec tabulation entre chaque colonne et retour ligne entre chaque ligne

Voici deux les 2 fonctions qui font cette transformation :

Function PH(LaPlage As Range) As String '(ou Variant si texte de + de 256car)
    ' transforme une plage en tableau HTML
    Dim l As Long, c As Long
    PH = "<html><table width='100%'>" 'balises de début du code HTML et de début de  table
    For l = 1 To LaPlage.Rows.Count   ' pour chaque ligne de la plage
        PH = PH & "<tr>"              ' balise de début de ligne
        For c = 1 To LaPlage.Columns.Count  'pour chaque colonne de la ligne
            ' balise début de colonne +  contenu de la cellule + balise fin de colonne
            PH = PH & "<td>" & LaPlage.Cells(l, c) & "</td>"
        Next c
        PH = PH & "</tr>" ' balise fin de ligne
    Next l
    PH = PH & "</table></html>"  ' balises de fin de table et de fin de code HTML
    'MsgBox PH
End Function

Function PT(LaPlage As Range) As String
    ' transforme une plage en texte avec tabulations et retours ligne
    Dim l As Long, c As Long
    PT = ""
    For l = 1 To LaPlage.Rows.Count
        For c = 1 To LaPlage.Columns.Count
            PT = PT & LaPlage.Cells(l, c)
            If c < LaPlage.Columns.Count Then
                ' on ajoute une tabulation que si on n'est pas sur la dernière colonne
                PT = PT & "%09"  ' %09 est le code pour la tabulation (vbTab ne fonctionne pas ici)
            End If
        Next c
        PT = PT & "%0A"  ' %0A est le code pour le retour ligne (vbCrLf ne fonctionne pas ici)
    Next l
    'MsgBox PT
End Function

Pour utiliser ces fonction, il suffit de modifier l'appel à la procédure EnvoiMail comme suit :
    EnvoiEmail Range("B1"), Range("B2"), PT(Range("B3:B13")), Range("B4")
ou
    EnvoiEmail Range("B1"), Range("B2"), PH(Range("B3:B13")), Range("B4")
au lieu de
    EnvoiEmail Range("B1"), Range("B2"), Range("B3"), Range("B4")

Merci de m'avoir soumis le problème, je vais modifier mon source publié pour intégrer cette possibilité

cordialement

JC

Commentaire de SUMACNAJ le 12/06/2007 08:51:05

Bonjour Nerim,

Merci de votre réponse, je vous fais parvenir par mail le résultat que j'avais obtenu.

Cordialement

CJ

Commentaire de castor750108 le 18/06/2007 18:48:08

Bonjour,

C'est exactement la fonctionalité que je cherchais (en Excel 2002 SP3 et THUNDERBIRD 1.5).

Mis en oeuvre et paramétré en 2h maximum.

Merci

Commentaire de Gorzyneon le 25/06/2007 19:34:27

Bonjour,

comme tout le monde, le code est très bien, mais je voudrais savoir deux choses :

- le mail est-il sensé s'envoyer automatiquement, parce que chez moi l'utilisateur doit quand même appuyer sur la touche "envoyer".. (ça tue le charme :p)
- comment je peux insérer un lien hypertexte dans le corps

Merci beaucoup

Commentaire de Gorzyneon le 26/06/2007 10:40:40

Rectification : pour l'envoi automatique c'est bon c'est juste une questiion de réglage du timer, le temps que le client messagerie s'ouvre, mais pour le lien hypertext par contre je sais pas, si quelqu'un avait un type, ça serait bien vu :)

Commentaire de fred65200 le 01/07/2007 16:35:22

Bonjour et merci pour ce code.
Je m'en sers pour envoyer en pièce jointe une feuille de mon classeur au format pdf.
J'ai eu quelques petits soucis avec Thunderbird (pièce jointe envoyée d'une façon aléatoire, désactivation de la touche VerrNum) j'ai donc remplacé

TouchesPJ(0) = 4 ' Nombre de touches nécessaires
TouchesPJ(1) = "{F10}" ' Appel du menu Fichier par les touches F10 et DOWN
TouchesPJ(2) = "{DOWN}"
TouchesPJ(3) = "j" ' appel du sous-menu Joindre par la touche j
TouchesPJ(4) = "f" ' sous-sous-menu Fichier par la touche f


Je suis sur Excel 2007 et ThunderBird 2.0.0.4

Commentaire de fred65200 le 01/07/2007 17:00:55

Pour  Gorzyneon ,
L'envoi de lien hypertexte type mailto ou http fonctionne.
Je n'ai pas trouvé comment ajouter du "&body" , ni comment afficher "proprement" le "?subject"

Commentaire de fred65200 le 01/07/2007 22:28:13

C'est encore moi
Pour ceux que l'envoi de copie cachée intéresse, il faut utiliser Bcc

HyperLien = "mailto:" & Adresse
HyperLien = HyperLien & "?Cc=copie@xxxxx.com"       ' Copie
HyperLien = HyperLien & "&Bcc=copie_cachée@xxxxx.com"       ' Copie cachée
HyperLien = HyperLien & "&Subject=" & Objet
HyperLien = HyperLien & "&Body=" & Corps
ActiveWorkbook.FollowHyperlink HyperLien

Commentaire de pc152 le 02/08/2007 10:02:47

Petite contribution pour OFFICE 2007

    ' Pour une pièce jointe
    TouchesPJ(0) = 2     ' Nombre de touches nécessaires
    TouchesPJ(1) = "%s"  ' Appel du menu Insertion par la touche Alt-i
    TouchesPJ(2) = "jf"   ' appel du sous-menu fichier par la touche f
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1  ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%v"  ' Envoi du message avec Alt-v

La seul chose qui est domage c'est l'ouverture et la fermeture d'Office Outlook.

Si quelqu'un à une methode pour l'envois de mail depuis excel sans l'ouverture d'outlook.

Merci

Commentaire de Youplabooom le 05/09/2007 18:50:25

Excellent code, bravo et merci.
Petit problème néanmoins pour moi. Le texte de mon mail est très long, et la macro qui fonctionne très bien pour les textes courts se met à bugger. Avez vous une idée de la solution ?

Merci beaucoup

Commentaire de tiph_101 le 10/09/2007 10:17:14

Bonjour,

J'ai le même problème que YOUPLABOOM.

Merci d'avance

Commentaire de Koloco le 14/09/2007 21:27:01

D'abord 2 Mots : GÉNIAL et MERCI (focntione, SANS MODIF,  sur Outlook express et Outlook2003)

J'ai rajouter une messagerie, Incrédimail, voici le code :

Sub Incredimail()
'Initialisation des tableaux de touches pour Incrédimail
    ' Pour une pièce jointe
    TouchesPJ(0) = 1      ' Nombre de touches nécessaires
    TouchesPJ(1) = "^+a"  ' Appel du menu Insertion Fichier par la touche Ctrl+Shift+A

    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 1     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%s"  ' Envoi du message avec Alt-s
End Sub


Commentaire de Koloco le 14/09/2007 21:39:12

Bon maintenant j'ai un problème pour le corps du mail, si quelqu'un à la solution, me la communiquer, SVP - Merci.
Problème :
Dans le coprs du mail, je n'arrive pas à aller à la ligne.
Je voudrai le résultat suivant :
      Ligne1
      Ligne2

          Resultat : Ligne1 (un symbole carré) Ligne2  J'ai utilisé les codes suivants :
   Corps= "Ligne1" & vbCrLf & "Ligne2"  
          Résultat : Ligne1 vbCrLf Ligne2
ou Corps= "Ligne1" & Chr(13) & "Ligne2"
          Résultat : Ligne1 (1 symbole carré) Ligne2
ou Corps= "Ligne1" & Chr(10) & "Ligne2"
          Résultat : Ligne1 (1 symbole carré) Ligne2  
ou Corps= "Ligne1" & Chr(13)+Chr(10) & "Ligne2"
          Résultat : Ligne1 (2 symbole carré) Ligne2  

En utilisant msgbox("Ligne1" & vbCrLf & "Ligne2") j'ai le message correct  cad :  Ligne1
                Ligne2
Ou en mettant Chr(13), Chr(10), etc tout est correct.

Donc cela ne vient pas de vbCrlF ou de Chr(13), Chr(10)

Je suis dans l'impasse...

En attente d'une solution, et encore Merci par avance.


Commentaire de tiph_101 le 17/09/2007 08:18:56

Pour le retour à la ligne, essaie :

Corps = "Ligne1" & "%0A" & "Ligne2" ("%0A" = "%zéroA")

J'avais le même problème et avec "%0A", le retour à la ligne fonctionne.

J'espère que ton problème va être résolu par ce biais.

Commentaire de Koloco le 17/09/2007 20:59:06

OUI, mon problème est parfaitement résolu avec "%0A", le retour à la ligne fonctionne dans le corpsdu mail.

MERCI BEAUCOUP.

Commentaire de Koloco le 19/09/2007 22:13:05

Bonjour,
j'ai un souci en essayant d'envoyer plusieurs adresses en "Bcc".
Il ne me prend que la première et les N autres il les met dans mailto.

Mon code :
HyperLien = "mailto:" & "my.adress@chezmoi.fr" & "?"

HyperLien = HyperLien & "Subject=" & Objet
HyperLien = HyperLien & "&Body=" & Corps
HyperLien = HyperLien & "&Bcc=" & LesAutresAdresses

ActiveWorkbook.FollowHyperlink HyperLien

Avec LesAutresAdresses=adress1@toto.com;adress2@toto.com;adress3@toto.com;

Résultats :
"A"   : my.adress@chezmoi.fr;adress2@toto.com;adress3@toto.com
"Bcc" : adress1@toto.com

Si quelqu'un a déjà rencontré ce problème et a la solution, merci pour l'aide.

Commentaire de Koloco le 20/09/2007 11:01:29

Bonjour,
pour compléter le message du dessus, les tests en "Bcc" ont été faits pour "incredimail".
Je viens d'effectuer ces mêmes tests avec Office2003Outlok et là cela fonctionne parfaitement.

Désolé, si j'ai fait chercher quelqu'un et merci.

Commentaire de tizamourine le 20/09/2007 15:16:21

Bonjour,
Je suis un nouveau venu dans le monde VBA, le code est super et répond parfaitement à mon besoin à part que la pièce jointe n'arrive pas à être ajouté au mail. Je m'explique, je suis sur outlook office 2003, sans pièce jointe le mail part très bien. Par contre, quand j'ajoute une pièce jointe, la fenêtre d'insertion de pièce s'ouvre, puis le lien est saisi la pièce jointe apparait mais après il ne se passe plus rien. Même si j'appuie sur enter avec la souris ca ne fonctionne pas, il faut que je sélectionne la PJ avec la souris et ENTER.
Est ce que quelqu'un aurait une solution à mon problème ?
Merci d'avance.

Commentaire de Koloco le 21/09/2007 13:01:20

Bonjour,

savez-vous s'il est possible de mettre un autre expéditeur que celui par défaut ?

Si OUI, avez-vous le code ?

Merci beaucoup.

Commentaire de fred65200 le 21/09/2007 21:27:07

Bonsoir,
Pour répondre à Koloco
HyperLien = HyperLien & "&Reply-To=reponse@XXXX.com" fonctionne avec Office 2007 et Thunderebird

@+

Commentaire de Koloco le 21/09/2007 22:31:08

Bonsoir,
tout d'abord merci pour votre réponse qui est correcte pour monmessage.
Mais je me suis mal exprimé (mes excuses).
Dans Thunderbird j'ai plusieurs compte de messagerie 4 pour la famille) et 1 pour une association.
Le soft donné Tout en haut (GENIAL au passage) permet de démarrer la messagerie utilisé par défaut (c'est le but) et aussi sur le compte de messagerie par défaut (le mien personnel). Je voulais que ce soft permette de choisir le compte de l'association au démarrage.
J'ai trouvé une astuce qui est pour Thunderbird donné dans le code suivant :
Sub Ouvrir_MozillaThunderbird()
'Initialisation des tableaux de touches pour Mozilla Thunderbird
    ' Pour une pièce jointe {DOWN}
    TouchesPJ(0) = 5         ' Nombre de touches nécessaires
    TouchesPJ(1) = "%x"      ' Se positionne dans la fenêtre expéditeur (le
                             ' compte par défaut) par la touche Alt-x
    TouchesPJ(2) = "{DOWN}"  ' Passe au compte de messagerie suivant (flèche vers le bas)
    TouchesPJ(3) = "{DOWN}"  ' Passe au compte de messagerie suivant (flèche vers le bas)
    TouchesPJ(4) = "{DOWN}"  ' Passe au compte de messagerie suivant (flèche vers le bas)
    TouchesPJ(5) = "{DOWN}"  ' Passe au compte de messagerie suivant (flèche vers le bas) (je m'arrête car je suis sur le bon compte)
End Sub

En descendant de N Flèches, j'accède au compte de messagerie de l'association (ce n'est peut-être pas très beau, mais c'est efficace) et répond parfaitement à mon besoin.

Cordialement.

Commentaire de fred65200 le 21/09/2007 23:22:34

Bonsoir Koloco
Ma réponse de toute façon ne fonctionne pas! Je me suis quelque peu embrouillé dans mes test.
Votre solution fonctionne et je n'est pas trouvé mieux, siu ce n'est t'envoyer la touche de la première lettre du compte plutôt que des {DOWN} consécutifs

SendKeys "%xt", True pour sélectionner le premier compte qui commence par "T" test@xxxx.com
ou
SendKeys "%x{f 3}", True ' le 3ème compte qui commence par "F"
ou
SendKeys "%x{DOWN 4}", True  ' pour atteindre le 4ème compte

Salutations

Commentaire de fred65200 le 21/09/2007 23:25:21

La même sans les fautes

Bonsoir Koloco
Ma réponse de toute façon ne fonctionne pas! Je me suis quelque peu embrouillé dans mes tests.
Votre solution fonctionne et je n’ai pas trouvé mieux, su ce n'est d'envoyer la touche de la première lettre du compte plutôt que des {DOWN} consécutifs

SendKeys "%xt", True pour sélectionner le premier compte qui commence par "T" test@xxxx.com
ou
SendKeys "%x{f 3}", True ' le 3ème compte qui commence par "F"
ou
SendKeys "%x{DOWN 4}", True  ' pour atteindre le 4ème compte

Salutations

Commentaire de fred65200 le 21/09/2007 23:26:37

Presque
je vais me coucher!!

Commentaire de Koloco le 22/09/2007 13:36:00

Bonjour,
je viens de prendre en compte votre solution (SendKeys "%xt",)
et elle fonctionne parfaitement.

Je lui ai donné les 4 premières lettres du compte (fjep-...)
SendKeys "%xfjep" et cela fonctionne parfaitement.

VBA me sort une erreur en rajoutant True ? (mais cela fonctionne sans.

GRAND MERCI, parce que cela évite de toucher au code en cas de rajout de compte de messagerie.

Salutations.

Commentaire de nerim le 23/09/2007 10:44:23

Pour Youplaboum et Tiph_1001

Bonjour,

En effet, le type de variable déclaré dans la procédure Sub EnvoiMail pour l'argument Corps est String et sa taille est limitée à 256 caractères.

Il faudrait essayer de déclarer en Variant comme ceci :

Sub EnvoiEmail(Adresse As String, Objet As String, Corps As Variant, Optional PJ As String)

A vérifier.

Plus généralement : quand j'ai écrit ce code (il y a + de 2 ans) j'avais hésité à utiliser le Copier/Coller pour constituer le corps du message, mais comme au départ, il ne s'agissait que d'envoyer un petit texte, j'avais retenu la solution la plus simple.

Depuis j'ai fait une petite adaptation pour joindre des données présentées en tableau (cf mon commentaire du 11/06/2007). Et depuis, je me dis qu'il faudrait que j'essaie cette technique du copier/coller qui  permettrait d'envoyer n'importe quoi dans le corps du message. Il ne faut pas oublier que l'on peut déjà envoyer à peu près n'importe quoi en utilisant une pièce jointe.

Cordialement
JC

Commentaire de fred65200 le 23/09/2007 13:51:26

bonjour,
pour les corps de message trop long,
j'utilise une image du texte


  ActiveWorkbook.Worksheets("test").Activate
'on mémorise si le quadrillage est affiché
  DG = ActiveWindow.DisplayGridlines
'on enlève le quadrillage
  ActiveWindow.DisplayGridlines = False
'Copie, en tant qu'image, les cellules sélectionnées dans la feuille.
  Range("A1:G44").CopyPicture
'on colle
  ActiveSheet.Paste
'on recopie dans le presse papier
  Selection.Copy
'on supprime l'image temporaire
  Selection.Delete
'on rétablie le quadrillage comme à l'origine
  ActiveWindow.DisplayGridlines = DG


HyperLien = "mailto:" & "adresse1@xxxxx.com" & "?"      
HyperLien = HyperLien & "BCC=adressebcc@xxxxx.com"
HyperLien = HyperLien & "&Subject=" & Sujet  
'HyperLien = HyperLien & "&Body=" & Corps
ActiveWorkbook.FollowHyperlink HyperLien
Attendre 2
on colle avec shift + insert
SendKeys "+{INSERT}", True

salutations

Commentaire de nerim le 24/09/2007 10:02:11

Bonjour,

Autant pour moi : Il faut bien garder l'argument Corps en String car la méthode FollowHyperlink attend un argument String.

D'autre part le type String peut recevoir jusqu'à 2^31 (2 milliards) caractères.

Par contre la méthode FollowHyperlink bloque à partir de 818 caractère (pourquoi à 817 ça passe ??? drôle de limitation) pour l'ensemble de l'adresse (mailto+subject+body....)

Donc au delà de cette limite, utiliser le copier coller comme l'indique FRED65200

Cordialement
JC

Commentaire de mdelph le 26/09/2007 18:13:00

boujour à tous,

vba excel et pièces jointes dans outlok 2003, hé bien ça marche pas , même en reprenant les codes existant. Les pièces jointes n'apparaissent pas.

Merci

Commentaire de ancestrix le 09/10/2007 12:11:15 10/10

Bravo et merci pour ce très bon code qui me dépanne beaucoup.

Je vais devoir l'utiliser avec 'lotus'
Savez-vous si un amateur a communiqué la solution ?

merci

Commentaire de nerim le 10/10/2007 10:59:54

Bonjour

Pour MDELPH : Je manque un peu de précisions sur le bug. Voyez-vous les simulations des touches se faire ? Et si oui avez-vous repéré celle(s) qui ne fonctionne(nt) pas ? Pour bien voir ce qui se passe, vous pouvez allonger les temps de pause entre l'envoi de chaque touche avec Attendre 2 (ou plus)...

Pour ANCESTRIX : Hélas je n'ai pas vu trace d'infos sur lotus. Mais vous pouvez trouver tout seul en notant les touches à utiliser pour envoyer un message déjà composé (puisque la composition est assurée par le code). Généralement cela commence par l'activation d'un menu par Alt+une touche...
Vous faites la même chose pour l'envoi d'une pièce jointe
vous ajoutez une procédure dans le code sur le modèle des autres
vous ajoutez l'appel à cette procédure dans le SELECT CASE avec un Case 8 (par exemple)
Vous positionnez la variable Client=8

Si ça marche, pensez à me communiquer le résultat de vos recherches en indiquant bien la version de lotus utilisée

Cordialement
JC

Commentaire de maingu64 le 19/11/2007 17:04:40

Bonjour,

Je vais également utilisé ce code sous lotus pour envoyer un mail à partir d'un bouton de commande.
Le bouton de commande est situé dans une userform d'un fichier excel comportant 5 feuilles. Est-il possible de joindre une seule feuille de ce fichier dans le mail, et non le fichier complet.
Ce code permet-il d'envoyer un mail automatiquement, à partir de plusieurs ordinateurs dont l'utilisateur n'est pas le même (émetteur différent).
Merci de votre réponse.

Mickael.

Commentaire de nerim le 22/11/2007 21:07:35

Bonjour Mickael (MAINGU64),

Pour n'envoyer qu'une feuille :
Une feuille n'est pas un document (au sens windows du terme, donc un fichier sur le disque) et ne peut donc pas être une pièce jointe. Par contre, vous pouvez envoyer un classeur qui ne contient que cette feuille.

Pour cela je vous suggère

-de copier la feuille voulue dans un nouveau classeur,
-d'enregistrer ce classeur,
-de l'envoyer
-puis de supprimer le fichier ainsi créé...

mais tout cela en VB bien sur. avec un code du genre:

Sheets("Feuille à envoyer").Copy ' sans destination du type Before ou After,
' Excel copie la feuille dans un nouveau classeur
' et active ce dernier
ActiveWorkBook.SaveAs Filename:="D:\Mes Documents\Classeur à Envoyer.xls" ' enregistre le classeur qui ne contient que la feuille à envoyer
ActiveWindow.Close ' ferme le classeur
' Appel la procédure d'envoi de mail
EnvoiEmail "adresse1@xx.com,adresse2@xx.com", _
"Voici le document....", _
"le texte du message",  _
"D:\Mes Documents\Classeur à Envoyer.xls"
Kill "D:\Mes Documents\Classeur à envoyer.xls" ' Efface le classeur envoyé du disque !!!


Les noms des différents déstinataires sont séparés par des virgules
L'instruction Kill supprime le fichier sur le disque (attention, pas de demande confirmation et PAS DE CORBEILLE : suppression directe)

Je ne pense pas que l'usage de cette procédure par plusieurs personnes sur un réseau pose de problème car chaque application Excel dialogue avec le client de messagerie du poste ou de l'utilisateur de la session

cordialement
JC

Commentaire de BERU80 le 28/11/2007 17:39:55 9/10

bon code après plusieurs essais pas de problèmes particuliers 9/10

Commentaire de swyss le 02/12/2007 14:34:43

Bonjour,

J'ai bien essayé votre code (envoi automatique d'un mail avec pièce jointe ) et il marche très bien en exécution directe. Hélas, mon problème est le suivant: Si j'essaye de mettre mon Excel qui contient le code dans les "scheduled tasks", le code se déroule an arrière plan. L'excel s'ouvre, l'OutlookExpress s'ouvre également (visible dans le task manager), mais la suite ne se fait plus. Je présume que les commandes "SendKeys" ne fonctione pas et ainsi la suite ne se fait plus. Est-ce quelqu'un a déjà vu ce problème et ev. une solution à ce problème?

Merci d'avance
Sandro

Commentaire de lmet35 le 31/12/2007 15:14:11 10/10

En effet, simple et efficace!
Je sens que mes chers utilisateurs vont en faire la pub autour d'eux et que je devrais mettre cette fonctionnalité dans beaucoup de mes bases (Dvpt sous Access).

Chapeau Bas...

LM

Commentaire de JeanMimi75 le 12/01/2008 09:34:10 8/10

Super documenté . . . . . Bravo !
je souhaite l'utiliser avec ACCESS, et là petit problème :
les arguments passés par la variable "HyperLien" dans la commande commande  "Application.FollowHyperlink HyperLien" se retrouve tous dans la ligne "Adresse" de OutLook .

Qu'ai-je fait de pas bien ? ? ? ?

S'il vous plait aidez moi ..

Commentaire de nerim le 12/01/2008 12:02:06

Pour JeanMimi75

Essayez de faire un 'MsgBox Hyperlien' avant l'instruction 'Application.FollowHyperlink HyperLien' et faites une capture d'écran du message affiché pour me l'envoyer.
(Vous pouvez aussi faire un 'Debug.Print Hyperlien' et copier ce qui s'affiche dans la fenêtre de débugage)

Normalement, c'est le point d'interrogation qui introduit les arguments du MailTo

Je viens de faire un essai avec un copier coller du code publié ci-dessus dans une mini appli access et ça marche tel quel sans changer une ligne de code (il faut tout de même supprimer les fonctions PH et PT qui ne fonctionnent qu'avec Excel).

Envoyez moi votre adresse mail et je vous envoie la mini base access pour que vous puissiez comparer (j'utilise Access 2003, dites moi si je dois vous l'envoyer dans une version antérieure)

Cordialement
Jean

Commentaire de nerim le 16/01/2008 11:43:52

Suite à quelques échanges fructueux avec JeanMimi75 j'indique ici une méthode (trouvée par JeanMimi sur VBFrance) qui fonctionne avec OutLook. J'y ai ajouté la gestion des pièces jointes.

Son avantage est que cette technique n'affiche pas la fenêtre Outlook lors de l'envoi et qu'elle est tout de même plus élégante.

Elle utilise la technologie Automation (OLE) et nécessite donc d'ajouter la référence "Microsoft Outlook 11.0 Object Library" au projet VBA (Menu Outils-Réferences).

Sub EnvoiMailMéthodeOLE(Adresse As String, Objet As String, Corps As String, Optional Pièce As String, Optional Cc As String, Optional Bcc As String)
    Dim MonAppliOutlook As New Outlook.Application
    Dim MonMail As Outlook.MailItem
    Dim MaPièce As Outlook.Attachments
    Set MonMail = MonAppliOutlook.CreateItem(olMailItem)
    With MonMail
        .To = Adresse
        If Not IsNull(Cc) Then .Cc = Cc
        If Not IsNull(Bcc) Then .Bcc = Bcc
        .Subject = Objet
        .Body = Corps
        If Not IsNull(Pièce) Then
            Set MaPièce = .Attachments
            MaPièce.Add Pièce, olByValue
        End If
        .Send
    End With
End Sub

Commentaire de nerim le 16/01/2008 13:09:19

Suite du message précédent

Un inconvénient avec cette méthode est que les paramètres de sécurité d'Outlook provoquent l'affichage d'un message indiquant qu'une application essai d'envoyer une mail à l'insu de votre plein gré et que cela rompt l'automatisme.

Moralité : si vous voulez écrire un macro virus, utilisez plutôt la méthode FollowHyperLink... ;-)

Commentaire de samylatortue le 21/01/2008 09:24:45

Salut,
Excelente source je susi entrain de l'analyser pour faire qqche des symilaire dans une gestion client Acces.
Est il possible de faire des envoie en se passant d'un client mail ? je sais que ce n'est pas l'objectif de la source qui se veux simple mais je suis entrain de chercher tu coté d'un serveur SMTP en vba si qqun a déjà fait des recherche dans ce sens dites moi.
j'aimerai que le programe soit utilisable sur des ordi n'ayant pas paramétrer de client mail.
++ encore merci pour la source

Commentaire de misfit le 28/01/2008 11:45:26

Bonjour,

Cela faisait quelques temps que j'utilisais ce source et tout fonctionnait bien (j'avais Excel 2002 et outlook express 6). Je viens de passer sous Excel 2003 et ça ne marche plus : la pièce jointe n'est pas insérée (le mail est lui bien envoyé).
Quelqu'un a t'il la solution
Merci d'avance

Commentaire de fred65200 le 30/01/2008 10:06:12

Bonjour MisFit,

je crois que les raccourcis clavier entre les différentes versions d'excel et d'outlook ont changés, fais des tests manuellement et corrige dans la macro

# Sub Office2003OutLookV2()
# ' Version corrigée par CLARK1978 à essayer si la version d'origine ne gère pas
# ' la touche Alt-i correctement
# ' Initialisation des tableaux de touches pour Office Outlook 2003
# ' Pour une pièce jointe
# TouchesPJ(0) = 3 ' Nombre de touches nécessaires
# TouchesPJ(1) = "%a" 'Appel du menu Insertion par la touche Alt-a (affichage)
# TouchesPJ(2) = "{RIGHT}" ' puis flèche à droite
# TouchesPJ(3) = "f" ' appel du sous-menu fichier par la touche f
# ' Pour l 'envoi du mail
# TouchesEnvoi(0) = 1 ' Nombre de touches nécessaires
# TouchesEnvoi(1) = "%v" ' Envoi du message avecAlt-v
# End Sub

cordialement

Commentaire de misfit le 30/01/2008 12:05:05

Bonjour,
Tout d'abord merci pour ta réponse.
J'ai déjà regardé ça directement dans OE(les raccourcis sont Alt i puis p). Mais que ce soit avec les sub OfficeOutlook, Office2003Outlook ou Office2003OutlookV2 cela ne marche pas. En fait, tout va bien jusqu'à la ligne 133 (OE s'ouvre, un nouveau message est créé, le destinataire, le corps du message et l'objet apparaissent bien. C'est après qu'OE perd la main (comme si les sendkeys étaient envoyés à Excel). J'ai beau allonger la durée de la tempo cela ne change rien.
J'ai refait des essais sur un autre poste avec Excel 2002 (les versions d'OE sont les mêmes sur les 2 postes) et là ça marche. J'en déduit que c'est Excel 2003 qui provoque l'erreur

Cordialement

Commentaire de nerim le 30/01/2008 12:19:49

Bonjour,

Vous pouvez essayer avec la procédure EnvoiMailMéthodeOLE donnée en fin de code. Si vous avez téléchargé le code avant le 16/01/2008, cette partie n'y figurait pas, vous devrez l'ajouter.

Pensez à ajouter la bibliothèque "Microsoft Outlook 11.0 Object Library".

Ceci dit, c'est bizarre que cela ne fonctionne pas. J'utilise personnellement Excel 2003 et Outlook 2003 et je n'ai pas de pb

Cordialement

Commentaire de nerim le 30/01/2008 12:22:16

Re bonjour,

suite du message précédent

Attention, cette procédure ne fonctionne qu'avec Outlook et non pas avec Outlook Express

Cordialement

Commentaire de ezmou le 11/02/2008 12:18:55 10/10

Bonjour !!

Merci Beaucoup
Marche impécable

Utilisation : Formulaire ACCESS VBA + Outlook 2007

Je reviens vers vous concernant la mise en forme du su corps de l'email

En effet, j'aimerais mettre dans le corps du HTML,

Cependant je ne sais comment faire pour modifier le HTMLBODY

Avez vous une solution ou une idée?

Merci d'avance de votre aide

Commentaire de nerim le 11/02/2008 13:45:33

Pour EZMOU

Bonjour,

Voici une procédure que j'utilise dans Access pour envoyer un mail en HTML à partir d'un formulaire. Vous pouvez vous en inspirer.

(T0, T1 ...T7, Perso, signature, Nom, Ps, SMail et Objet sont des contrôles de mon formulaire)

Sub EnvoiUn()
    Dim Corps As Variant, c As String
    c = "<br><br>"
    Corps = "<html><head><title></title></head><body bgcolor=""#FFFFE0"">"
    Corps = Corps & "<div align=""justify""><font face=""Verdana, Arial, Helvetica"" size=""-1"">"
    Corps = Corps & T0 & c & T1.Caption & c & T2.Caption _
            & c & T3.Caption & c & T4.Caption & c _
            & T5.Caption & c & T6.Caption & c & T7.Caption & c _
            & IIf(Perso <> "", "<font color=""#0000A0""><i><u>Message personnel</u> : " & Perso & "</i></font>", "") _
            & c & Signature.Caption & c & PS.Caption _
            & "<a HREF=""mailto:suivi@pro-forma.fr?Subject=Demande d'effacement de la base de données de la part de " _
            & Nom & """>lien</a> et d'envoyer le message généré."
    Corps = Corps & "</font></div></body></html>"
    If Simulation Then
        DoCmd.SendObject , , acFormatHTML, "suivi@pro-forma.fr", , "suivi-mails@pro-forma.fr", Objet, Corps, False
    Else
        DoCmd.SendObject , , acFormatHTML, SMail, , "suivi-mails@pro-forma.fr", Objet, Corps, False
    End If
End Sub

En réalité, ici, je n'utilise pas la procédure publiée dans VBFrance car je n'ai pas besoin de pièce jointe. J'utilise plus simplement DoCmd.SendObject. Mais le principe de la composition du corps reste le même.

Vous pouvez aussi vous inspirer de la fonction PH qui figure dans le code publié(dans la partie 'Pour envoyer une plage de cellules'). Cette fonction (utilisable telle quelle uniquement dans Excel) génère un message en HTML très simplifié ( juste une balise <html> et une balise <table>) mais ça marche

Cordialement

Jean

Commentaire de ezmou le 11/02/2008 15:30:16

Merci Beaucoup de ta réponse
je vais tester cela et te tiens informer

Commentaire de Smay59 le 13/05/2008 14:33:22

Bonjour,

Je trouve se code très complet. Cependant, j'ai un soussi. J'utilise ce code sous excel. Dans une de mes colones, il y a différentes adresse mail, une seul par ligne. Je souhaite envoyer a cette adresse des information de la ligne correspondante, sachant qu'il peut y avoir plusieurs envoies à différentes adresses, avec des informations différente.
Est-ce possible?
J'espère avoir été assez claire et comprehensible à la lecture.
ps : je suis novice en VBA

Cordialement

Commentaire de nerim le 14/05/2008 16:19:54

Bonjour Smay59,

Si vous êtes novice en VBA, cela peut ne pas être facile.

Une piste peut-être

Soit une plage en colonne A avec le texte à envoyer
une plage en colonne B avec les adresses mail en face
une plage en colonne C avec le chemin de la pièce jointe à envoyer

    A                  B                         C
1  Texte 1          adresse1@xxx     C:\Mes Documents\toto1.jpg
2  Texte 2          adresse2@xxx     C:\Mes Documents\toto2.jpg
3  Texte 3          adresse1@xxx     C:\Mes Documents\toto3.txt
etc...

un code du genre :

Range("A1").Select
Do Until IsEmpty(ActiveCell)
    EnvoiMail ActiveCell,"Objet du message",ActiveCell.Offset(0,1),ActiveCell.Offset(0,2)
Loop

devrait fonctionner

Cordialement

Jean

Commentaire de Smay59 le 16/05/2008 11:48:53

Bonjour Nerim,

Merci pour ta réponce rapide.
J'ai utilisé ton code et deux problème se pose.
Le destinataire n'est pas la bonne colone (j'ai changer ActiveCell.Offset)
L'E-mail doit etre envoyer sous certaine conditions, comme dans le fichier téléchargeable, et la il envoie tous le tableau.
Merci encore, ca m'as bien fait avencer

Cordialement

Commentaire de LUD734 le 09/07/2008 10:53:23

Bonjour,
Tout d'abord un grand merci pour ce code, il est complet et tourne impeccablement pour Access 2003 et Outlook 2003.
Etant en train de monter une Bdd pour des utilisateurs ne connaissant pas Access et VBA, je souhaiterais pouvoir modifier les différents arguments.
Je m'explique: Le code ne fonctionne que pour des destinataires prédéfinis dans le code même sous Access. Même en utilisant un InputBox, il faut toujours taper les adresses. J'aimerais que la fonction vienne chercher les adresses dans une table liée au form.
Gain de temps pour moi, et surtout, interface utilisable pour les néophytes qui ne savent pas quoi modifier dans le code. Car les destinataires changent très souvent.
Même chose pour la pièce jointe: je souhaite envoyer un état converti en PDF (l'automatisation étant inexistante sous Access 2003, je suis obligé de passer par un code qui enregistre l'état sous PDF -_-), mais l'état change à chaque fois: peut-on programmer un code qui ouvre un explorateur de fichier (type treeview) et sélectionne la pièce jointe?
Bref, une fenêtre qui fonctionne comme un logiciel de messagerie et où on n'aurait pas à taper manuellement le chemin d'accès du fichier joint.

Merci d'avance

LUD734

Commentaire de Koloco le 09/07/2008 20:19:39

Bonjour,

j'ai récupéré et adapté un code qui répond à ce tu attends.

C'est l'appel de la function FileOpen qui fait tout le travail.

La recopier sans rien changer.

En espérant que cela réponde à ta demande.

Cordialement.

Private Sub CheckBox_PièceJointe_Click()
    If CheckBox_PièceJointe.Value = True Then
        Dim Tab_PJ(9) As String
        Worksheets("Pilotage").Range("Trait_Envoi_PJ").Value = "Oui"
        FileOpen
        Call RechercheNomsPJ(Tab_PJ)  'Ss-prg qui récupère les noms de Fichiers sélectionnés
        Noms_PJ = ""
        For I = 0 To 9
            If Tab_PJ(I) <> "" Then
                i_long = Len(Tab_PJ(I))
                For J = i_long To 1 Step -1
                    If Mid(Tab_PJ(I), J, 1) = "\" Then
                        Noms_PJ = Noms_PJ & Mid(Tab_PJ(I), J + 1, i_long) & " | "
                        J = 2
                    End If
                Next J
            Else
                I = 9
            End If
        Next I
        TextBox_PJ.Value = Noms_PJ
    Else
        Worksheets("Pilotage").Range("Trait_Envoi_PJ").Value = "Non"
        Worksheets("Pilotage").Range("Trait_Nom_PJ").Value = ""
        TextBox_PJ.Value = ""
    End If
End Sub


Function FileOpen(Optional ByVal sTitle As String = "Choisir le(s)  fichier(s)", Optional ByVal bAllowMultiSelect As Boolean = True, Optional ByVal sFiltreName As String = "Images", Optional ByVal sFiltreContent As String = "*.bmp; *.gif; *.jpg; *.jpeg;  *.png") As String
' CHOIX D'UN FICHIER PAR  VBA
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim vrtSelectedItem As Variant, Nb_Fic As Integer

    With fd
        .Title = sTitle                   'Titre
        .AllowMultiSelect = bAllowMultiSelect 'Choix multiples
        '.Filters.Add sFiltreName, sFiltreContent, 1 'Filtre image
        If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems
                FileOpen = Trim(FileOpen & "|" & vrtSelectedItem)
            Next vrtSelectedItem
            Worksheets("Pilotage").Range("Trait_Nom_PJ").Value = FileOpen
        Else
            'Bouton  Annuler
        End If
    End With
    Set fd = Nothing
End Function

Commentaire de nerim le 11/07/2008 14:50:52

Bonjour LUD734,

Il semble que le code de KOLOCO soit plutôt écrit pour Excel... mais l'utilisation de FileDialog est correcte. Attention, la Librairie Office doit être référencée !!

Pour le destinataire, vous pouvez remplacer

# EnvoiMail Adresse:= Range("A1"), _

par

# EnvoiMail Adresse:= ListeChoix, _
# ' Où ListeChoix est le nom d'une liste déroulante d'un formulaire Access
# ' qui permet de choisir le destinataire dans une liste

et pour la pièce jointe, remplacer

#  PJ:= Application.Path & "\AJoindre.jpg" _

par

# PJ:=FichierChoisi()

avec la fonction FichierChoisi définie comme suit

Function FichierChoisi() as String
    FichierChoisi=""
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogOpen)
    With fd
        .Filters.Add "Fichiers PDF", "*.PDF", 1
        .AllowMultiSelect = False
        .Title = "Choix du fichier à joindre"
        ' Affiche la boite de dialogue Ouvrir et vérifie si un fichier a été choisi
        ' si on clique sur annuler, Show prend la valeur False
        If .Show Then FichierChoisi = fd.SelectedItems(1)
    End With
    Set fd = Nothing
    ' La variable Fichier contient le chemin complet du fichier choisi
    ' et peut être utilisée par la procédure EnvoiMail
End Function

(Voir l'aide de VBAccess à FileDialog illustrée par de nombreux exemples)


Rappel pour le destinataire : Vous pouvez récupérer la valeur d'un champ d'une table ou d'une requête qui correspond à un critère avec la fonction DLookUp

Exemple :

Dim Destinataire as String
Destinataire=DLookUp("[ChampAdresse]","Table Destinataires","[ChampNom]='" & ContrôleNomDuFormulaire & "'")
EnvoiMail Adresse:=Destinataire

Voila, si ça peut vous aider

Cordialement

Jean

Commentaire de nerim le 11/07/2008 14:58:16

FileDialog (suite)

le fd devant SelectedItems(1)est bien entendu inutile
un simple .SelectedItems(1) est suffisant puisqu'on est à l'intérieur de la structure
With fd
End With

Par ailleurs, il faut lire
' La fonction FichierChoisi renvoie le chemin complet...
au lieu de 'La variable Fichier contient...

Commentaire de JLHS le 11/07/2008 20:21:09

Bonjour,

J'utilise le code de la fonction EnvoiMailMéthodeOLE
Cela marche parfaitement mais j'ai un petit souci avec la fenêtre outlook qui s'ouvre.

La boîte de demande de confirmation s'ouvre régulièrement dans le coin gauche de la fenêtre outlook, cachant ainsi les entêtes du mail.

Peut-on par code vba positionner différemment la boîte? ou est-ce dans le paramétrage de outlook 2003?

J'aurais souhaité aussi pouvoir formater certaines partie du corps en gras.

Est-il possible également de définir une propriété du mail pour que la signature par défaut d'outlook soit automatiquement ajoutée?

Merci

Commentaire de antone69 le 16/07/2008 14:40:45

Bonjour à tous,

Ce code source est super!!!
Mais je me demandais, est-il possible de modifier le nom du fichier en fonction des données contenus dans notre feuille de calcul mais qu'il ne soit pas enregistré mais plutôt directement envoyé par mail?
En gros combiner :
Sub cartman()
'ici tu recuperes les nom pour la sauvegarde de ton fichier
fournisseur = Cells(1, 3)
redacteur = Cells(2, 3)
ladate = Cells(3, 3)

'ici tu met le chemin d acces ou tu veux le sauvegarder
    ActiveWorkbook.SaveAs Filename:= _
        "C:\Documents and Settings\FDL\Bureau\" & fournisseur & "_" & redacteur & "_" & ladate, FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
End Sub

Avec le code d'envoi de mail...

Cordialement Antone69

Commentaire de krichk86 le 17/07/2008 14:43:28

bonjour

bien que ce code semble fonctionner correctement chez tout le monde, sur mon poste les 'mail to' n'ouvrent qu' outlook express. Mozilla1.7.8 est pourtant la messagerie par défaut, c'est la seule qui est valide et je souhaiterai savoir s'il existe une manip' spéciale pour que ces liens ouvrent cette dernière.

merci

Commentaire de gmenguy le 12/09/2008 09:52:40

Bonjour

Merc pour ce code qui dépanne bien... j'ai juste une dernière demande, je souhaiterais mettre en dure le champ expéditeur sur mon code mais a priori "from" n'existe pas!!
Quelqu'un a t-il une solution ?

Merci

Commentaire de Dioude01 le 07/10/2008 10:05:37

Bonjour,
nikel ce code, mais y a t'il une solution pour envoyer une alerte par mail pour une une plage ou tache arrivant a échéance.

Merci et bonne continuation.

Commentaire de nerim le 08/10/2008 00:33:25

Bonjour Dioude01,

Dans le classeur Excel du fichier Zip, vous avez un exemple de mail qui s'envoie automatiquement à l'ouverture du classeur. Le mail contient une liste de taches (cellules) dont l'échéance est atteinte.

Ça devrait pouvoir vous servir...

Nerim

Commentaire de nerim le 08/10/2008 01:56:39

Bonjour GMENGUY,

Je n'ai pas la solution VBA pour tous les client mail. Personnellement j'utilise Mozilla Thunderbird et j'ai défini l'expéditeur de mon choix comme expéditeur par défaut de Thunderbird et ça me suffit

Pour le faire en VBA :

Dans Thunderbird, le choix de l'expéditeur de fait en faisant Alt-x (eXpéditeur). Puis si vos nom d'expéditeurs commencent par des lettres différentes, l'initiale de l'expéditeur choisi : exemple Alt-x d (pour Dupont) ou Alt-x f (pour Formation)

Il faudrait envoyer cette séquence de touche par SendKeys dans la procédure
Sub MozillaThunderbird()
avant de valider l'envoi du message :

Sub MozillaThunderbird()
...
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 3             ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "%xf"         ' choisit l'expéditeur qui commence par F
    TouchesEnvoi(2) = "^{ENTER}"    ' Envoi du message avec Ctrl-Entrée
    TouchesEnvoi(3) = "{ENTER}"     ' confirmation par Entrée
...
End Sub

sur ma machine, je doit placer une temporisation dans la boucle d'envoi des touches pour que ça marche :

Sub EnvoiMail
...
For i = 1 To TouchesEnvoi(0)
    SendKeys TouchesEnvoi(i), True  ' on envoie le message
    Attendre 1
Next i
End Sub

J'ai mis en place cette modification de mon code dans la nouvelle version du ZIP que je mets en ligne aujourd'hui (08/10/08)

Commentaire de Laurent3233 le 12/11/2008 16:00:09 10/10

Bonjour,

Je cherche à envoyer le même message à plusieurs destinataires sans créer un message par personne (+ de 50 destinataires). J'utilise Mozilla Thunderbird comme client de messagerie et je n'arrive pas à renseigner plusieurs adresses dans le champ destinataire (une chaine de type "wwww@aaaa.fr;zzzzz@aaaa.fr;xxxx@aaaa.fr" ne fonctionne pas). Quelqu'un aurait-il la solution?
Merci d'avance.

PS: le code d'origine est super et marche sans problème

Commentaire de nerim le 12/11/2008 17:32:13

Bonjour Laurent3233

Je fais des essais et je vous tiens au courant. Si vous n'avez pas de nouvelles d'ici 2 ou 3 jours, relancez moi en m'envoyant un message privé (je ne vient pas très régulièrement sur le site de codes sources

Cordialement

JC

Commentaire de Koloco le 12/11/2008 20:16:53

Bonjour,
voici un bout de code ou j'envoie à 1 seul mail à N élèves. Mais attention le nombre de caractères dans le champ adresses est limité à 818 caractères max y ciompris le coprs du mail (explication au dessus par Nerim le 24/09/2007 : Par contre la méthode FollowHyperlink bloque à partir de 818 caractère (pourquoi à 817 ça passe ??? drôle de limitation) pour l'ensemble de l'adresse (mailto+subject+body....)

Voici mon bout de code :
' Tab_Adres_Mail : est un tableau dans lequel j'ai au préalable chargé toutes les adresses mails des élèves
' Mon Tableau Tab_Hyperlien contiendra N fois (si besoin) les adresses (de 817 caractère max) séparés par un ";"

' Éleves : les adresses seront en Blind Carbon Copie (copie cachée) pour éviter la diffusion aux autres des adresses et aussi pour éviter un reply All

           Nb_Max_Car_Adress = 817

            Tab_Hyperlien(Nb_Hyp) = "mailto:" & Adresse_Expéditeur & "?"  'Je m'envoie systématiquement le mail des élèves.
            Tab_Hyperlien(Nb_Hyp) = Tab_Hyperlien(Nb_Hyp) & "Subject= " & Objet  
            Do
                Ind_Adress = Ind_Adress + 1
                Long_Adress = Len(Tab_Hyperlien(Nb_Hyp)) + Len(Tab_Adres_Mail(Ind_Adress)) + Len(Corps) + 11  ' 11 : 5 ="&Bcc=" + 6="&Body="
                If Long_Adress < Nb_Max_Car_Adress Then
                    ' Alors : Je rajoute l'adresse
                    Tab_Hyperlien(Nb_Hyp) = Tab_Hyperlien(Nb_Hyp) & "&Bcc=" & Tab_Adres_Mail(Ind_Adress)
                Else
                    Sinon : j'insère le corps
                    Tab_Hyperlien(Nb_Hyp) = Tab_Hyperlien(Nb_Hyp) & "&Body=" & Corps
                    ' Et j'incrémente mon compteur
                    Nb_Hyp = Nb_Hyp + 1
                    Tab_Hyperlien(Nb_Hyp) = "mailto:" & Adresse_Expéditeur & "?"
                    Tab_Hyperlien(Nb_Hyp) = Tab_Hyperlien(Nb_Hyp) & "Subject= " & Objet
                End If
            Loop Until Tab_Adres_Mail(Ind_Adress) = ""
            Tab_Hyperlien(Nb_Hyp) = Tab_Hyperlien(Nb_Hyp) & "&Body=" & Corps
        End If

'Ensuite une boucle pour envoyer le mail (si plus de 817 car ou multiple de 817 alors il ouvrira N mail)
ind_Hyp = 0
Do
    ActiveWorkbook.FollowHyperlink Tab_Hyperlien(ind_Hyp)

.... ' faire les sendkeys utiles pour l'envoi ....

    ind_Hyp = ind_Hyp + 1
Loop Until ind_Hyp > Nb_Hyp

Moi aussi je fais tout sur Thunderbird.

Bon courage

Koloco



Commentaire de Koloco le 12/11/2008 20:26:40

Un rajout des initialisations au début :
    Ind_Adress = 1  'l'adresse à l'indice 0 étant la mienne
    Nb_Max_Car_Adress = 817
    Nb_Hyp = 0

Commentaire de Javanaise1 le 17/11/2008 22:56:09

Bonjour,
Félicitations pour cette procédure.
Je cherchais depuis quelques jours comment envoyer rapidement le même texte avec en pièce jointe une fiche personnalisée en format pdf spécifique à chaque personne d'une longue liste de diffusion. Et cela à partir d'une base de données gérée sous Excel.
J'ai maintenant la solution avec cette procédure que je vais adaptée à mes besoins.
Encore merci.
Cordialement

Commentaire de nerim le 18/11/2008 18:56:47

Bonjour,

Juste une petite remarque. J'ai essayé les destinataires multiples avec thunderbird (version 2.0.0.17) et il lui faut des virgules pour séparer les adresses au lieu des point-virgules.

Par ailleurs, il peut être utile de placer une temporisation entre deux envois.

Voici deux versions d'envoi en nombre :

1)Chaque destinataire reçoit la même pièce jointe mais l'objet et le corps du message sont spécifiques à chaque destinataire : Donc il faut n mails différents :

Sub EnvoieUnMailParDestinataire()
    ' le nom "Document" fait référence à une plage Excel
    ' qui contient l'adresse de la pièce jointe
    ' le nom "Plage" fait référence à une plage (de 3 colonnes)
        ' qui contient les adresses mel (col 1),
        ' la partie variable du corps (col 2),
        ' et l'objet (col 3)
    Dim i As Integer
    Dim LAdresse As String, LObjet As String, LeCorps As String, LaPièce As String
    
    For i = 1 To Range("Plage").Rows.Count ' Boucle pour chaque ligne de la plage
        With Range("Plage").Cells(i, 1) ' avec la cellule en ligne i, colonne 1
            LAdresse = .Value   ' sa valeur est stockée dans la variable LAdresse
            LObjet = .Offset(0, 2).Value    ' on stocke l'objet (décalage de 2 colonne)
            ' Exemple de corps composé d'une partie fixe et d'une partie
            ' spécifique à chaque destinataire
            ' ici la partie variable du corps représente un identifiant
            ' que l'on veut rappeler à chaque destinataire
            LeCorps = "Nous vous rappelons votre identifiant : " & .Offset(0, 1).Value  ' on stocke l'ID (décalage de 1 colonne)
            LeCorps = LeCorps & "%0D" & "J'ai ajouté une temporisation entre chaque envoi"
            LaPièce = Range("Document").Value   ' on stocke l'adresse physique de la pièce jointe
        End With
        EnvoiEmail Adresse:=LAdresse, Objet:=LObjet, Corps:=LeCorps, PJ:=LaPièce
        Attendre 2
    Next i
    ' avec les temporisation on a le temps d'aller boire un café si on a une centaine de destinataires
    ' mais ça tourne tout seul...
End Sub

suit dans le prochain message

Commentaire de nerim le 18/11/2008 19:11:04

Suite du message précédent :

2) tout le monde reçoit le même mel. On regroupe les adresses dans le même mel avec les limites évoquées par Koloco, on doit éventuellement faire paquets. Sa solution fonctionne à tous les coups et je pense que je vais l'utiliser pour mon propre usage.

Mais comme j'utilise déjà une autre méthode où on choisit la taille des paquets (10 dans l'exemple), je vous la propose avec 2 variantes.

Dans la première le premier destinataire de chaque lot est en adresse (to) les autres en copie cachée (bcc)..

Sub EnvoieLeMemeMailAToutLeMonde()
    ' cette procédure envoie le même mail à tous les destinataires
    ' par paquets de 10 (ou autre)
    ' le corps et l'objet doivent être identiques
    ' le premier destinataire est en adresse normale
    ' tous les suivants sont en copie cachée
    Dim ParPaquetDe As Integer, NuméroPaquet As Integer
    Dim i As Integer, Combien As Integer, NbreDestinataires As Integer
    Dim LAdresse As String, LObjet As String, LeCorps As String, LaPièce As String
    Dim LaBcc As String
    NuméroPaquet = 1
    ParPaquetDe = 10
    NbreDestinataires = Range("Plage").Rows.Count
    Combien = 0
    LAdresse = ""
    LaBcc = ""
    LObjet = "Envoi groupé du même mail à tout le monde"
    LaPièce = Range("Document").Value   ' on stocke l'adresse physique de la pièce jointe
    For i = 1 To NbreDestinataires ' Boucle pour chaque ligne de la plage
        LeCorps = "Envoi du paquet numéro " & NuméroPaquet & "de " & ParPaquetDe & " mails"
        LeCorps = LeCorps & "%0D" & "seule la première adresse de chaque paquet est visible"
        With Range("Plage").Cells(i, 1) ' avec la cellule en ligne i, colonne 1
            If Combien = 0 Then ' le premier destinataire du paquet est en adresse normale
                LAdresse = .Value
            Else                ' les suivants en copie cachée
                If LaBcc = "" Then
                    LaBcc = .Value    ' sa valeur est stockée dans la variable LABcc
                Else
                    LaBcc = LaBcc & "," & .Value   ' ou ajoutée dans la variable LABcc
                End If
            End If
        End With
        Combien = Combien + 1   ' +1 dans le compteur de mails d'un paquet
        ' si on a atteind le nombre maxi de mails par paquet ou
        ' qu'on a atteind le dernier destinataire
        If Combien = ParPaquetDe Or i = NbreDestinataires Then
             'on envoie le mail
            EnvoiEmail Adresse:=LAdresse, Bcc:=LaBcc, Objet:=LObjet, Corps:=LeCorps, PJ:=LaPièce
            ' ré-initialise pour le prochain paquet
            LaBcc = ""
            Combien = 0
            NuméroPaquet = NuméroPaquet + 1
            Attendre 2
        End If
    Next i
End Sub


suite dans le prochain message...

Commentaire de nerim le 18/11/2008 19:13:47

suite du message précédent

Dans la deuxième variante tous les destinataires sont en copie cachée (bcc). aucun destinataire ne peut connaitre l'adresse des autres..

Sub EnvoieLeMemeMailAToutLeMonde2()
    ' cette procédure envoie le même mail à tous les destinataires
    ' par paquets de 10 (ou autre)
    ' le corps et l'objet doivent être identiques
    ' tous les destinataires sont en copie cachée
    Dim ParPaquetDe As Integer, NuméroPaquet As Integer
    Dim i As Integer, Combien As Integer, NbreDestinataires As Integer
    Dim LAdresse As String, LObjet As String, LeCorps As String, LaPièce As String
    Dim LaBcc As String
    NuméroPaquet = 1
    ParPaquetDe = 10
    NbreDestinataires = Range("Plage").Rows.Count
    Combien = 0
    LAdresse = ""   ' on peut placer ici une adresse générique
                    '( tous les destinataires ne verront que cette adresse)
    LaBcc = ""
    LObjet = "Envoi groupé du même mail à tout le monde - deuxième version"
    LaPièce = Range("Document").Value   ' on stocke l'adresse physique de la pièce jointe
    For i = 1 To NbreDestinataires ' Boucle pour chaque ligne de la plage
        LeCorps = "Envoi du paquet numéro " & NuméroPaquet & "de " & ParPaquetDe & " mails"
        LeCorps = LeCorps & "%0D" & "aucune adresse n'est visible"
        With Range("Plage").Cells(i, 1) ' avec la cellule en ligne i, colonne 1
                If LaBcc = "" Then
                    LaBcc = .Value    ' sa valeur est stockée dans la variable LABcc
                Else
                    LaBcc = LaBcc & "," & .Value   ' ou ajoutée dans la variable LABcc
                End If
        End With
        Combien = Combien + 1   ' +1 dans le compteur de mails d'un paquet
        ' si on a atteind le nombre maxi de mails par paquet ou
        ' qu'on a atteind le dernier destinataire
        If Combien = ParPaquetDe Or i = NbreDestinataires Then
             'on envoie le mail
            EnvoiEmail Adresse:=LAdresse, Bcc:=LaBcc, Objet:=LObjet, Corps:=LeCorps, PJ:=LaPièce
            ' ré-initialise pour le prochain paquet
            LaBcc = ""
            Combien = 0
            NuméroPaquet = NuméroPaquet + 1
            Attendre 2
        End If
    Next i
End Sub


Voila. Bon codage.
Cordialement
Jean (Nerim)

Commentaire de Laurent3233 le 19/11/2008 07:41:33

Bonjour,

Merci Koloco et Nerim pour votre aide et pour ces deux codes qui fonctionnent à merveille.
Bonne continuation.

Laurent.

Commentaire de stetou le 19/11/2008 11:31:52 9/10

bonjour,

merci, super bien

stephane

Commentaire de Javanaise1 le 19/11/2008 17:29:08 10/10

Bonjour Nerim,
J'ai adapté vos procédures à mon besoin et cela fonctionne parfaitement bien. Il reste une opération que je ne sais pas faire. Ayant plusieurs adresses d'expéditeur, c'est le choix de celle-ci. Pour palier à ce problème secondaire j'ai modifié mon adresse par défaut qui est celle prise en compte. J'utilise Thunderbird et j'ai bien remarqué la combinaison de touches [Alt]+[x]+[1 caractère], mais ayant plusieurs adresses avec la même première lettre je ne vois pas comment faire. Avez vous un exemple à me donner pour traiter ce cas ?
Encore merci pour ces procédures qui sont très utiles.
Cordialement


Commentaire de Koloco le 19/11/2008 18:43:02

Bonjour,
il ne prend que la première lettre.

Ayant eu le même problème, j'ai renommer les comptes avec la 1ère lettre différente à chaque fois (lettre ou chiffre).
Pour mon cas, j'utilise (hors comptes perso) des chiffres de 0 à 9.
Exemple : 0 - Danse
          1 - Musique
          2 - Peinture
          3 - ...
Par contre, je n'ai pas tester s'il fait pour une lettre donnée une différence entre majuscule et minuscule.

Pour NERIM :  vous écrivez  ' avec les temporisation on a le temps d'aller boire un café si on a une centaine de destinataires
    ' mais ça tourne tout seul...
Je suis tout a fait d'accord, à condition qu'une fenêtre (style MSN) ne "monte" pas entre temps. Ce qui était mon cas, donc à chaque envoi, je sauvegarde dans une cellule le nom du dernier destinataire (cela me permet de faire une reprise d'envoi sans avoir à rechercher les messages envoyés).
Je tiens encore à vous remercier de ce code qui m'a parfaitement dépanné.

Bon Courage à Javanaise1 ...

Commentaire de JLHS le 19/11/2008 18:55:51

Bonsoir,
J'utilise ton code avec Excel 2003 et Outlook 2003 et en suis très content.
Je regerette simplement qu'il ne permette pas d'ajouter automatiquement la signature par défaut d'outlook 2003. J'ai essayé avec l'inspector comme vu sur le net mais je n'y suis pas arrivé.

Commentaire de nerim le 19/11/2008 19:10:02

Bonjour javanaise1

C'est vrai que [Alt][x][lettre] ne fonctionne que pour la première lettre en essai réel (hors VBA) avec thunderbird. (lisez quand même les messages de Koloco et Fred65200 (21 et 22/09/2007) puisque Koloco semble indiquer que "%xjea" sélectionne bien l'expéditeur dont le nom commence par jea. Mais il utilise peut-être Outlook...)

Une solution consiste à utiliser les flèches de direction {DOWN} pour se positionner sur le bon expéditeur. Si on n'est pas sur de l'expéditeur sur lequel on se positionne en faisant Alt-x, on peut commencer par envoyer par exemple Alt-x-j (je suis sur de me positionner sur l'expéditeur qui commence par j (choisir une unique)). et envoyer le nombre de flèches bas nécessaires pour atteindre l'expéditeur voulu.

Dans Excel, il suffit d'indiquer dans une cellule (ou en face de chaque destinataire si on gère les envois multiples) le nombre de touches bas à utiliser pour sélectionner le bon expéditeur.
A B
1 destinataire@wanafree.fr 3

et d'utiliser la valeur en question dans une boucle de la procédure EnvoiMail

# Sub MozillaThunderbird()
# 'Initialisation des tableaux de touches pour Mozilla Thunderbird
# ' Pour une pièce jointe
# TouchesPJ(0) = 4 ' Nombre de touches nécessaires
# ' il semble que l'appel par Alt-f du menu fichier ne marche pas
# ' à tous les coups donc (merci à FRED65200)
# TouchesPJ(1) = "{F10}" ' Appel des menus par {F10}
# TouchesPJ(2) = "f" ' Appel du menu Fichier par la touche f
# TouchesPJ(3) = "j" ' appel du sous-menu Joindre par la touche j
# TouchesPJ(4) = "f" ' appel du sous-sous-menu Fichier par la touche f
# ' Pour l'envoi du mail
# TouchesEnvoi(0) = 4 ' Nombre de touches nécessaires
--------------------- MODIF ------------------------------------------------
# TouchesEnvoi(1) = "%xj" ' choisit l'expéditeur qui commence par J (unique)
# ' à changer bien sur pour votre cas perso
dim i as Integer,TouchesBas as string
TouchesBas=""
for i=1 to range("B3").value (si B3=0 ont ne rentre pas dans la boucle)
TouchesBas=ToucheBas & "{DOWN}"
next i
TouchesEnvoi(1)=ToucheEnvoi(1) & TouchesBas
--------------------- FIN MODIF ------------------------------------------------
# TouchesEnvoi(2) = "^{ENTER}" ' Envoi du message avec Ctrl-Entrée
# TouchesEnvoi(3) = "{DOWN}" ' Flèche bas pour choisir l'option "Envoyer en HTML seul"
# ' dans la boite dialogue
# TouchesEnvoi(4) = "{ENTER}" ' confirmation par Entrée
# End Sub

Il serait plus propre d'ajouter un paramètre (optionel) à la procédure EnvoiMail qui serait le nombre flèches bas à utiliser. Dans ce cas la valeur de B3 serait transmise à la procédure lors de son appel...

J'essayerai d'y regarder de plus près si j'ai un peu de temps...

Mais c'est déjà une piste

Bon codage

Jean

Commentaire de nerim le 19/11/2008 19:15:46

Rebonjour

Le temps que rédige mon message hors ligne, Koloco avait déjà posté le sien....

Merci pour l'idée du stockage dans une cellule de la dernière adresse utilisée au cas où...

Jean

Commentaire de Koloco le 19/11/2008 19:22:19

Bonjour Javanaise et Nerim,

contrairement à ce que j'avais écrit le le 22/09/2007 13:36:00 la sélection de l'expéditeur avec N lettres ne fonctionne pas (ni sur outlook, ni sur thunderbird ).

Mes excuses de ne pas l'avoir indiqué lorsque je m'en suis aperçu.

Bonne continuation...

Commentaire de FRS81 le 13/02/2009 15:31:50

Bonjour,

Super Code, je suis en train de l'utiliser pour envoyer un mail a plusieurs destinataires dotn les adresses peuvent souvent changer (d'où l'utilisation d'un tableau excel pour la liste des destinataires).
Le systeme de comptage et d'envoi de mails par lots de 10 destinataire est interessant, mais je le trouve un peu long.
Ne peut on pas simplement copier la liste des destinataires (regroupés dans une cellule) dans la case "A:" d'Oultook Express, une fois que le message est ouvert ?

Merci beaucoup pour ce code, et bravo pour les explications,etant newb' j'ai apprécié les commentaires, ce qui m'a incité à m'inscrire sur ce site.

Commentaire de Koloco le 13/02/2009 17:33:07

Bonjour,

non car nous sommes limité par une longueur de chaine à 818 caractère.
Chaine = Objet+destinataireS+corps de mail (donc cela limite sérieusement).

Mon message du 12/11/2008 20:16:53 reprend un extrait d'un commentaire de NERIM sur cela et donne une astuce pour aller juste en limite de ses 818 caractères.
NERIM quelques messages après (le 18/11/2008 18h...) donne aussi une procédure (bien mieux codée que la mienne).

Bonne continuation ...

Commentaire de FRS81 le 16/02/2009 11:36:00

Bonjour,

J'ai bien compris, et j'arrive a envoyer le même message avec plusieurs mails. J'ai choisi de faire une boucle sur les adresses à entrer.
Maintenant, je voudrais avoir le même corps de message, avec une mise en forme type, je pensais utiliser une page html (j'ai un lien dans mon corps de texte).
Est il possible d'utiliser de faire référence à un papier peint avec la technique de l'hyperlien ? (En plus ça pourrais diminuer la taille du corps de message)

Commentaire de metronix22 le 18/02/2009 09:34:44 10/10

Bonjour,

Je suis un très grand novice, juste vous remercier pour votre code et surtout vous poser une question comment faire pour envoyer plusieurs pièces jointes et ne pas effectuer l'envoi automatique du mail ? J'ai vu votre commentaire qui dit qu'il faut créer un tableau mais je bloque quand meme !!!

Commentaire de nerim le 18/02/2009 18:40:08

Bonjour à FRS81 et METRONIX22,

Je n'ai pas trop le temps de me pencher sur la question en ce moment.

Pour ne pas faire l'envoi automatique, il suffit de placer un Exit Sub entre la ligne 180 et la ligne 181 : cela n'envoie pas le code la touche qui provoque l'envoi du mail. (A retirer quand le problème des pièces jointes sera résolu)

J'essaie d'y réfléchir ce WE

Cordialement
Jean

Commentaire de Koloco le 19/02/2009 18:25:14

Bonjour,

voici un bout de code qui permet d'insérer autant de pièces jointes que vous voulez (j'ai limité à 9). Par contre ces pièces jointes doivent TOUTES dans le MEME dossier.
Nota : mes excuses pour NERIM qui va s'arracher les cheveux lorsqu'il verra ce code... (mais cela fonctionne).

" le click d'une checkbox lance cette procédure
Private Sub CheckBox_PièceJointe_Click()
    If CheckBox_PièceJointe.Value = True Then
        Dim Tab_PJ(9) As String
        Worksheets("Pilotage").Range("Trait_Envoi_PJ").Value = "Oui"
        FileOpen
        Call RechercheNomsPJ(Tab_PJ)
        Noms_PJ = ""
' Boucle permettant de n'afficher que le nom (sans le chemin) des pièces jointes à insérer dans une textbox (séparées par " | ")
        For I = 0 To 9
            If Tab_PJ(I) <> "" Then
                i_long = Len(Tab_PJ(I))
                For J = i_long To 1 Step -1
                    If Mid(Tab_PJ(I), J, 1) = "\" Then
                        Noms_PJ = Noms_PJ & Mid(Tab_PJ(I), J + 1, i_long) & " | "
                        J = 2
                    End If
                Next J
            Else
                I = 9
            End If
        Next I
        TextBox_PJ.Value = Noms_PJ
    Else
        Worksheets("Pilotage").Range("Trait_Envoi_PJ").Value = "Non"
        Worksheets("Pilotage").Range("Trait_Nom_PJ").Value = ""
        TextBox_PJ.Value = ""
    End If
End Sub

'Cette fonction ouvre une fenêtre qui vous permet de vous "balader" dans le dossier ou se trouve vos pièces jointes.
' Les pièces jointes seront séparées par "|"
Function FileOpen(Optional ByVal sTitle As String = "Choisir le(s)  fichier(s)", Optional ByVal bAllowMultiSelect As Boolean = True, Optional ByVal sFiltreName As String = "Images", Optional ByVal sFiltreContent As String = "*.bmp; *.gif; *.jpg; *.jpeg;  *.png") As String
' CHOIX D'UN FICHIER PAR  VBA
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim vrtSelectedItem As Variant, Nb_Fic As Integer

    With fd
        .Title = sTitle                   'Titre
        .AllowMultiSelect = bAllowMultiSelect 'Choix multiples
        '.Filters.Add sFiltreName, sFiltreContent, 1 'Filtre image
        If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems
                FileOpen = Trim(FileOpen & "|" & vrtSelectedItem)
            Next vrtSelectedItem
            ilong = Len(FileOpen)
            'Le résultat est mis dans une cellule
            Worksheets("Pilotage").Range("Trait_Nom_PJ").Value = Mid(FileOpen, 2, ilong)
        Else
            'Bouton  Annuler
        End If
    End With
    Set fd = Nothing
End Function

'Permet de remplir un tableau avec les noms de chaque pièce jointe.
Sub RechercheNomsPJ(Tab_PJ() As String)

    Dim PJ_Saisie As String
    Dim LEttre As String
    
    PJ_Saisie = Worksheets("Pilotage").Range("Trait_Nom_PJ").Value
    i_long = Len(PJ_Saisie)
    
    ind = 0
    ideb = 1
    For I = 2 To i_long
        LEttre = Mid(PJ_Saisie, I, 1)
        If Mid(PJ_Saisie, I, 1) = "|" Then
            Tab_PJ(ind) = Mid(PJ_Saisie, ideb, I - ideb)
            ind = ind + 1
            ideb = I + 1
        End If
    Next I
    Tab_PJ(ind) = Mid(PJ_Saisie, ideb, i_long)
End Sub


Commentaire de Koloco le 19/02/2009 18:50:59

Re-bonjour

Ce commentaire pour compléter mon message précédent et pour ajouter l'envoi ou non en automatique.

Compléter mon mail précédent: j'ai adapté la procédure écrite tout au début par "Jean" en rajoutant des séquence sendkeys (TouchesPJ)
' ==> Voir Sub MozillaThunderbird_Ouvrir(Let_Cpte As String) plus loin) ou j'explique les séquence sendkeys que j'ai rajouté.

mais avant j'ai une boucle qui permet d'insérer les PJ l'une après l'autre
    If Worksheets("Pilotage").Range("Trait_Envoi_PJ").Value = "Oui" Then
        Call RechercheNomsPJ(Tab_PJ)  'Vu dans mail précédent
        For K = 0 To 9
            If Tab_PJ(K) <> "" Then
                PJ = Tab_PJ(K)
                For I = 1 To TouchesPJ(0)  ' pour chaque touche à envoyer
                    SendKeys TouchesPJ(I), True  ' Envoi de la touches
                    Attendre 1                   ' temporise (à règler éventuellement)
                Next I
                SendKeys PJ, True 'A ce stade le programme attend un nom de fichier
                                  ' on lui envoie
                Attendre 1        ' on temporise
                SendKeys "{ENTER}", True    ' et on valide ce nom de fichier
                Attendre 1        ' on temporise
            End If
        Next K
    End If

------------------------------------------

'Maintenant pour l'envoi ou non du mail en automatique voila comment je procède.
Après avoir rempli les destinataires, corps du mail, pièce jointes, etc.. et avant de faire "Run" j'ai une checkbox qui me dit si j'envoie automatiquement ou non mon mail.

Private Sub CheckBox_EnvoiMail_Click()

    If CheckBox_EnvoiMail.Value = True Then
        Worksheets("Pilotage").Range("Trait_EnvoiMail").Value = "Oui"
    Else
        Worksheets("Pilotage").Range("Trait_EnvoiMail").Value = "Non"
    endif
End Sub

'Ensuite : j'ai adapté la procédure écrite tout au début par "Jean" en rajoutant séquence sendkeys (ToucheEsEnvoi)
    
    If Worksheets("Pilotage").Range("Trait_EnvoiMail").Value = "Oui" Then
        For I = 1 To TouchesEnvoi(0) ' idem pour les touches d'envoi du message
            SendKeys TouchesEnvoi(I), True
        Next I
    End If

-------------------------------
' Et pour Thunderbird cela donne (j'ai 3 tableaux de sendkeys :
    Le premier : pour sélectionner le compte expéditeur
    le second : pour insérer N pièces jointes
    le 3ième  : pour envoyer ou non automatiquement.

Sub MozillaThunderbird_Ouvrir(Let_Cpte As String)
'Initialisation des tableaux de touches pour Mozilla Thunderbird
    ' Choix de l'Expéditeur
    TouchesExpéditeur(0) = 1         ' Nombre de touches nécessaires
    TouchesExpéditeur(1) = "%x" & Let_Cpte
                            ' Se positionne dans la fenêtre expéditeur (Alt-x) + sur le
                            ' compte de messageire par défaut commençant par la lettre choisie

    ' Pour insérer une pièce jointe
    TouchesPJ(0) = 3     ' Nombre de touches nécessaires
    TouchesPJ(1) = "%f"  ' Appel du menu Fichier par la touche Alt-f
    TouchesPJ(2) = "j"   ' appel du sous-menu Joindre par la touche j
    TouchesPJ(3) = "f"   ' sous-sous-menu Fichier par la touche f

    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 2          ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^{ENTER}" ' Envoi du message avec Ctrl-Entrée
    TouchesEnvoi(2) = "{ENTER}"  ' confirmation par Entrée
End Sub


Nota : Let_Cpte ne peut contenir qu'UN seul caractère (si plusieurs c'est le 1er qui est pris) pour le choix de l'expéditeur.

Bonne continuation ....


Commentaire de nerim le 19/02/2009 19:38:56

Bonjour,

Merci à tous pour vos questions, suggestions et solutions. Toutes les questions n'ont pas trouvé de réponse et j'en suis bien désolé. Mais ce petit programme, publié au départ dans un but pédagogique, s'est déjà bien étoffé grâce aux contributions publiées sur le forum.

Un merci particulier à Koloco qui fait "vivre ce code" autant que moi. Dès que j'aurai un peu le temps j'essaierai d'intégrer toutes ces nouveautés dans le code d'origine.

Je retiens en particulier le choix de l'expéditeur, l'envoi de plusieurs pièces jointes et l'envoi automatique optionnel.

Par contre comme mon code n'est pas à l'origine spécifique à Excel (je pense que la plupart des personnes qui l'utilisent le font avec Excel, certainement très peu avec Word mais je sais qu'un certain nombre l'utilisent avec Access), je vais essayer d'intégrer ces nouvelles fonctionnalités dans la procédure de base en la rendant la plus indépendante possible de l'application appelante.

Tout ça demande un peu de réflexion...

A bientôt
Jean

Commentaire de bmeddeb le 12/06/2009 14:37:10

Bonjour,

je n'arrive pas a envoyer une PJ !!

je ne sais pas ce qu'il faux changer dans code...
j'utilise outlook 2003 V11.56

aide SVp

merci.

Commentaire de nerim le 13/06/2009 22:42:52

Bonjour,

Essayez d'utiliser la procédure EnvoiMailMéthodeOLE au lieu de la procédure EnvoiMail, c'est le plus pratique avec Outlook. Tout çà est très commenté dans le code (tout à la fin).

Cordialement
Jean

Commentaire de pyn le 01/07/2009 17:42:18

Bonjour.
Comme tout le monde je trouve que ce code est super. Mais voilà j'ai un problème à soumettre à votre sagacité.
Dans mon fichier excel j'ai des cellules auquelles sont affectées des liens HYPERLINK vers des fichiers sur le réseau.
Lorsque je déclenche la macro pour enoyer un message, tous les liens sont modifiés (remplacement de l'emplacement réseau par l'adresse imap...). Quelqu'un a une idée ?
D'avance merci.

Commentaire de Gorzyneon le 02/07/2009 09:58:15

Bonjour

Problème aussi avec les liens hypertexte
Si j'insère un lien hypertexte dans le corps du mail du type
//serveur/dossier/fichier.truc

ça marche impeccable
mais dès qu'il y a un espace dans le chemin il s'arrête à l'espace dans le chemin, du coup le lien n'est pas valide

par exemple si mon lien est
//serveur/dossier/mon fichier.truc
dans le mail il va considérer que le lien est
//serveur/dossier/mon

si quelqu'un a une idée sur un moyen de faire considérer à Outlook un lien hypertexte comportant un espace, celà me serait d'une utilité certain

Commentaire de nerim le 02/07/2009 10:03:33

Bonjour PYN,

Je ne comprends pas le phénomène que vous décrivez. Si vous envoyez le mail à partir de votre classeur Excel et que vous joignez une pièce jointe autre que le classeur lui-même, je ne vois pas comment un simple Followhyperlink "mailto:...." (la partie active de la macro se résume à cette instruction) peut modifier du contenu dans votre classeur. L'envoi fonctionne-t-il tout de même ? Pour voir si c'est l'envoi des touches (SendKeys) qui provoque le Pb, essayez de le désactiver (mise en commentaire des instructions SendKeys).

Si c'est le classeur lui-même que vous envoyez, je ne sais pas trop (je préfère piloter l'envoi à partir d'un autre classeur car cela évite d'envoyer un classeur avec le code de la macro dont les destinataires n'ont à priori rien à faire).

Désolé de pas pouvoir vous aider plus

Cordialement
Jean

Commentaire de pyn le 02/07/2009 11:48:06

Bonjour et merci pour cette réponse si rapide.
Je vais essayer d'être plus précis dans la description du problème (qui malheureusement est aléatoire et je n'ai pas encore trouvé la cause. Ce qui me gêne) :
J'ai un fichier excel qui me sert de chrono de document à réaliser.
Sur la ligne de chaque document j'ai une imagette à laquelle j'affecte un lien Hypertext qui permet de sélectionner le document en question. Ex. \\serveur\dossier\Mon fichier.txt (avec espace ou sans espace, celane change rien)
Une autre cellule de la même ligne me permet, après sélection de déclencher un mail pour indiquer que le document est réalisé.
C'est là que le problème survient. Après envoi du mail "\\serveur\" est remplacé par imap://toto%25fai.com@mail.fai.com:143/fetch%3EUID%3E/
Pour info j'utilise Thunderbird comme client de messagerie.
D'avance merci et bonne journée.

Commentaire de nerim le 02/07/2009 17:44:58

Re-bonjour,

Votre macro envoie-t-elle le document sélectionné en pièce jointe ? Et si oui, comment transmettez-vous l'adresse du document à la procédure EnvoiMail ?

Vous pouvez peut être publier sur le forum un extrait du code que vous utilisez pour appeler la procédure EnvoiMail ou mieux me contacter par "Ecrire un message privé" et m'envoyer une copie (expurgée d'éventuelles données confidentielles) de votre classeur (on ne publie pas d'adresse mail sur le forum...). Votre problème m'intrigue...

De mon côté, je vais faire des essais en utilisant une adresse réseau pour la pièce jointe (je n'ai encore jamais essayé)

Cordialement
Jean

Commentaire de nerim le 02/07/2009 17:55:13

Bonjour Gorzyneon

Vous parlez d'Outlook, utilisez-vous la procédure standard (EnvoiMail avec SendKeys) ou la procédure "EnvoiMailMethodeOLE" ?

Voir mon commentaire précédent (De mon côté, je vais des essais...)

Commentaire de Gorzyneon le 02/07/2009 18:00:50

J'utilise la procédure standard EnvoiMail
Je n'ai pas essayée l'autre

Commentaire de nerim le 02/07/2009 19:12:27

Vous devriez peut-être essayer, l'appel à la procédure est identique (sauf que l'argument PJ:="xxx" doit être remplacé par Piece:="xxx"). Et ça marche bien avec Outlook.

Gorzyneon et Pyn, je viens de relire vos messages et j'ai un doute : les problèmes que vous évoquez avec les liens hypertextes concernent-ils des liens qui figurent dans le corps du mail ou des liens qui sont utilisés comme adresse pour une pièce jointe?

Et pour Pyn, si le lien figure dans le corps du texte du mail, le changement de "//serveur/" en "imap//..." se produit-il dans le corps message envoyé ou dans le classeur lui-même ?

Cordialement
Jean

Commentaire de Gorzyneon le 02/07/2009 19:24:43

corps du mail en ce qui me concerne

exemple :

"Mail automatique généré pour vous signaler que le fichier

//serveur/dossier machin/fichier.truc a été modifié"

du coup le destinataire ne peut pas clicker sur le lien car le espace entre "dossier" et "machin" coupe le lien

Commentaire de nerim le 03/07/2009 10:16:18

Bonjour Gorzyneon,

Un essai fait avec Thunderbird provoque en effet la coupure du lien.
Une solution peut être de composer le corps du mail en HTML.

Voici une solution que j'ai essayée avec Thunderbird et qui fonctionne :

Une fonction qui compose le corps en HTML :

Function MiseEnFormeLienHT(Texte As String, Lien As String, TexteLien As String)
    MiseEnFormeLienHT = "<html>" & _
    Texte & _
    "<br><a href='" & _
    Lien & "'>" & _
    TexteLien & _
    "</a></html>"
End Function

La procédure qui appelle l'envoi du mail :

Sub EnvoiAvecLienDansCorps()
    With Sheets("Quelques Exemples")
        EnvoiEmail _
        Adresse:="jc@pro-forma.fr", _
        Objet:="Essai envoi lien", _
        Corps:=MiseEnFormeLienHT(.Range("B30"), .Range("B31"), .Range("B32"))
    End With
End Sub

Dans ma feuille "Quelques Exemples", j'ai :
En B30 : Veuillez trouver l'adresse du dernier fichier disponible :
En B31 : http://mirenetjean.free.fr/cpg/albums/Ben/Dessins/femme tatouee.jpg
En B32 : femme tatouee.jpg

Par contre un essai fait avec un accent (femme tatouée.jpg) donne un lien incorrect.

A essayer avec Outlook...

Cordialement
Jean

Commentaire de mathomtb le 06/07/2009 11:07:50 8/10

Bonjour,
Je voudrais utiliser ce module dans le but d'automatiser l'envoi de mail à mes 250 utilisateurs. J'ai donc le choix entre envoyer un mail à chaque user ou envoyer un mail à tout le monde d'un seul coup. Evidemment, je préfère qu'un seul email soit envoyé pour gagner du temps mais c'est là que ca coince ! Si je mets une adresse dans ma variable Recipient, tout va bien. Si j'en mets 2, séparées par un ; ca va aussi. Mais en vrai j'ai une boucle qui concatène les adresses email des 250 utilisateurs et là, impossible d'appeler l'Hyperlink ! J'ai l'erreur "Argument ou appel de procédure incorrect" alors que j'arrive à afficher le contenu de la variable Hyperlien et je ne vois pas de problème.
Est-ce dû à la longueur de ma requête (6038 caractères) ?
Merci pour votre aide.
Mat

Commentaire de Koloco le 06/07/2009 13:46:47

Bonjour,
c'est limité à 818 caractères.

NERIM à écrit le 24/09/2007:
    Par contre la méthode FollowHyperlink bloque à partir de 818 caractère (pourquoi à 817 ça passe ??? drôle de limitation) pour l'ensemble de l'adresse (mailto+subject+body....).

Bonne suite ...

Commentaire de Gorzyneon le 06/07/2009 14:18:52

Merci Nerim pour ta suggestion d'utiliser le html
J'ai fait un essai, a priori ça ne passe pas sous Outlook qui se contente d'écrire le corps en mode texte, sans interpréter le html - je me suis peut être planté mais j'ai l'impression qu'il ne tient aucun compte des balises

Commentaire de nerim le 06/07/2009 18:54:21

Bonjour MAthomtb,

Bravo à Koloco pour sa vigilance, mais il est modeste car il a proposé une solution au problème : voir son post du 12/11/2008... et des variantes dans mes posts du 18/11/2008

Cordialement
Jean

Commentaire de nerim le 06/07/2009 18:57:53

Pour Gorzyneon

Bonjour,

Dommage, l'idée était séduisante, dès que j'aurai un peu de temps, je vais essayer avec Outlook (je n'aime pas trop changer mon client mail par défaut...).

Si vous trouvez une solution d'ici là, tenez-moi au courant

Cordialement
Jean

Commentaire de Gorzyneon le 07/07/2009 10:32:50

Bonjour Nerim,

L'idée du HTMLBody était effectivement bonne. J'ai trouvé la solution avec un bout de code particulièrement efficace qui nécessite d'activer la référence Microsoft Outlook.

L'intérêt de se code est qu'il permet par ailleurs d'envoyer directement le mail sans faire apparaître la fenêtre Outlook (pas de SendKeys)

'*********  EXEMPLE ***********
sub hypertext_email()
Dim OutApp As Object
Dim OutMail As Object
Dim strbody As String

Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
Set OutMail = OutApp.CreateItem(0)
strbody = "<A HREF=""\\Mes Documents\Photos 2007"">Photos 2007</A>"
On Error Resume Next
    With OutMail
        .To = "toto@toto.fr"
        .CC = ""
        .BCC = ""
        .Subject = "Lien hypertexte"
        .HTMLBody = strbody
        .BodyFormat = olFormatHTM
        '.Display 'Pour afficher le message avant envoi
        .Send 'Pour envoyer directement sans afficher
    End With
    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing
End Sub

Pour tout savoir sur VB Outlook je vous conseillerais le tuto suivant
http://dolphy35.developpez.com/article/outlook/vba/

Commentaire de nerim le 07/07/2009 23:13:31

Bonjour Gorzyneon,

Je connais cette méthode. C'est en effet celle utilisée par la procédure EnvoiMailMethodeOLE dont je vous parlais dans mon message du 02/07 (voir les lignes 343 et suivantes dans le code publié...).

Donc avec cette méthode et le corps en HTML, les liens dans le corps fonctionnent? C'est bon à savoir.

Cordialement
Jean

Commentaire de Gorzyneon le 08/07/2009 10:54:22

Oui effectivement, ça m'apprendra à pas lire les commentaires, et bien sûr cette méthode ne fonctionne qu'avec Outlook !

Commentaire de pyn le 08/07/2009 12:54:13

Bonjour à tous et désolé pour l'absence de ces derniers jours.
Pour répondre à Nerim, il y a incompréhension sur l'opération effectuée? Le lien n'est pas dans le corps, ni l'objet d'ailleurs du message mais sur image qui marque la ligne excel à traiter et qui me permet en cliquant dessus d'atteindre directement l'emplacement de stockage du document en question.
Voici en fait le code ci-dessus (je rappelle que le message est envoyé au travers de Thunderbird et non pas d'outlook) :

Sub Worksheet_Change(ByVal Target As Range)
Dim ibouc As Integer
Dim Objet As String
Dim Corps As String
Dim Adr_objet As String
Dim AdresseMail As String
Dim Action_Dev As Variant ' String
        
Action_Dev = Range(Target.Address(0, 0)).Value
If Range(Target.Address(0, 0)).Column = 6 Then ' correspond à la colonne où mettre "achevé"
  
For ibouc = 0 To Range("DERN_LIG") - 3
   If Target.Address(0, 0) = "F" & 2 + ibouc And Action_Dev = "achevé" Then
      ActiveSheet.Calculate
      Range(Target.Address(0, 0)).Value = "impr_en_cours"
      Range(Target.Address(0, 0)).Offset(0, 2).Value = "Signature en cours"
      AdresseMail = Worksheets("Suivi").Range("ADR_MEL") ' cellule nommée contenant l'adresse du destinataire
      Adr_objet = Range(Target.Address(0, 0)).Offset(0, -3)  ' -3 correspond à l'emplacement du nom du document
      Objet = "DOCUMENT : signatures à obtenir pour le document intitulé " & Range(Target.Address(0, 0)).Offset(0, -3).Value
      Corps = "Ceci est un message genere automatiquement." & Chr(13) _
           & " Prevenir par retour de courrier lorsque l'action citee en objet est effectuee." & Chr(13) & " Merci"
      EnvoiEmail AdresseMail, Objet, Corps
    End If
Next ibouc
End If
End Sub

Donc lorsque j'indique "achevé" dans la bonne cellule (en l'occurrence la celulle F), je constitue un message avec le nom du documents quie je trouve dans la cellule C... et j'envoie le message.
Je n'arrive plus à reproduire pour l'instant le problème mais je n'utilise pas non plus tous les jours ce programme.
Au fait si vous voyez des amélioration à apporter au code n'hésitez pas à m'en faire part.
Pour info lorsque le contenu de "Object" contient des accents, ceux-ci n'apparaisssent pas dans le message reçu.
Exemple "intitulé" deviens "intitul" ou "éléments"deviens "l ments"

Commentaire de nerim le 09/07/2009 00:59:45

Bonjour,

Juste quelques remarques sur votre code :
Vous pouvez utiliser simplement Target (qui est une Range) plutôt que
Target.Address(0, 0).
Votre boucle (pour repérer la ligne sur laquelle on a tapé "achevé" si j'ai bien compris) me semble inutile.
Le mail ne doit être envoyé que si on a tapé "achevé" en colonne F et entre les lignes 2 et Range("DERN_LIG"), on peut donc conditionner l'envoi par un seul test qui vérifie ces conditions : Dans ce cas le Target.offset(0,-3) récupère directement l'adresse du document sur la bonne ligne.

Cela peut donner quelque chose du genre :

Sub Worksheet_Change(ByVal Target As Range)
Dim Objet As String
Dim Corps As String
Dim Adr_objet As String
Dim AdresseMail As String
If Selection.Cells.Count > 1 Then Exit Sub
With Target    
' le With permet de ne pas répéter partout dans le code "Target." le "." suffit
    If .Column = 6 _
        And .Row >= 2 And .Row <= Range("DERN_LIG") _
        And .Value = "achevé" Then
          .Value = "impr_en_cours"
          .Offset(0, 2).Value = "Signature en cours"
          AdresseMail = Worksheets("Suivi").Range("ADR_MEL") 'cellule nommée...
          Adr_objet = .Offset(0, -3).Value
          Objet = "DOCUMENT : signatures à obtenir pour le document intitulé " & Adr_objet
          Corps = "Ceci est un message généré automatiquement." & %0A _
          & " Prevenir par retour de courrier lorsque l'action citée en objet est effectuée." & %0A & " Merci"
          EnvoiEmail AdresseMail, Objet, Corps
    End If
End With
End Sub

Par ailleurs, pour éviter le problème de transformation de l'adresse du document, vous pouvez essayer d'envoyer le corps en HTML en utilisant la fonction MiseEnFormeLienHT citée dans mon post du 03/07 à l'intention de Gorzyneon
Par exemple :
Corps = "Ceci est un message généré automatiquement." & "%0A" _
   & " Prévenir par retour de courrier lorsque l'action citée en objet est effectuée." & "%0A" & "Merci" & _
   "%0A" & "vous pouvez accéder au document cité en objet en cliquant "
EnvoiEmail AdresseMail, Objet, MiseEnFormeLienHT(Corps, Adr_objet, "ici")


Je vous conseille d'éviter de placer un lien hypertexte dans l'objet du message (de toutes façon, même si ça marche, le lien ne sera pas actif (cliquable) pour le destinataire). Essayez d'extraire le nom du fichier seul (sans le chemin) pour l'indiquer dans l'objet. Et d'indiquer le lien dans le corps (l'envoi d'un lien dans le corps est possible avec l'astuce HTML indiquée + haut)

Enfin, lors de mes essais (avec Thunderbird), je n'ai pas rencontré de pb avec les accents dans l'objet mais le lien dans le corps avec la méthode ci-dessus est erroné quand il y a un accent dans l'adresse du document.

Je n'ai certainement encore tout compris de votre pb, mais ces quelques infos peuvent peut-être vous aider.

Cordialement
Jean

Commentaire de nerim le 09/07/2009 01:22:07

Juste pour dire que le code que je propose dans le message précédent ne marche pas "mieux" que le votre. Il ne s'agit donc pas à proprement parler "d'améliorations", c'est juste que c'est comme cela que je l'aurais programmé...

Commentaire de Savage17 le 11/08/2009 16:17:43

Bonjour,

J'utilise la procédure "EnvoiMail", lorsque j'éxécute la macro, Outlook2007 s'ouvre mais ne prend pas la pièce jointe. Il faut que je clique dans le corps du message, une fois que le curseur apparaît, la procédure se déroule normalement. Il faudrait que le fenêtre( nouveau message ) soit active. Avez-vous une solution ???

Merci d'avance
Cordialement.

PS : La procédure est exellente !!!

Commentaire de nerim le 12/08/2009 09:37:35

Bonjour,

Je n'ai jamais rencontré ce pb. Normalement la méthode FollowHyperLink "mailto:...." lance et active le client mail par défaut (pour vous Outlook 2007). Vous dites qu'il faut cliquer dans la fenêtre Outlook pour que la procédure se déroule normalement. Cela veut dire que la fenêtre Outlook est passée au premier plan sans être active? Quelle est la fenêtre active avant que vous cliquiez dans Outlook.
Essayer de placer l'instruction suivante qui lance une application Microsoft ou l'active si elle est déjà lancée:

Application.ActivateMicrosoftApp xlMicrosoftMail

en ligne 168 (avant If PJ <> "" Then)

Par contre, avec Outlook 2007, je vous conseille d'utiliser la procédure "EnvoiMailMéthodeOLE" qui figure à la fin du code (voir les commentaires dans le code). Pensez à ajouter la bibliothèque "Microsoft Outlook 12.0 Object Library" (Menu Outils-Références dans l'interface VBA).

Tenez-moi au courant.

Cordialement
Jean

Commentaire de Savage17 le 12/08/2009 14:04:26

Bonjour Jean,

J'ai placé l'instruction juste avant "If PJ..." cela ne marchait pas, ça ouvrait le dernier mail que j'avais reçu. Je l'ai placé après la l'instruction "HyperLien = HyperLien & "Subject=" & Objet & "?", et ca marche bien. C 'est vrai que j'ai un peu modifié le code source.
En tout cas, grand merci pour ton aide, c'est frustrant quand on est bloqué et qu'on sait qu'il manque pas grande chose, je voulais pas lâcher l'affaire. J'avais testé avec application.Activate mais ca ne marchait pas, je suis plus que limité en VBA.

Je vais testé la méthode OLE, mais j'y connais pas grand chose, je vais assayer de trouver un source commenté, et de me plonger à fond la-dedans. J'essaye d'automatiser un traitement qui consiste à envoyer différents tableaux à différents utilisateurs.


Encore merci pour ton aide et pour réponse plus que rapide.
Cordialement.

Commentaire de nerim le 13/08/2009 09:29:38

Bonjour Savage17,

c'est bien que ça marche mais je ne comprends pas pourquoi cela ne marchait pas chez vous sans l'ajout de l'instruction...

Pour la méthode OLE, il est peut-être inutile de "chercher" un code commenté : celui qui figure dans le code publié ici (voir le source listé au début de l'article lignes 343 à 380) est déjà bien commenté et fonctionne parfaitement...

Bon courage pour la suite

Cordialement
Jean

Commentaire de Savage17 le 19/08/2009 11:28:43

Bonjour Jean,

Dans le code pour la méthode OLE, à quel moment on renseigne la pièce jointe ?
Pour les lignes de 356 à 360, il s'agit uniquement de commentaires ?
le code va essentiellement de la ligne 362 à la ligne 380.
Je doit supprimer tout le code correspondant à la méthode EnvoiMail.

Cordialement.

Commentaire de nerim le 21/08/2009 08:45:13

Bonjour Savage17,

En effet les lignes 355 à 359 sont indiquées dans le code en commentaires car elles sont placées là uniquement comme exemple d'utilisation de la procédure :

' EnvoiMailMéthodeOLE Adresse:= Range("A1"), _
' Objet:= Range("A2"), _
' Corps:= PH(Range("A3:A10")), _
' PJ:= Application.Path & "\AJoindre.jpg" _
' Bcc:="zorro@fantomas.com"

On renseigne la pièce jointe lors de l'appel à la procédure EnvoiMailMéthodeOLE par
PJ:=le chemin et le nom du fichier à joindre en pièce jointe.

En effet, une fois vérifié le bon fonctionnement de la méthode OLE, vous pouvez ne conserver que les lignes 362 à 380

Commentaire de Savage17 le 24/08/2009 14:29:47

Bonjour Jean,

Je ne comprend pas car PJ n'est pas déclaré dans la méthode OLE, si je supprimes tout le code correspondant à la méthode "EnvoiMail", je supprime également la déclaration de la variable PJ.

Cordialement.
Stefan.

Commentaire de nerim le 25/08/2009 08:38:48

Bonjour,

Autant pour moi. Il y a une erreur de nom d'argument dans le commentaire :
à la place de
' PJ:= Application.Path & "\AJoindre.jpg" _
il faut lire
' Pièce:= Application.Path & "\AJoindre.jpg" _
(les arguments déclarés dans le nom de la procédure : Adresse, Objet, Corps, Pièce, Cc et Bcc font office de déclaration de variable).

De toutes les façons, même si vous conserviez le code de la procédure EnvoiEmail, les arguments déclarés d'une procédure ne sont connus que dans la procédure elle-même : l'argument (la variable si vous préférez) PJ déclarée dans la procédure EnvoiEmail n'est pas utilisable dans une autre procédure.

Désolé de vous avoir fait chercher pour rien

Cordialement
Jean

Commentaire de MathieuLS le 08/09/2009 16:37:55

Salut,

Super code apparemment. Mais quand je le copie-colle dans mon module et que je veux activer l'une des macros :
- il ne me trouve pas la principale (EnvoiMail)
- il m'envoie un message d'erreur "erreur de compilation : sub ou function non definie" quand je veux activer l'importe laquelle des autres macros

Résutat : impossible de l'utiliser

Pour info, je suis complètement novice en vba, je suis sur un Mac et j'utilise excel + thunderbird.
Est-ce que qqn aurait une indication ?
Par avance, merci

Commentaire de nerim le 13/09/2009 11:25:49

Bonjour Mathieuls,

Vérifiez que vous appelez bien la procédure par EnvoiEmail et non par EnvoiMail (comme indiqué dans votre message)

Sinon, je ne vois pas pourquoi les procédures sont inaccessibles depuis votre module.
Vous pouvez essayer de placer devant chaque définition de procédure et de fonction le mot "Public"

Exemple
Public Sub EnvoiEmail (Adresse....

C'est normalement inutile mais comme je manque un peu de précisions...

Vous pouvez m'envoyer votre classeur par mail en me contactant par l'envoi d'un message privé à partir du site de Code-SourceS

Cordialement
Jean

Commentaire de nerim le 16/09/2009 09:01:38

Je place ici une copie des échanges de messages privés avec Mathieuls car cela peut intéresser d'autre débutants en VBA. :

Copie du message privé envoyé par MATHIEULS

Bonjour Jean,

Merci beaucoup pour votre réponse.
Et désolé de ne pas réussi du premier coup car, c'est d'autant plus énervant, votre démo est effectivement très commentée.


Alors :

- J'ai essayé avec "Public" en début de formule, mais sans changement notoire.

- J'ai remarqué que seules les formules avec des infos entre parenthèses (Sub EnvoiEmail et Sub Attendre) ne sont pas disponibles quand je fais Outil > Macros alors que les autres (Sub Incredimail, Sub MozillaThunderbird, etc.) le sont. Serait-ce ces infos entre parenthèse qui empêchent qqc ? Le fait que je sois sur un Mac ?

Par ailleurs, je n'ai plus de message d'erreur quand je veux exécuter une des macros dispo (en l'occurrence, MozillaThunderbird). Simplement, il ne se passe rien.

J'aurais voulu vous envoyer un tableau mais je ne vois pas comment attacher une PJ au message... Comment puis-je faire ?

Par avance, merci.
Cordialement,

Mathieu

Copie de la réponse envoyée à Mathieu

Bonjour Mathieu,

Il est normal que les procédures et fonctions qui ont besoin de recevoir des paramètres pour fonctionner (celles qui ont des arguments entre parenthèses) ne soient pas visibles depuis Outils->Macros. Par exemple la procédure Sub Attendre (Durée) a besoin de connaître le nombre de secondes pour fonctionner et par Outils->Macros ont ne peut pas lui transmettre l'information.

Vous devez donc écrire une procédure qui appelle EnvoiEmail en lui transmettant les infos voulues et c'est cette procédure que vous lancerez par Outils->Macros.

Par exemple, vous pouvez écrire une macro Appel de la façon suivante :

Sub Appel
  ' Envoi simple sans pièce jointe :
    EnvoiEmail Range("A1"), Range("A2"), Range("A3")
End Sub

ou

Sub Appel
  ' En utilisant les arguments nommés (c'est le plus clair):
    EnvoiEmail Adresse:= Range("A1"), _
    Objet:= Range("A2"), _
    Corps:= PH(Range("A3:A10")), _
    PJ:= Application.Path & "\AJoindre.jpg" _
    Bcc:="zorro@fantomas.com"
En Sub

Je viens de m'apercevoir que dans les commentaires indiqués dans ma source, j'utilise le nom de procédure EnvoiMail alors qu'il faut utiliser EnvoiEmail. Désolé.

Je vais placer cette réponse dans les messages publics car je réalise que les débutants peuvent être coincés comme vous ne sachant pas comment utiliser ce code.

Une dernière chose, je vous conseille de télécharger l'exemple de code proposé et de regarder les macros associées aux différents boutons.

Cordialement
Jean

Commentaire de nerim le 16/09/2009 16:32:50

Message de Mathieu :

Bonjour Jean,

Vos explications m'ont permis d'avancer et de comprendre pourquoi je n'y arrivais pas, merci beaucoup. Mais je me retrouve confronté à des nouveaux problèmes :

- je ne comprends pas comment intégrer les Function PH ou PT dans le Sub Appel (à quel endroit de la formule Sub Appel ? que dois-je remplacer dans le script "Function" pour l'adapter à mon tableau ?)

- Excel m'ouvre bien un nouveau mail - c'est magique -, mais me colle des signes étranges un peu partout (les caractères accentués, par exemple, sont traduits par "%C3%A9" ou assimilés, et je ne trouve pas le code de retour à la ligne - j'ai essayé & %0A & et & vbCRLF & mais sans résultat. Par ailleurs, la case "Objet" das mon mail est systématiquement complétée par (%C3%A0 13:45:50), alors que je n'ai pas commandé l'heure.

C'est rageant : j'ai tout mon code dans la tête en langage "français" mais n'arrive pas à le traduire correctement :-)

Peut-être n'êtes vous pas là pour tout résoudre :-) et dans  ce cas j'irai faire un tour sur d'autres forums. Quoi qu'il en soit, merci de votre attention.
Mathieu


Ma réponse :

Pour les fonctions PH (transforme une plage de cellules Excel en tableau HTML) ou PT (transforme une plage de cellules Excel en tableau avec des tabulations : moins élégant mais plus compatible), l'utilisation est indiquée dans l'exemple donné dans le message précédent :

Sub Appel
   ...
   Corps:=PH(Range("xxxx")),
   ...
End Sub

Vous placez les coordonnées de la plage de cellules que vous voulez envoyer comme corps du message à la place des xxxx. La fonction PH() transforme votre plage en tableau et c'est ce tableau qui est transmis à la procédure EnvoiEmail.

Pour les caractères accentués transformés, c'est l'éternel problème des codes de caractères différents entre PC et MAC. Si vous avez récupéré le code par un copier coller, essayez de retaper les caractères accentués dans votre environnement MAC. Ou, mieux, évitez d'utiliser les accents...

Il se peut que le problème du "%0A" (il faut bien veiller à mettre les guillemets pour ce code de craractère soit envoyé tel comme un texte : donc & %0A est faux, & "%0A"  est juste. Par contre & vbCrLf est juste (car vbCrLf est le nom d'une constante) mais ne fonctionne pas ici) soit du même ordre car ça marche bien sur PC :
Exemple d'utilisation :

Sub Appel
    Dim Texte As String
    Texte="Voici un extrait du tableau demandé :" & "%0A"
    Texte=Texte & PH(Range("B5:D20")
    EnvoiEmail Adresse:= Range("A1"), _
    Objet:= Range("A2"), _
    Corps:= Texte, _
    PJ:= Application.Path & "\AJoindre.jpg" _
    Bcc:="zorro@fantomas.com"
End Sub

Si ça ne fonctionne pas sur MAC, il faut trouver le code hexadécimal du retour ligne sur le MAC que je ne connais pas.

En ce qui concerne l'envoi de la date et de l'heure dans l'objet, c'est que le code est tiré du classeur d'exemple dans lequel j'ai programmé cet ajout. A retirer si vous n'en avez pas besoin (%C3%AO doit correspondre au "à" sur MAC...

En ce qui concerne le fait que "je ne sois pas là pour tout résoudre", je suis formateur de métier et j'ai publié ce code à l'origine dans un but pédagogique donc quand j'ai un peu de temps j'assume le côté pédagogique... Même si je dois répéter des infos déjà données précédemment (voir les messages des 07/06/2005, 25/10/2005, 14/09/2007 et 17/09/2007)

Cordialement et bon courage pour votre apprentissage de VBA
Jean

Commentaire de AndrePe le 04/02/2010 10:19:17

Bonjour Nerim,
Je viens d'ajouter Eudora à la liste en tenant compte du message que vous m'avez envoyé suite à ma demande.
Voici le code utilisé
Sub Eudora()
'PJ non encore adapté, envoi fonctionne
'Initialisation des tableaux de touches pour Outlook Express
    ' Pour une pièce jointe
    TouchesPJ(0) = 1        ' Nombre de touches nécessaires
    TouchesPJ(1) = "^h"     ' Appel du menu Insertion par la touche CTRL h
    'TouchesPJ(2) = "p"      ' appel du sous-menu pièce par la touche p
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 2     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^e"  'clic sur le bouton 'Queue' = CTRL e
    TouchesEnvoi(2) = "^t"  ' Envoi du message avec CTRL t
End Sub

Je n'ai pas besoin pour l'instant de PJ, mais je vais m'en occuper et ne manquerai pas de vous transmettre le code qui va bien.

Amicalement

Commentaire de nerim le 05/02/2010 09:22:09

Bonjour AndrePe,

Juste une petite correction pour l'envoi de pièce jointe quand vous l'utiliserez :

Écrivez bien TouchesPJ(0)=2 s'il faut réellement utiliser 2 touches pour joindre la pièce (Ctrl-h puis p)

Merci de signaler sur le forum si votre procédure fonctionne quand vous l'aurez essayée.

Cordialement
Jean

Commentaire de AndrePe le 05/02/2010 09:45:08

Merci de la remarque.
Pour le moment, je n'envoie pas de PJ, et n'utilise donc pas ce code.
A+
André

Commentaire de AndrePe le 07/02/2010 15:38:16

Bonjour à tous,
Pour Eudora (V 7.1.0.9) vec le code
'Initialisation des tableaux de touches pour Outlook Express
    ' Pour une pièce jointe
    TouchesPJ(0) = 2        ' Nombre de touches nécessaires
    TouchesPJ(1) = "^h"     ' Appel du menu Insertion par la touche CTRL h
    TouchesPJ(2) = "p"      ' appel du sous-menu pièce par la touche p
    ' Pour l'envoi du mail
    TouchesEnvoi(0) = 2     ' Nombre de touches nécessaires
    TouchesEnvoi(1) = "^e"  'clic sur le bouton 'Queue' = CTRL e
    TouchesEnvoi(2) = "^t"  ' Envoi du message avec CTRL t
End Sub

le programme fonctionne bien.

Merci NERIM, tu peux ajouter cela dans ton code.
Amicalement
André

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Envoi de mail automatique [ par mercure144 ] Bonjour,En preambule je voudrais préciser que je debute.Voila, j'aimerais recevoir (au bureau) toutes les heures un mail contenan Envoie de mail automatique en VBA [ par kulls ] Bonjour a tous,bon voila, apres plusieurs jours de recherches, j'ai enfin r&#233;ussi a passer outre la P*/&#233;#@ de protection de Outlook concernan VBA Outlook : affiche un msg à l'arrivée d'un mail [ par trz303 ] Version : Outlook 2000&nbsp;+ Exchange serverVous me direz que c'est "built-in" dans Outlook, mais pas tout &#224; fais.Je m'explique : mon probl&#232 envoi de mail automatique [ par s_tatoue ] Bonjour, Lorsque j'essaie d'envoyer un mail automatiquement lors de la validation d'un formulaire, j'ai cette erreur qui apparait : Warning: mail(): mail automatique avec outlook [ par chuch24 ] je souhaite automatiser un envoi de mail automatique avec 1 fichier joint tous les jours à la même heure à partir d'outlook vers le même destinataire macro VBA par mail [ par wmal ] wmalBonjour,Comment faire pour qu'une macro open soit activée automatiquement par le récepteur d'un document word suite à un envoi par mail : j'ai écr VBA OUTLOOK Selectionner un mail des sa réception [ par nyco91 ] Bonjour, je souhaiterais lors de la réception d'un mail, selectionner ce mail pour pouvoir le manipuler (ex récupérer le corp du texte ou objet) j'uti Saisie semi-automatique en VBA [ par Hach_net ] Salut Dans mon projet de VBA je veux r&#233;aliser une zone de texte qui permet de rechercher des donn&#233;es avec la saisie semi-automati VBA et l'option de complément automatique [ par ZANUS ] Bonsoir à tous Lorsqu'on écrit un code VBA affiche une fenêtre de complément automatique des instructions. Par exemple, si je tape le code suivant: If Outllok - Macro VBA [ par funflb ] Bonsoir,Comment déclencher une macro VB sous Outlook à réception d'un mail.En résumé, lors d'un réception d'un mail qui fait partie d'une liste de dif


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales