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 Sub

lorsque j'utilise le débogage il me pointe la ligne :

  début_droit = .ListColumns("début_droit").DataBodyRange(i)

Voici le fichier :

20suivi-rh-test.xlsm (73.89 Ko)

Merci d'avance pour votre aide :)

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 = 0

et 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 mais j'avoue je n'ai rien compris

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 Sub

merci @21Formatic de t'être plongé dans mon problème.

Bonne journée

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.

Rechercher des sujets similaires à "envoi mail via macro fonctionner toutes feuilles"