Excel et Outlook - Macro

Bonjour à tous,

Je me permets de vous contacter pour me renseigner quant à la faisabilité de ce que j'aimerais faire avec un classeur.

En effet, j'explique mon projet ; dans le cadre de mon travail, je dois consulter certaines entités qui chacune ont leur adresse email. Il s'agit en l'occurrence de chantiers de travaux publics. J'ai donc créer un classeur regroupant ces entités avec leur adresse mail ainsi que les colonnes destinées aux réponses reçues ultérieurement. Le haut de mon tableau regroupe les informations générales : nom du chantier, date de démarrage, type de travaux, durée, etc

Ma première question est la suivante : est-il possible à l'aide d'un bouton de créer via une macro un email reprenant les adresse mail comme destinataires et un contenu de mail type dont la macro compléterait le texte avec les infos générales ?

Par exemple :

En cliquant sur le bouton, un brouillon de mail s'ouvre avec les adresses en destinataires dont le contenu pourrait être :

"Bonjour,

Veuillez troucer ci-joint notre demande pour le chantier suivant :

Nom : donnée issu du tableau excel

Date : donnée issu du tableau excel

Durée : ...

Merci d'avance

Cordialement".

Avant de me lancer dans de la programmation, j'aimerait savoir si cela est envisageable

Je profite de ma demande pour 2 autres questions qui sont normalement plus simple pour des professionnels d'excel :

* J'ai fusionner plusieurs cellules pour créer un encadré. Comment adapter le format d'une image collée à celui de mon cadre ? En effet, si l'image est plus petite pas de soucis, mai si celle-ci est plus grande j'aimerais qu'elle ne puisse pas sortir du cadre.

* Comment augmenter la taille d'une liste déroulante ? Il s'agit de nom et prénom dans la liste mais l'affichage permet seulement de voir le prénom, j'aimerais donc agrandir la fenêtre qui comporte la liste déroulante.

Je vous remercie d’avance pour le temps consacré à ma requête.

Cordialement

3 questions, je répond à la première :

Kratos01 a écrit :

Avant de me lancer dans de la programmation, j'aimerait savoir si cela est envisageable

OUI c'est faisable et assez simple !

Option Explicit
Sub envoi()
Dim messagerie As Object
Dim email As Object

    Set messagerie = CreateObject("Outlook.Application")
    Set email = messagerie.CreateItem(0)
    With email
        .to = Range("B1")
        .Subject = Range("B2")
        .body = Range("B3")
        .send
    End With
    Set email = Nothing
    Set messagerie = Nothing

End Sub

Bonjour,

Merci pour votre réponse rapide

Je suis en train d'essayer mais je ne suis pas un spécialiste macro..

Pour être sûr, quels paramètres dans votre code dois-je mettre à jour avec mon projet ?

En effet, j'ai essayé quelques modifications, créer le bouton, associer la macro mais rien ne se passe (le bouton d'enfonce mais rien ne se passe, même pas un message d'erreur)..

Les cellules qui comportes les informations du chantier et les cellules qui comportent les adresses mail doivent être en format texte ?

Poste un fichier simplifié, ce sera plus facile pour expliquer.

Les valeurs à modifier sont celles-ci :

        .to = Range("B1")
        .Subject = Range("B2")
        .body = Range("B3")

Bonjour Steelson,

C'est vrai que ça a l'air super facile !

Petite question : Si en place d'une seule cellule, je veux une plage dans le .Body... Comment dois-je l'indiquer ? Range ("B3:B15") par exemple n'a pas l'air de marcher.

Merci pour ce petit bout de code !

Cordialement,

Vbabeginner

Pour simplifier, je vous fait part de mon fichier avec des infos basics.

Dans ce cas là, j'aimerais qu'une fois que les infos du chantier au dessus de la feuille soit renseignées, cliquer sur le bouton "CONSULTER" et avoir un brouillon de mail comme l'image jointe (le texte en gras est tiré du tableau excel)

email
23check-list.xlsx (37.52 Ko)
VBABEGINNER a écrit :

Petite question : Si en place d'une seule cellule, je veux une plage dans le .Body... Comment dois-je l'indiquer ? Range ("B3:B15") par exemple n'a pas l'air de marcher.

Salut VBAdébutant, mais tu n'es plus un débutant !

Il faut prendre chaque cellule et la rajouter dans une zone texte :

  • soit on reste en texte brut (.body) et dans ce cas on sépare chaque cellule par "=0D0A" (code hexa du retour chariot)
  • soit on passe en html (.htmlbody) et dans ce cas on sépare chaque cellule par "<br/>"
Il y a aussi une 3ème possibilité plus souple : faire copier dans excel, afficher le message prêt à partir et faire un envoi de touches (sendkeys) Ctrl+V de excel vers outlook. Mais elle reste pointue et il faut ajouter des tempo.

Si je prends la formule html, cela donne à peu près ceci :

    zonetexte = ""
    For i = 3 To 15
        zonetexte = zonetexte & Range("B" & i) & "<br/>"
    Next i
    .To = Range("B1")
    .Subject = Range("B2")
    .htmlbody = zonetexte

ou plus élégant, faire

for each macellule in Range("B3:B15")

@ Kratos01

OK je vais adapter le code comme demandé, bien que je DéTESTE travailler sur un fichier excel avec cellules fusionnées

Sub envoi()
Dim messagerie As Object
Dim email As Object
Dim cel As Range
Dim destinataire As Range
Set messagerie = CreateObject("Outlook.Application")
    For Each service In Range("B11:B47")
        If service.Value <> "" Then
            liste = ""
            For Each destinataire In Range("O" & service.Row & ":AA" & service.Row)
                If destinataire.Value <> "" And destinataire.Value <> "-" Then
                    liste = liste + destinataire.Value + ";"
                End If
            Next destinataire
            If liste <> "" Then

                contenu = "Bonjour,<br><br>Veuillez trouver ci-joint une demande de consultation pour le chantier suivant :" _
                    & "<br>Nom du chantier :" & Range("F4") _
                    & "<br>Lieu :" & Range("F6") _
                    & "<br><br>D'avance merci,<br><br>Cordialement<br><br><i>Signature ici</i>"

                Set email = messagerie.CreateItem(0)
                With email
                    .to = liste
                    .Subject = "Check List"
                    .htmlbody = contenu
                    .display
                End With
                Set email = Nothing

            End If
        End If
    Next service
Set messagerie = Nothing
End Sub
31check-list.xlsm (43.16 Ko)

Bonjour Steelson,

Merci pour cette explication.

Je suis un peu moins débutant en Excel mais toujours très débuant en Vba ! Je me dépatouille un peu grâce au forum !

Bonne soirée,

Vbabeginner

Bonjour,

Je vous remercie pour le code, il marche très bien c'est ce que je voulais !

Le seul petit truc c'est que ça m'ouvre beaucoup de mail (un par contact). Est-il possible de n'avoir plus qu'un seul mail avec toutes les adresses ?

Je vais peut-être pousser un peu le truc mais dernière demande concernant mon projet ; j'ai un deuxième onglet qui reprend les informations du chantier et qui permet aux utilisateurs de coller une image ou une capture d'écran d'un plan afin de cibler une zone pour peaufiner la consultation. Est-il possible d'intégrer uniquement cet onglet en pièce jointe du mail grâce à la macro ? Je pense que non mais on ne sait jamais..

En tout cas, vous m'aidez beaucoup, merci

Je profite de ma réponse pour réitérer mes petites questions qui à mon avis sont faciles pour des spécialistes Excel comme vous

* J'ai fusionner plusieurs cellules pour créer un encadré. Comment adapter le format d'une image collée à celui de mon cadre ? En effet, si l'image est plus petite pas de soucis, mai si celle-ci est plus grande j'aimerais qu'elle ne puisse pas sortir du cadre.

* Comment augmenter la taille d'une liste déroulante ? Il s'agit de nom et prénom dans la liste mais l'affichage permet seulement de voir le prénom, j'aimerais donc agrandir la fenêtre qui comporte la liste déroulante. (La liste déroulante a été créer grâce à "Données" - "Validation de données" - etc). Je pourrai illustrer ma question si nécessaire.

Merci d'avance pour le temps consacré à mes requêtes.

Bonne Journée

Kratos01 a écrit :

Je vous remercie pour le code, il marche très bien c'est ce que je voulais !

Le seul petit truc c'est que ça m'ouvre beaucoup de mail (un par contact). Est-il possible de n'avoir plus qu'un seul mail avec toutes les adresses ?

A tester ...

Sub envoi()
Dim messagerie As Object
Dim email As Object
Dim cel As Range
Dim destinataire As Range
Set messagerie = CreateObject("Outlook.Application")
liste = ""

    For Each service In Range("B11:B47")
        If service.Value <> "" Then
            For Each destinataire In Range("O" & service.Row & ":AA" & service.Row)
                If destinataire.Value <> "" And destinataire.Value <> "-" Then
                    liste = liste + destinataire.Value + ";"
                End If
            Next destinataire
        End If
    Next service

If liste <> "" Then

    contenu = "Bonjour,<br><br>Veuillez trouver ci-joint une demande de consultation pour le chantier suivant :" _
        & "<br>Nom du chantier :" & Range("F4") _
        & "<br>Lieu :" & Range("F6") _
        & "<br><br>D'avance merci,<br><br>Cordialement<br><br><i>Signature ici</i>"

    Set email = messagerie.CreateItem(0)
    With email
        .to = liste
        .Subject = "Check List"
        .htmlbody = contenu
        .display
    End With
    Set email = Nothing

End If

Set messagerie = Nothing
End Sub

Bonjour Steelson,

C'est parfait ! ça marche nickel

Il me reste plus que mes petits soucis que j'avais mis dans mon précédent posts mais le code c'est bon, merci beaucoup !

Bonjour,

J'ai mis à jour le code avec les informations et la configuration de mon document et ça marche au top !

Je passe sur les questions précédentes mais j'en pose 2 dernières pour que mon fichier soit complet :

1. J'ai fusionné plusieurs cellule pour avoir un encadré. Comment coller une image à l'intérieur qui s’adapte ? En gros, si elle est plus petite tant mieux, si elle est trop grosse, elle s’adapte au cade et donc se réduit.

2. Avec le code établit précédemment, j'aimerais que le deuxième onglet de mon classeur soit pièce jointe de mon mail, est-ce possible ? Je renseigne les infos sur ma page principale puis je complète mon deuxieme onglet qui sera ma pièce jointe (idéalement PDF). Je pense que 'est peut-être réalisable avec PDF Créator que j'ai déja.

Merci d'avance pour le temps consacré à mes 2 dernières requêtes.

Bonne Journée !

Kratos01 a écrit :

1. J'ai fusionné plusieurs cellule pour avoir un encadré. Comment coller une image à l'intérieur qui s’adapte ? En gros, si elle est plus petite tant mieux, si elle est trop grosse, elle s’adapte au cade et donc se réduit.

Désolé, je ne vais pas pouvoir te répondre sur ce point, ouvre un autre post en mettant bien le sujet afin de capter les meilleurs experts sur le sujet !

Kratos01 a écrit :

2. Avec le code établit précédemment, j'aimerais que le deuxième onglet de mon classeur soit pièce jointe de mon mail, est-ce possible ? Je renseigne les infos sur ma page principale puis je complète mon deuxieme onglet qui sera ma pièce jointe (idéalement PDF). Je pense que 'est peut-être réalisable avec PDF Créator que j'ai déja.

pas besoin de PDF Créator, excel sait le faire.

Je t'envoie un bout de code ... tout de suite.


Sub envoi()

Dim messagerie As Object
Dim email As Object
Dim nompdf As String

    nompdf = Environ("Temp") & "\" & "fichier test"
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nompdf & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    Set messagerie = CreateObject("Outlook.Application")
    Set email = messagerie.CreateItem(0)
    With email
        .to = Sheets("param").Range("B1")
        .Subject = Sheets("param").Range("B2")
        .body = "test"
        .Attachments.Add nompdf & ".pdf"
        .display
    End With
    Set email = Nothing
    Set messagerie = Nothing

    Kill Environ("Temp") & "\" & "fichier test" & ".pdf"

End Sub

Tu peux bien sûr remplacer ActiveSheetpar le nom de la feuille concernée. Et donner un autre nom que fichier test !

Excel va enregistrer sous un fichier temporaire une copie comme impression de la feuille concernée, et la joindra au courriel.

J'espère que c'est assez clair...

Merci de répondre aussi vite !

Alors si Excel le fait en direct c'est encore mieux. Par contre, je dois intégrer ce code dans le précédent pour faire un seul bouton de commande... Etant très débutant dans les macros, ce code peut s'intégrer directement ? Je pense qu'il s'agit d'ajouter cela entre le destinataire et l'objet..

J'ai essayé en intégrant :

Dim nompdf As String ' dans la liste des Dim

nompdf = Environ("Temp") & "\" & "Croquis"

.Attachments.Add nompdf & ".pdf" ' dans le "with" du mail

Kill Environ("Temp") & "\" & "fichier test" & ".pdf" ' en fin de code

J'ai remplacé ActiveSheet.ExportAsFixedFormat par Croquis.ExportAsFixedFormat car Croquis est le nom de mon deuxième onglet mais le code affiche une erreur. Sinon en laissant ActiveSheet, rien ne se passe quand je clique sur le bouton.. J'ai peut-être mail intégré le nouveau code..

Serait-il possible d'avoir le code que vous aviez fait pour le brouillon de mail avec l'intégration de votre 2eme code ?

Un grand merci en tout cas

Pour l'autre question, c'est un détail je vais essayer de creuser mais si je n'ai pas de réponse ce n'est pas grave

essaie ceci (attention, je n'ai pas pu tester ... tu y étais presque je pense) ! bravo

Sub envoi()
Dim messagerie As Object
Dim email As Object
Dim cel As Range
Dim destinataire As Range
Dim nompdf As String

    nompdf = Environ("Temp") & "\" & "Croquis"
    Sheets("Croquis").ExportAsFixedFormat Type:=xlTypePDF, Filename:=nompdf & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

Set messagerie = CreateObject("Outlook.Application")
liste = ""

    For Each service In Range("B11:B47")
        If service.Value <> "" Then
            For Each destinataire In Range("O" & service.Row & ":AA" & service.Row)
                If destinataire.Value <> "" And destinataire.Value <> "-" Then
                    liste = liste + destinataire.Value + ";"
                End If
            Next destinataire
        End If
    Next service

If liste <> "" Then

    contenu = "Bonjour,<br><br>Veuillez trouver ci-joint une demande de consultation pour le chantier suivant :" _
        & "<br>Nom du chantier :" & Range("F4") _
        & "<br>Lieu :" & Range("F6") _
        & "<br><br>D'avance merci,<br><br>Cordialement<br><br><i>Signature ici</i>"

    Set email = messagerie.CreateItem(0)
    With email
        .to = liste
        .Subject = "Check List"
        .htmlbody = contenu
        .Attachments.Add nompdf & ".pdf"
        .display
    End With
    Set email = Nothing

End If

Kill Environ("Temp") & "\" & "fichier test" & ".pdf"
Set messagerie = Nothing
End Sub

 

Effectivement Steelson, je n'étais pas loin !

Ce coup-ci c'est top ça marche nickel, le fichier pdf correspond à ce que je veux ! Seul hic, une message d'erreur s'affiche (alors que tout marche..)

bug

Si tu cliques sur Débogage, quelle est la ligne surlignée ?


j'ai vu

Kill Environ("Temp") & "\" & "fichier test" & ".pdf"

à remplacer par

Kill Environ("Temp") & "\" & "Croquis" & ".pdf"

Bonjour Steelson,

Effectivement c'était bien ça !

Tout est bon, tout est parfait, merci beaucoup pour le coup de pouce en tout cas

Bonne Journée

Rechercher des sujets similaires à "outlook macro"