VBA: Comment envoyer directement depuis excel un mail

Fermé
Saajo Messages postés 7 Date d'inscription vendredi 18 janvier 2019 Statut Membre Dernière intervention 14 juin 2019 - Modifié le 11 juin 2019 à 19:56
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 - 14 juin 2019 à 00:47
Bonjour,

Je bloque complètement sur un code permettant d'envoyer un mail depuis une feuille excel. Alors je profite de la communauté pour vous envoyer cette demande afin que vous puissiez me guider à travers cette longue traversé du désert :-)

L'objectif:
Idéalement, à partir d'un code VBA, réussir à envoyer une sélection de chacune des feuilles (cellule A1 jusqu'à la dernière ligne renseignée) à chacun des destinataires correspondants.

Voici le premier morceau de code déjà créer:

'Déclaration de variable

Dim OutlookApp As Object
Dim OutlookMail As Object
Dim i As Byte

Sub Email()


For i = 2 To ThisWorkbook.Worksheets("abekkal").Range("D" & Rows.Count).End(xlUp).Row

Set OutlookApp = CreateObject("outlook.application")
Set OutlookMail = OutlookApp.CreateItem(0)

On Error Resume Next
ActiveSheet.Select

Application.ScreenUpdating = False

NbLigne = Ws.Range("A" & Application.Rows.Count).End(xlUp).Row

Ws.Range("A1:G" & NbLigne).Select

With Selection.Parent.MailEnvelope.Item

.To = Ws.Range("J2").Value



.Subject = "Relance facture(s) non approuvée(s)"

.Send

End With

Next i

On Error Resume Next
ActiveSheet.Next.Select

MsgBox "votre mail à été envoyé.", vbInformation + vbOKOnly, "CONFIRMATION ENVOI MAIL"

Application.ScreenUpdating = True

End Sub


Le deuxième morceau créer et qui fonctionne uniquement pour l'onglet "feuil2 »
Sub EnvoiMail()

'Déclaration de variable

Dim Mafeuille As Worksheet 'La feuille contenant le tableau à envoyé
Dim NbLigne As Integer 'Nombre de lignes à récupérer

'Affectation des variables
Set Mafeuille = ThisWorkbook.Sheets("abekkal") 'on defini la feuille sur laquelle on envoi le tableau de bord

'Désactivation du raffraichissement de l'écran
Application.ScreenUpdating = False

'On calcule le nombre de ligne à prendre dans la feuille à partir de la colonne A
NbLigne = Mafeuille.Range("A" & Application.Rows.Count).End(xlUp).Row

'On séléctionne la plage à copier
Mafeuille.Range("A1:G" & NbLigne).Select

'Envoyé le tableau dans le corps d'un mail avec l'instruction VBA "MailEnvelope"
With Selection.Parent.MailEnvelope.Item

'Destinataire Direct
.To = Mafeuille.Range("J2").Value



'Objet du mail
.Subject = "Relance facture(s) non approuvée(s)"

'Envoi du mail
.Send

End With

MsgBox "votre mail à été envoyé.", vbInformation + vbOKOnly, "CONFIRMATION ENVOI MAIL"

Application.ScreenUpdating = True


End Sub

J'ai également mis a votre disposition les copie écran au format JPEG;

Merci d'avance pour votre aide,
Saajo



Configuration: Windows / Chrome 72.0.3626.121

2 réponses

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
11 juin 2019 à 21:03
bonjour, merci d'utiliser les balises de code pour partager un programme.
as-tu une question, comment pouvons-nous t'aider?
0
Merci pour ton retour YG_BE.

Désolé, mais je ne comprends ta remarque concernant les balises.

L'objectif est de faire une boucle prenant en compte une sélection par feuille, à envoyer pour chaque contact correspondant.

Je souhaiterais faire une boucle qui ferait l'action suivante:

Sélectionner/copier les données à partir de la feuille n°4 nommée "abekkal"
Coller dans un mail outlook
Envoyer le mail
Passer à la feuille suivante
Répéter la même action ci-dessus jusqu'à la fin des feuille du classeur

J'ai tenté de créer une boucle à partir de For ou For Each mais aucune des deux fonctionnent.
Néanmoins ma deuxième macro sans la boucle fonctionne pour la feuille "abekkal". Hors, cela voudrais dire que je dois répéter le code au tant de fois qu'il existe de feuille, et multiplierais le nombre de ligne du code.

Je pense que le problème provient de la sélection de la feuille qui désigne une feuille précise et non une feuille une par une. Ci dessous mon code est celui-ci:

=> Set Mafeuille = ThisWorkbook.Sheets("abekkal")

Cela permet de définir la feuille sur laquelle on sélectionne les données et ensuite que l'on colle dans le mail pour envoi.

Idéalement, il faudrait avoir un code permettant de choisir feuille après feuille une fois l'action est terminer.

J'espère avoir été claire et précis.

Encore merci pour ton aide,
Saajo
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
12 juin 2019 à 16:58
voici les explications à propos des balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
12 juin 2019 à 17:11
peut-être ainsi:
Dim x As Integer, maFeuille As Worksheet
For x = 4 To ThisWorkbook.Sheets.Count
    Set maFeuille = ThisWorkbook.Sheets(x)
    '....
Next x
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
13 juin 2019 à 08:32
si tu veux parcourir toutes les feuilles:
for each maFeuille in ThisWorkbook.Sheets
       '....
Next maFeuille 

autre façon de faire une boucle en commençant par une feuille au choix:
Set maFeuille = ThisWorkbook.Sheets("abekkal")
Do While maFeuille.Index <> ThisWorkbook.Sheets.Count
    '...
    Set maFeuille = ThisWorkbook.Sheets(maFeuille.Index + 1)
Loop
0
Saajo Messages postés 7 Date d'inscription vendredi 18 janvier 2019 Statut Membre Dernière intervention 14 juin 2019
Modifié le 13 juin 2019 à 13:51
Bonjour YG_BE,
Merci pour ton retour et l'aide apportée au sujet (très sympa).

Pour des raison de productivité, j'ai complètement contourné le sujet de la boucle des feuilles en passant par une seule et même feuille appelé "KPI Board" (ci-joint copie écran).



Mon code permettant d'envoyé des mails en masse est celui-ci (il fonctionne, mais n'est pas parfait!):


Sub EnvoiMail()

'Déclaration de variable

Dim LeMail As Variant
Dim Ligne As Integer
Dim LastRow As Integer

'Affectation des variables

Set LeMail = CreateObject("Outlook.Application")

Sheets("KPI Board").Select
LastRow = Range("J40000").End(xlUp).Row

'Départ boucle'
For Ligne = 2 To LastRow

Application.ScreenUpdating = False

    With LeMail.CreateItem(olMailItem)
    
    .To = Range("J" & Ligne) 'SI VIDE ALORS PASSER LA CELLULE EN DESSOUS'
    .Subject = "Relance facture non validées"
    .Body = "Bonjour," & Chr(10) & Chr(13) & "Veuillez trouver ci-desous la liste des factures non encore validées dans ARIBA:" & Chr(10) & Chr(13) & "Référence Ariba: " & Range("A" & Ligne) & "  -  " & "Supplier: " & Range("B" & Ligne) & "  -  " & "Requester: " & Range("C" & Ligne) & "  -  " & "Approbateur: " & Range("D" & Ligne) & "  -  " & "Date d'affectation: " & Range("E" & Ligne) & "  -  " & "Délai de retard: " & Range("G" & Ligne) & " Jours" & Chr(10) & Chr(13) & "Merci de bien vouloir valider dans ARIBA les factures en attentes de validation." & Chr(10) & Chr(13) & "Bonne Journée." & Chr(10) & Chr(13) & "Cordialement," & Chr(10) & Chr(13) & "Service Comptabilité"
    '.CC = "CDFR.RIRE@AYO.COM"

    .Display
       
    End With

Next Ligne

MsgBox "votre mail à été envoyé.", vbInformation + vbOKOnly, "CONFIRMATION ENVOI MAIL"

Sheets("Commande Macro").Select
Range("A1").Select

Application.ScreenUpdating = True


End Sub



Néanmoins, j'ai deux problématiques:

1er Problématique: Lorsque la colonne "J" correspondant au destinataire est VIDE, il me génère une erreur d’exécution avec le message suivant: "le destinataire n'est pas renseigné. assurez vous qu'une valeur soit renseigné".
Normale, puisque la cellule "J5" est vide!
L'objectif ici serait de créer une condition du style: si cellule vide alors passé à la cellule suivante.

2e Problématique: le code n'est pas parfait car il m'envoi un mail pour chaque ligne. C'est à dire pour un même destinataire j'aurai autant de mail envoyé que de lignes. Pas cool pour le destinataire!
L'objectif ici, serait une condition qui dirait: si plusieurs fois le même destinataire alors envoyé l'ensemble des lignes sur un même mail.

Bah voila, voici mon dernier travail actualisé.
Si tu peux m'apporté ton aide sur les 2 problèmatiques citées ci-dessus, cela serait TOP.

Encore merci pour ton temps et dispo.
Bonne journée.
José
0
Saajo Messages postés 7 Date d'inscription vendredi 18 janvier 2019 Statut Membre Dernière intervention 14 juin 2019
13 juin 2019 à 13:50
0