Macro VB Sous Excel - envoi par mail de données formulaire [Résolu]

Signaler
Messages postés
7
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 juin 2007
-
Messages postés
7
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 juin 2007
-
Bonjour,

Sous Excel, j'ai créé un formulaire userform de saisie client (avec nom prenom n°client etc...) et je veux envoyer ces données par mail (outlook) avec un bouton sur ce même formulaire (et non worksheet). Je veux aussi inclure en objet certaines de ces données (du genre N°client / M Dupont).

J'ai réussi à créé un envoi de mail avec du texte entre " " pour l'objet et le corps du message mais impossible d'y intégrer les données en cours de saisie.

au final je veux recevoir un mail du genre:

objet: M dupont / client 1234
corps du message:
 nom: M Dupont
prenom: Jean
adresse: 1 rue notre dame 75000 Paris
etc...

Avez-vous une solution ? 

Merci d'avance

Tiwan

5 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
En principe, ta première méthode devrait fonctionner.

Pour le sujet, essaie ceci
EmailSubject = code_client.text & " / " & nom_client.text

Pour le corps du message, ça peut se compliquer un peu. Ça dépend si tu as besoin d'un certain formatage. Si c'est le cas, tu devrais regarder du côté de HTMLBody plutôt que Body

'ici je me sers de la police Courrier (espacement fixe) pour avoir un formatage en pseudo-colonnes
ObjMessage.HTMLBody = "<HTML>" & emailmsg & "

</HTML>"

Tu pourrais aussi regarder du côté de l'API ShellExecute qui va démarrer le programme par défaut.
déclaration :
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal Hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long

Utilisation:
    Dim Tmp As Long
    Dim A As String, Sujet As String, Corps As String
   
    A = "Machin@serveur.com"
    Sujet = "Ceci est le sujet"
    ' %0A sert aux sauts de ligne
    Corps = "Ceci est le corps" & "%0A" & "et sa 2e ligne"
   
    Tmp = ShellExecute(0, "Open", "mailto:" & A & "?Subject=" & Sujet & "&Body=" & Corps, 0&, 0&, 1)

MPi
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

quel est ton code d'envoi qui fonctionne ?
(qu'on ait une base pour t'aider)

Sinon, au lieu de mettre du texte entre "", tu peux mettre des variables ou la propriété Text / Caption d'un objet

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Utilises-tu Outlook (d'Office) ou un autre programme ?

Quelle méthode utilises-tu ?
Il y en a plusieurs qui peuvent servir.
Tout dépend comment tu veux envoyer ces courriels: ouvrir Outlook, utiliser le programme par défaut, envoi automatique sans fenêtre, ...

MPi
Messages postés
7
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 juin 2007

J'utilise Outlook et au travail aussi (2007 à la maison et 2003 au travail). J'ai essayé de mettre des .Text (plusieurs mais il me précisait une erreur d'expression et n'accepte que des "" (je sais je porte des moufles ;)) Voici le code (pas le mien évidemment) avec mes commentaires sur ce que j'aimerai avoir:

Private Sub push_Click()
        EmailSubject = "URGENT / FICHE CLIENT "   'Demande du sujet du message, je souhaite y rajouter des infos du formulaire en cours tel que le nom du client (nom_client.text) et son code client (code_client.text)
         emailmsg = "" 'Le corps du message, je souhaite qu'il reprenne quasiment toutes les données du formulaire même principe que code_client.Text, nom_client.text etc 
        emaildest = InputBox("Indiquer le destinataire", "Destinataire")   'Demande de l'adresse email du destinataire avant l'envoi. a la rigueur je préfèrerai même un mail qui s'ouvre prérempli de mes données
        Dim ObjOutl As Object   'Déclaration des objets
        Dim objSession As Object
            Set ObjOutl = CreateObject("Outlook.Application")   'Création de l'objet Outlook
            Set objSession = ObjOutl.GetNamespace("MAPI")   'Création de l'objet de gestion des message
            Set ObjMessage = ObjOutl.CreateItem(0)   'Ajout d'un item pour le message
            objSession.Logon   'Connection à Outlook
            With ObjMessage
                .To = emaildest
                '.CC = ""
                .Subject = EmailSubject
                .Body = emailmsg 
                .Send
            End With


        'Suppression des objets (Vidage)
        Set ObjMessage = Nothing
        objSession.Logoff
        Set objSession = Nothing
        Set ObjOutl = Nothing
End Sub

J'ai essayé avec un autre code (suivant) que j'ai trouvé sur l'aide MS, la fonction sendmail, et en utilisant l'exemple précisé par microsoft dans son aide (qui reprendrait les données complète du formulaire) mais il me met une erreur lorsque que je veux lancer le sous programme a partir d'un autre.
Sub SendMail(ByVal strRecipient As String)

    'Use a With...End With block to reference the MsoEnvelope object.
    With Application.ActiveDocument.MailEnvelope

        'Add some introductory text before the body of the e-mail.
        .Introduction = "Please read this and send me your comments."

        'Return a Microsoft Outlook MailItem object that
        'you can use to send the document.
        With .Item

            'All of the mail item settings are saved with the document.
            'When you add a recipient to the Recipients collection
            'or change other properties, these settings persist.
            .Recipients.Add strRecipient
            .Subject = "Here is the document."

            'The body of this message will be
            'the content of the active document.
            .Send
        End With
    End With
End Sub

Merci de votre aide !
Messages postés
7
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 juin 2007

Super j'ai testé et ça marche !!! C'est le caractère & que je ne connaissais pas.

pour le retour a la ligne j'ai utilisé vbCrLf

ce qui donne le programme ci desosus au final lorsque je cliques sur mon bouton d'envoi:

Private Sub fiche_client_Click()
        EmailSubject = "URGENT / CLIENT / " & "Code Gedis: " & code_client.Text & " / " & "Société: " & nom_societe.Text & "Contact: " & nom_contact.Text 'Demande du sujet du message
        emailmsg = " Société: " & nom_societe.Text & vbCrLf & " Contact: " & nom_contact.Text & vbCrLf & " Activité: " & activite.Text & vbCrLf & " Siret: " & siret.Text ' Corps du message
        emaildest = InputBox("Indiquer le destinataire", "Destinataire")   'Demande de l'adresse email
        Dim ObjOutl As Object   'Déclaration des objets
        Dim objSession As Object
            Set ObjOutl = CreateObject("Outlook.Application")   'Création de l'objet Outlook
            Set objSession = ObjOutl.GetNamespace("MAPI")   'Création de l'objet de gestion des message
            Set ObjMessage = ObjOutl.CreateItem(0)   'Ajout d'un item pour le message
            objSession.Logon   'Connection à Outlook
            With ObjMessage
                .To = emaildest
                '.CC = ""
                .Subject = EmailSubject
                .Body = emailmsg
                '.Attachments.Add "c:\toto.txt"
                .Send
            End With


        'Suppression des objets (Vidage)
        Set ObjMessage = Nothing
        objSession.Logoff
        Set objSession = Nothing
        Set ObjOutl = Nothing
End Sub

Merci à vous deux pour l'aide importante apportée
++
Tiwan