Envoi mail via Excel conditionné par une case a cocher

Bonjour à tous, je suis débutant en VBA et j'ai pour projet d'améliorer le suivit d'envoie de fichiers réglementaires à une liste d'entreprises. Ces fichiers doivent être envoyées à chaque contact selon deux critères : 1 an s'est écoulé depuis le dernier envoi, un des fichier à été mis à jour. Ce sont des fiches sécurité et toutes ne doivent pas être envoyées à tous au même moment.

J'ai réussi avec pas mal de recherches à comprendre les fondement du fonctionnement et récupérant des morceaux de code à droite ou a gauche et modifiant légèrement j'ai réussi à obtenir un module qui crée un mail pour chaque destinataire référencé dans mon tableau, va chercher la pièce jointe et l'attache.

Seulement à chaque opération tous les destinataires ne sont pas concernés par les nouveaux fichiers mis à jour donc je souhaiterai ajouter une nouvelle colonne dans mon tableau ou je puisse sélectionner rapidement qui est concerné par l'envoi du mail.

POUR RESUMER : j'ai besoin d'insérer dans mon module une condition qui va faire que la ligne de mon tableau n'est prise en compte que si la case de la ligne est cochée

Voici mon module

module p1 module p2

Autant pour arriver à ca j'ai trouvé beaucoup de sujets, mais pour la partie "cocher case" je n'ai plus d'indice, j'ai tenté de modifier

If NomContact(i, 1) <> vbNullString Then

en,

If NomContact(i, 1) <> vbNullString and "ligne de code pour dire que si la checkbox est cochée = TRUE" Then

mais il ne reconnait pas mes éléments Checkbox que je défini mal, et j'imagine que comme j'ai une centaine de ligne à mon tableau, cela signifie que j'ai tout autant de case à cocher (une par ligne) donc je devrai également préciser dans le code qu'il y a Checkbox1, checkbox2, etc....

Voilà je suis totalement bloqué à ce stade, merci si vous pouvez m'apporter de l'aide à ce niveau.

BONUS : une fois que le mail à été généré j'aimerai qu'il indique dans la colonne A la date d'aujourd'hui afin de se souvenir à quel moment les un an sont passés, ca n'a rien à voir avec la première étape mais je commence à être perdu sur où ajouter les informations supplémentaires.

Option Explicit
Private OL_App As Object
Private OL_Mail As Object
Private sObjet As String, sCorps As String

Sub SendDocuments()
' Génération de mails personnalisés à différents destinataires avec pièce jointe adaptée.

Dim i As Long
Dim Cb As CheckBox
Dim NomContact As Variant, MailContact As Variant, PJ1 As Variant

' Initialisation
Application.ScreenUpdating = False

' Ouverture Outlook
On Error Resume Next
Set OL_App = GetObject(, "Outlook.Application")
If OL_App Is Nothing Then
Set OL_App = CreateObject("Outlook.Application")
End If
On Error GoTo 0

' Lecture paramètres du mail
sObjet = Range("I28").Value
sCorps = Range("I30").Value

' Lecture liste des contacts
NomContact = Range("I2:I4").Value
MailContact = Range("P2:P4").Value
PJ1 = Range("AI2:AI4").Value

' Génération du mail
For i = 1 To UBound(NomContact, 1)
If NomContact(i, 1) <> vbNullString Then
Call CreateNewMessage(NomContact(i, 1), MailContact(i, 1), PJ1(i, 1))
End If
Next i

MsgBox "Opération terminée."

Set OL_App = Nothing
Set OL_Mail = Nothing
Application.ScreenUpdating = True

End Sub

Private Sub CreateNewMessage(strContactName, strContactTo, strFName)
' Création d'un nouveau courriel et ses paramètres :

Set OL_Mail = OL_App.CreateItem(0)
With OL_Mail

 .To = strContactTo
 '.CC = "alias1@domain1.com"
 '.BCC = "alias2@domain1.com"

 .Subject = sObjet
 .Body = sCorps
 .BodyFormat = 1 'Format : 0=indeterminé; 1=texte; 2= HTML; 3=texte riche
 .Importance = 1 'Importance : 0=basse; 1=normale; 2= élevée
 .Sensitivity = 3 'Confidentialité : 0=normale; 1=personelle; 2=privée; 3=confidentielle
 .Attachments.Add (strFName)

' Choix : Envoyer ou Afficher le mail
 .Display
 '.Send
End With

Set OL_Mail = Nothing
End Sub

Bonjour,

En supposant que vous avez choisi des contrôles ActiveX pour vos CheckBox's et que ceux-ci sont placés en colonne Q, ci-dessous une solution avec une fonction "est_cochée"

Sub SendDocuments()
' Génération de mails personnalisés à différents destinataires avec pièce jointe adaptée.

    Dim i As Long
    Dim NomContact As Range, MailContact As Range, MailEnvoi As Range, PJ1 As Range

    ' Initialisation
    Application.ScreenUpdating = False

    ' Ouverture Outlook
    On Error Resume Next
    Set OL_App = GetObject(, "Outlook.Application")
    If OL_App Is Nothing Then
        Set OL_App = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0

    ' Lecture paramètres du mail
    sObjet = Range("I28").Value
    sCorps = Range("I30").Value

    ' Lecture liste des contacts
    Set NomContact = Range("I2:I4")
    Set MailContact = Range("P2:P4")
    Set MailEnvoi = Range("Q2:Q4")
    Set PJ1 = Range("AI2:AI4")

    ' Génération du mail
    For i = 1 To NomContact.Rows.Count
        If est_cochée(MailEnvoi.Rows(i)) Then
            Call CreateNewMessage(NomContact(i), MailContact(i), PJ1(i))
        End If
    Next i

    MsgBox "Opération terminée."

    Set OL_App = Nothing
    Set OL_Mail = Nothing
    Application.ScreenUpdating = True

End Sub

Function est_cochée(cell As Range) As Boolean
    Dim obj_lié As Object, ctrl As Object

    est_cochée = False
    For Each obj_lié In cell.Worksheet.OLEObjects
        Set ctrl = obj_lié.Object
        If TypeOf ctrl Is MSForms.CheckBox Then
            If cell.Address = obj_lié.TopLeftCell.Address _
            And ctrl.Value = True Then est_cochée = True
        End If
    Next obj_lié

End Function

NB : Apprenez à indenter votre code, il sera beaucoup plus lisible.

Merci pour la réponse. On s'approche du but, je ne savais vraiment pas du tout comment insérer une fonction case cochée.

En l'état le code que vous m'avez fourni ne fonctionne pas, lorsque je lance le débogage il m'indique que la ligne ".Attachments.Add (strFName)" pose problème. Si je la laisse ça me bloque totalement le programme... et si je la laisse cela fonctionne très bien, les mails sont générés seulement si la case est cochée, par contre il n'y a plus de pièce jointe associée au mail. Or j'ai besoin d'une pièce jointe (en réalité une dizaine même).

Bonjour,

Compléter la définition des variables de votre sous-procédure, ainsi :

Private Sub CreateNewMessage(strContactName As String, strContactTo As String, strFName As String)
' Création d'un nouveau courriel et ses paramètres :

Oh merci ça fonctionne exactement comme je souhaitais c'est incroyable !

Bonjour,

Je réalise des devis pour des prestations de maintenance ((ex : réparation d'une toiture de maison (sans devis) -> Chiffrage de la prestation -> envoi au client du chiffrage -> réception de la commande (après réparation) -> envoi en facturation).

Malheureusement, il arrive parfois que les clients oublient de nous renvoyer une commande et donc on ne peut pas facturer la prestation déjà réalisée.

Je passe énormément de temps à réaliser des relances avec les chiffrages en pièce jointe. Parfois j'ai plusieurs relances pour un même client.

D'où mon intérêt pour ce poste.

J'ai deux problématiques :

1. Je n'ai jamais utilisé de case à cocher activx (j'ai beau chercher je ne comprends pas les moyens de mise en oeuvre)

2. J'essaie d'apprendre, seule, à coder du VBA mais ça prends du temps et là je suis un peu dans la panade.

J'ai essayé de reprendre le code du dessus pour l'améliorer à ma façon mais ça fonctionne pas, je suis perdue.

Est-ce que quelqu'un peut m'aider ?

Merci,

Amélie

Bonjour,

1- évitez d'utiliser un message existant pour une nouvelle demande. Ouvrez un nouveau message spécifique à cette demande.

2- joignez un fichier modèle de ce que vous voulez réaliser.

C'est votre meilleure chance d'obtenir des réponses.

Si tu explicites ta demande et qu'elle est en lien avec le code que j'ai fourni je peux te l'expliquer mais n'étant pas un pro je ne pourrais peut être pas t'aider à la faire fonctionner.

Bonjour,

je reviens sur ce sujet quelques mois après. Mon fichier fonctionne toujours aussi bien mais à cause des centaines de case à cocher, le fichier est d'une lourdeur monstre à ouvrir...

Du coup j'avais pensé à exactement la même macro mais au lieu de s'activer quand la case est cochée, elle s'active quand la colonne B contient le chiffre 1 (par exemple), s'il n'y a pas le chiffre 1, rien ne se passe. Est-ce que quelqu'un aurait une idée ?

Pour se rendre un peu mieux compte j'ai fait une version test avec l'ancien code qui ne sert à priori plus à rien.

Donc l'objectif de ce fichier est de faire un mail au destinataire sélectionnés (ceux qui ont la case coché, c'est le symbole þ en wedlings) mais pas aux autres.

Pour l'instant dans le code il reste la fonctionnalité avec les cases à cocher mais ce ne sont plus de vrais objets physiques, mais simplement une valeur dans la case de la colonne B.

Je n'arrive pas à passer de l'un à l'autre. Merci pour votre aide.

Rechercher des sujets similaires à "envoi mail via conditionne case cocher"