Envoi d'un mail via Outlook à partir d'un fichier excel. VBA

Bonjour,

Je me permets de vous demander votre aide afin d'envoyer un e-mail via outlook à partir d'un fichier excel (version 2010).

J'ai déjà parcouru pas mal de post traitant ce sujet sur ce forum (et sur d'autres) mais je suis complétement perdu.

Je suis actuellement stagiaire dans une entreprise de BTP et on m'a demandé de réaliser un planning qui regroupe les locations. Jusque là pas de problème, mes petites connaissances en excel suffisent.

Là où je suis bloqué, c'est que je voudrais envoyer automatiquement un e-mail lorsqu'une location s'arrête.

Mon fichier est pour l'instant le suivant:

181planning-chef.xlsx (31.88 Ko)

J'ai mis en exemple une location d'une pelle à pneu chez l'entreprise X

Pour l'exemple, j'ai mis une location de trois jours.

Donc à partir de là, je ne sais pas trop comment faire.

Je voudrais envoyer un mail dont j'aurais prédéfini le texte (dans mon onglet liste par exemple) à l'entreprise X (dont j'aurais renseigné l'adresse dans l'onglet "liste" également).

Sauf que je n'y connais rien du tout en VBA. Durant mes études, j'ai appris quelques rudiments de Python mais c'est tout.

Il me faudrait donc des conseils pour créer un code qui me permettrait de récupérer le nombre de jours où ma pelle a travaillé (dans mon exemple: 3j), le nom de l'entreprise inscrit dans la colonne (dans mon exemple X) et qui le relierait à son adresse mail renseignait dans un autre onglet, et qui s'enverrait lorsque le mot "FIN" (ou autre si ça vous arrange plus) est inscrit dans la case, comme dans mon exemple.

Je ne sais pas si j'ai été clair, ni si ce que je demande est faisable assez facilement.

En tout cas, merci d'avance à ceux qui prendront le temps de m'aider. Et si vous avez des questions pour clarifier quelque chose, n'hésitez pas

David

Bonjour, envoyer un email n'est pas ce qu'il y a de plus contraignant à coder.

Par contre écrire un code sur un fichier sans base de donnée là c'est vraiment chiant.

Il faut programmer un va et vient permanant du curseur d'excel pour allé chercher une information ici, descendre de trois cases, remonter en haut et copier. Repartir par là. S'arrêter, redescendre. Coller. puis remonter. Allé jusqu'à la dernière case. Redescendre de 8 lignes. Copier. Changer de feuille. aller à droite de 4 cases, collez. Revenir sur l'autre feuille. Effacer...pfiouuu c'est fatiguant tout ça !

Donc si je peux me permettre un précieux conseil...Orientez votre réflexion sur la création d'une base de donnée dans les règles de l'art puis ce sera plus facile pour vous et nous de venir piocher dedans pour afficher ce que vous voulez.

Voici un lien (à la base prévu pour Access) mais qui parle un peu de comment il faut s'y prendre.

https://support.office.com/fr-fr/article/Concepts-de-base-sur-la-conception-d-une-base-de-donn%C3%A9es-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5

Salutations

Bonjour,

Tout d'abord un grand merci pour avoir pris un peu de temps pour me répondre

Concernant la base de données, je compte bien sur faire un "tableau" reliant l'entreprise à son adresse mail.

Mais le but de mon programme serait qu'à partir du planning, excel récupère automatiquement le nom de l'entreprise, l'engin utilisé et envoie un email (type et écrit à l'avance et où il ne reste plus qu'à rajouter automatiquement l'engin) à cette dite entreprise pour dire que la location de l'engin s'arrête.

Je ne sais donc pas si c'est faisable. Et si c'est faisable, est ce que dans le code on peut renvoyer aux cellulles aussi facilement que dans excel....

Merci d'avance

Bonjour david ge.

Avant tout chose sachez que dans votre fichier il n'y a aucun exemple, juste des entêtes de lignes et de colonnes.

je vous ai joint une image, si vous décidez de lister vos réservations selon cette structure, le code ne sera pas très long à écrire.

Si au contraire, vous souhaitez garder votre mise en forme originale (onglet "chef" ?) alors patienter qu'une autre personne que moi s'attèle à vous conseiller au mieux.

Salutations.

sans titre

Re-bonjour

Et encore merci de prendre du temps pour m'aider.

Avant d'avoir vu votre message et comprenant la complexité de ce que je voulais faire, j'avais changé d'optique.

J'ai donc créer un nouvel onglet "Email" à partir duquel on enverra les mails en renseignant manuellement quelques informations primordiales:

-la date d'arrêt

(avec la date du jour renseignée pour plus de rapidité mais modifiable par l'opérateur)

-Le numéro de chantier sur lequel se trouve l'engin

(à renseigner par l'opérateur)

-Le ou les engins qui sont à arrêter

(qui sont sous forme de menu déroulant via une liste, pour plus de facilité pour l'opérateur)

103planning-chef.xlsx (40.33 Ko)

Si je vous suis bien, cela représente la base de données que vous me conseilliez de faire dans votre premier message

Et cela revient quasi à la forme que vous me proposez dans votre dernier message

Êtes-vous d'accord avec moi?

La forme est-elle en accord avec ce que vous me demandiez de faire?

Merci encore,

Oui c'est tout à fait ça. ensuite il suffit de créer une colonne "Echéance" d'y integrer le calcul de la date de fin - aujourdhui(). Puis de faire une boucle qui lis toutes les dates d'échéances et execute l'envoi d'un mail si une valeur est égale à zéro.

Dans l'immédiat, avant que le fichier soit opérationnel il faut :

Construire votre base de donnée réservation

Retravailler votre onglet "liste" car là aussi il y en a de partout et ce n'est pas bon.

Si vous avez dix huit listes à faire, vous les écrivez dans 18 colonnes différentes mais vous ne devez pas dans une colonne, mettre deux éléments de deux listes différentes.

une fois que vous avez retravaillé tout ça vous repostez votre fichier est en très peu de temps un code sera proposé.

J'ai l'impression de me répéter, mais encore un grand merci!

J'ai remodifié mon onglet "liste" en mettant une liste par colonne, comme vous me l'avez conseillez.

78planning.xlsx (36.27 Ko)

Concernant la base de donnée, j'ai inséré, dans mon onglet "mail", une fonction SI couplé à une fonction RECHERCHEV pour relier l'entreprise à son adresse mail. Mais à part ça je n'ai rien modifié par rapport à la version précédente.

Y avait-il quelque chose de particulier à faire?

En revanche, je rebondis sur la colonne "Echeance". Mon but n'est pas d'envoyer un mail un jour précis, c'est d'envoyer un mail au moment où l'opérateur vient remplir les informations.

Dans la location de ce type d'engin, on ne sait pas réellement la durée de location qui peut varier très rapidement en fonction des chantiers (là toute la difficulté), donc ne serait-il pas possible de programmer l'envoi de l'email d'une autre manière que par "date de fin-aujourdhui()" ?

Par exemple en mettant une croix dans une colonne ou simple idée: lorsqu'on appuie sur l'adresse E-mail qui s'affiche quand on choisit l'entreprise?

Je ne sais pas ce qui est faisable assez facilement comme solution.

Merci d'avance

En attendant une réponse pour faire selon la base de donnée créée. J'ai essayé de faire selon ma première idée.

En fait, je me suis rendu compte qu'il me fallait qu'une seule information se trouvant dans un autre onglet. Tous les autres sont données par mon onglet sur lequel s'effectue ma macro.

Je vous remets le fichier avec un exemple de ce qui devrait être renseigné pour que le mail s'envoie automatiquement .

152test.xlsx (45.57 Ko)
  • L'engin qui m'intéresse est la pelle_à_pneu
  • L'entreprise est l'entreprise COURTOIS, j'ai renseigné son adresse mail dans l'onglet "liste"
  • Le numéro de chantier (AAA000) se trouve à la ligne 1 de la colonne active
  • La date (18mai) à la ligne 3 de la colonne active
  • Le chef de chantier a son nom renseigné ligne 1 colonne A et son prénom renseigné ligne 1 colonne B (cela est fixe)

L'idéal serait que lorsque je renseigne le mot "FIN" comme dans l'exemple un mail soit automatiquement envoyé à l'entreprise COURTOIS:

"Bonjour,

L'engin Pelle à pneu s'arrête le 18mai à l'horaire indiqué sur le bon signé par le chef de chantier

Ce matériel était utilisé par le chef de chantier Monsieur X Y sur le chantier dont le numéro est AAA000

Merci"

NB: le nombre de jour que la pelle a travaillé n'est pas important

J'ai donc essayé de coder un programme (je débute tout juste) et évidemment il ne fonctionne pas (Le contraire m'aurait franchement étonné)

Mais je me suis dit que si je vous le postais, vous comprendriez peut être plus facilement ce que je désire faire.

Sub Envoimail()

Dim OutApp As Object
Dim OutMail As Object
Dim L As Integer 'Déclaration de variable "L" pour connaitre la ligne Numéro
Dim C As Integer 'Déclaration de variable "C" pour connaitre la colonne
Dim i As Integer
Dim Engin As String 'Déclaration de variable pour récupérer le type d'engin
Dim Entreprise As String 'Déclaration de variable pour Récupération du nom de l'entreprise
Dim Numéro_chantier As String 'Déclaration de variable pour récupération du numéro de chantier
Dim Nom_Chef As String 'Déclaration de variable pour récupération nom du chef de chantier
Dim Prenom_Chef As String 'Déclaration de variable pour récupération prénom du chef de chantier
Dim Adresse_mail As String 'Déclaration de variable pour recevoir l'adresse mail
Dim jour As String 'Déclaration de variable pour récupérer la date

L = ActiveCell.Row 'Récupération Numéro de ligne de la cellule active
C = ActiveCell.Column 'Récupération Numéro de colonne de la cellule active

Nom_Chef = Worksheets("Compas").Cells(1, 1) 'Nom du chef de chantier
Prenom_Chef = Worksheets("Compas").Cells(1, 2) 'Prénom du chef de chantier

If ActiveCell = "Fin" Then
    Engin = Worksheets("Compas").Cells(L, (C - 1)) 'Récupération Nom de l'engin utilisé
    Entreprise = Worksheets("Compas").Cells((L + 1), (C - 1)) 'Récupération Nom de l'entreprise issu de la colonne à gauche de la celulle active
    Numéro_chantier = Worksheets("Compas").Cells(1, C) 'Récupération Numéro de chantier issu de la première ligne de la colonne de la celulle active
    jour = Worksheets("Compas").Cells(3, C) 'Récupération Date issu de la troisième ligne et de la même colonne
    Adresse_mail = Worksheets("Compas").VLookup(Worksheets("Compas").Cells((L + 1), (C - 1)), Worksheets("Liste").Range("A4:B100"), 2, 0) 'Mail issu d'une rechercheV d'une autre feuille appelée "Liste"

    Set OutApp = CreateObject("Outlook.Application") 'Procédure Envoi du mail
    OutApp.Session.Logon
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next
        With OutMail
            .To = Adresse_mail 'Récupération de l'adresse mail à partir de la variable, adressse qui a été récupéré par un rechercheV
            .CC = "dave59_318@hotmail.com" 'Mail pour le test
            .Subject = "Arrêt de l'engin" 'Objet du mail
            .BodyFormat = olFormatHTML
            .HTMLBody = "Bonjour," & Chr(10) & "La location de" & Engin & "s'arrête le " & jour & " à l'horaire renseigné sur le bon signé par le chef de chantier" & Chr(10) & "Le matériel était utilisé par le chef de chantier" & Nom_Chef & Prenom_Chef & "sur le chantier dont le numéro est le suivant " & Numéro_chantier & Chr(10) & "Merci" & Chr(10) & "Mr X"
        ' Texte du mail
        End With

        Set OutMail = Nothing
        Set OutApp = Nothing
End If
End Sub

Merci d'avance à ceux qui tenteront de m'aider à trouver une solution.

Si celle-ci n'est pas possible, je peux tout à fait me rabattre sur la solution proposé par excelator

Personne?

Rechercher des sujets similaires à "envoi mail via outlook partir fichier vba"