Envoi mail via macro pour fonctionner sur toutes les feuilles
Bonjour le forum,
J'espère que vous allez bien.
Je viens vers vous car j'ai un souci sur une macro que j'ai essayé d'adapter.
Ce que je souhaite c'est que ma macro d'envoi de mail automatique fonctionne sur toutes les feuilles du classeur.
Voici le code :
Sub Envoi_mail_2()
Dim ws As Worksheet
Sheets("1").Select 'Ici nom du premier onglet
Application.ScreenUpdating = False
For Each ws In ActiveWorkbook.Worksheets
ws.Activate
' Définition des variables et du client de messagerie utilisé
Dim Salarié As String
Dim jour_ouvré As Date
Dim début_droit As Date
Dim message As String
Dim i As Long
Dim OLApplication As Object, OLMail As Object
Set OLApplication = CreateObject("Outlook.Application")
With ws.ListObjects(1)
For i = 1 To .ListRows.Count
Salarié = .ListColumns("Salarié").DataBodyRange(i)
jour_ouvré = 0 ' Pour dire que la colonne n'a pas forcément que des dates
If IsDate(.ListColumns("jour_ouvré").DataBodyRange(i)) Then jour_ouvré = .ListColumns("jour_ouvré").DataBodyRange(i) 'condition sur la date, si c'est la date du jour alors action
début_droit = .ListColumns("début_droit").DataBodyRange(i)
If jour_ouvré = Date Then ' Condition = date correspondante
' Envoi du mail
Set OLMail = OLApplication.CreateItem(0) ' Crée un message dans outlook
With OLMail
.To = "test@ik.me" ' Destinataire
'.CC = 'destinataire en copie
'.BCC = CopieCarboneInvisible 'Destinataire en Copie Caché (je n'en ai pas besoin)
'.Importance = olImportanceNormal 'Niveau importance du mail
.Subject = "Mise en place TR " & Salarié & "" 'Sujet du mail
'.Categories = "Daily"
.Display ' Afficher l'email avant d'envoyer manuellement
message = "Mettre en place les tickets restaurant pour " & Salarié & " avec un début de droit le " & début_droit & "."
.HTMLBody = message & .HTMLBody
' .Attachments.Add CheminDestination ' Pièce jointe (je n'en ai pas besoin)
' .OriginatorDeliveryReportRequested = True ' Accusé de dépôt (je n'en ai pas besoin)
' .ReadReceiptRequested = True ' Accusé de lecture (je n'en ai pas besoin)
'.Send ' Envoi du mail sans visualisation
End With
End If
Next i
Set OLMail = Nothing
End With
Set OLApplication = Nothing
Next ws
End Sublorsque j'utilise le débogage il me pointe la ligne :
début_droit = .ListColumns("début_droit").DataBodyRange(i)Voici le fichier :
Merci d'avance pour votre aide :)
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Bonjour,
La variable est déclarée en tant que date et ne peut pas recevoir du vide comme valeur. C'est ce qu'il se passe pourtant vu qu'il n'y a pas de données dans ton tableau. Il faudrait donc tester si la donnée est vide ou non et n'attribuer la valeur que si elle n'est pas vide. Ou mettre des dates dans ta colonne.
Je n'ai pas tout compris mais j'ai rajouté
début_droit = 0et j'ai rajouté la condition Oui à la colonne TR qui calcule les dates. Cependant parfois c'est Non ou rien et du coup les dates ne se calculent pas.
Maintenant au débogage il me pointe
With ws.ListObjects(1)
J'ai réussi avec chatgpt
Sub Envoi_mail_2()
Dim ws As Worksheet
Dim OLApplication As Object, OLMail As Object
Dim Salarié As String
Dim jour_ouvré As Date
Dim début_droit As Date
Dim message As String
Dim i As Long
Set OLApplication = CreateObject("Outlook.Application")
Application.ScreenUpdating = False
For Each ws In ActiveWorkbook.Worksheets
' Traiter uniquement les feuilles qui contiennent des ListObjects (tables)
If ws.ListObjects.Count > 0 Then
For Each lo In ws.ListObjects
With lo
For i = 1 To .ListRows.Count
Salarié = .ListColumns("Salarié").DataBodyRange(i)
jour_ouvré = 0 ' Pour dire que la colonne n'a pas forcément que des dates
début_droit = 0 'Pour dire que la colonne n'a pas forcément que des dates
' Vérifier si la valeur dans la colonne "jour_ouvré" est une date
If IsDate(.ListColumns("jour_ouvré").DataBodyRange(i)) Then
jour_ouvré = .ListColumns("jour_ouvré").DataBodyRange(i)
End If
' Vérifier si la valeur dans la colonne "début_droit" est une date
If IsDate(.ListColumns("début_droit").DataBodyRange(i)) Then
début_droit = .ListColumns("début_droit").DataBodyRange(i)
End If
If jour_ouvré = Date Then ' Condition = date correspondante
' Envoi du mail
Set OLMail = OLApplication.CreateItem(0) ' Crée un message dans Outlook
With OLMail
.To = "test@ik.me" ' Destinataire
.Subject = "Mise en place TR " & Salarié ' Sujet du mail
.Display ' Afficher l'email avant d'envoyer manuellement
message = "Mettre en place les tickets restaurant pour " & Salarié & " avec un début de droit le " & début_droit & "."
.HTMLBody = message & .HTMLBody
End With
End If
Next i
End With
Next lo
End If
Next ws
Set OLApplication = Nothing
Application.ScreenUpdating = True
End Submerci @21Formatic de t'être plongé dans mon problème.
Bonne journée
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Ahah, chat gpt a fait ce que j'avais suggéré. Un test (if ... Then ... Else) a été rajouté et vérifie si une date est présente sur la ligne concernée dans la colonne début. Si c'est une date, alors la variable reçoit la valeur correspondante.