IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Envoi de mails automatisé [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Par défaut Envoi de mails automatisé
    Bonjour à tous,

    Je cherche à automatiser un processus bien précis dans Excel (d'où le nom un peu vague de ma discussion, désolée). J'ai joins une capture d'écran de mon tableau de test pour que vous comprenniez mieux Nom : Tableau Excel.PNG
Affichages : 139
Taille : 9,6 Ko

    J'ai donc un tableau avec une entrée qui liste des documents (Rapport 1, Rapport 2...), et une autre entrée qui liste des personnes (noms, emails). Les signes "O" représentent les diffuseurs de documents, et les signes "X" ceux qui les recoivent.

    Exemple : le document "Rapport 3" est diffusé par Jacques, et est reçu par Dominique et Pierre.

    J'aimerais automatiser tout ça pour que à chaque document à envoyer, je n'ai pas besoin de chercher dans le tableau qui est receveur (c'est un tableau de test, en vrai il est amené à être bien plus fourni...). J'imagine un bouton qui, lorsqu'on clique dessus :
    1. Ouvre une boite de dialogue pour aller chercher le document à envoyer
    2. Ensuite une liste déroulante basée sur la ligne 2 du tableau qui propose de sélectionner le type de document (Rapport 1, Rapport 2...)
    3. La macro parcours la colonne du document sélectionné dans la liste déroulante pour trouver toutes les personnes notées X
    4. Envoi par mail aux receveurs

    Pour ce qui est de la partie envoi du mail ça devrait être bon, mais je suis complètement perdue pour la partie liste déroulante. J'ai d'ailleurs même du mal à trouver un début de macro à adapter à ma situation, est ce que c'est au moins possible ?

    Et évidemment, si mon idée est trop usine à gaz et que vous avez une meilleure procdédure, je suis preneuse également.

    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 419
    Par défaut
    Bonjour,

    Plutôt que d'ouvrir un formulaire, je proposerais de préparer l'email en partant d'un double-clic sur la colonne. Un début de solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Option Explicit
     
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        Dim kC As Long, kR As Long, kR0 As Long, kMail As Long, sDestinataires As String
        If Intersect(Target, [Tableau1[#All]]) Is Nothing Then
            '--- rien, est hors tableau
        Else
            kC = Target.Column
            kMail = [Tableau1[Email]].Column
            kR0 = [Tableau1[#Headers]].Row
            For kR = kR0 + 1 To kR0 + [Tableau1].Rows.Count
                If Cells(kR, kC) = "X" Then
                    sDestinataires = sDestinataires & "; " & Cells(kR, kMail)
                End If
            Next kR
            MsgBox "Envoyer le doument: " & Cells(kR0, kC) & vbLf & vbLf & _
                   "à: " & Mid(sDestinataires, 3)
        End If
    End Sub
    Cordialement.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Par défaut
    Bonjour.

    Merci pour votre réponse, mais comme le tableau sera utilisé par plusieurs personnes, j'aurais préféré quelque chose d'assez guidé pour les utilisateurs, d'où l'idée du bouton puis du formulaire.

    J'ai continué à chercher de mon côté, voila où j'en suis. J'ai donc créé un bouton qui appelle un userform, ce dernier a une liste déroulante basée sur les données de la ligne 2, et un bouton "Valider" qui envoi un mail aux personnes indiquées "X" dans la colonne.

    Nom : Tableau Excel Bouton Userform.PNG
Affichages : 126
Taille : 21,4 Ko

    Problème 1 : pour le moment, l'envoi de mail ne se fait que sur une colonne bien définie, renseignée dans le code VBA. Je ne trouve pas du tout comment récupérer la colonne sélectionnée dans la liste déroulante et dire au process de ne chercher les "X" que dans cette colonne ci.

    Ci-joint, le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Private Sub BoutonValider_Click()
     
    Dim Mail As Variant
    Dim Ligne As Integer
     
    Dim outlookApp As Outlook.Application
    Dim myMail As Outlook.MailItem
     
    Set Mail = CreateObject("Outlook.Application")
     
    For Ligne = 1 To 8
     
        If Range("D" & Ligne) = "X" Then
     
            With Mail.CreateItem(olMailItem)
                .To = Range("B" & Ligne)
                .Display
            End With
     
        End If
     
    Next Ligne
     
    End Sub
     
     
    Private Sub UserForm_Initialize()
     
    Dim Ligne As Integer
    Dim i As Integer, j As Integer
     
    Ligne = 3
     
    Do While Cells(2, Ligne).Value <> ""
     
    frmRecherche.CboListe.AddItem Cells(2, Ligne).Value
    Ligne = Ligne + 1
     
    Loop
     
    End Sub

    Ensuite, j'ai une macro d'envoi de mail avec choix d'une pièce jointe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub Envoyer_Mail_PJ_Choix()
     
    Dim outlookApp As Outlook.Application
    Dim myMail As Outlook.MailItem
     
    Set outlookApp = New Outlook.Application
    Set myMail = outlookApp.CreateItem(olMailItem)
     
    Dim xFilePath As String
    Dim xObjFD As FileDialog
    Set xObjFD = Application.FileDialog(msoFileDialogFilePicker)
      With xObjFD
            .AllowMultiSelect = False
            .Show
            If .SelectedItems.Count > 0 Then
                xFilePath = .SelectedItems.Item(1)
            Else
                Exit Sub
            End If
     
        source_file = xFilePath
        myMail.Attachments.Add source_file
     
     
    myMail.Display
     
        End With
     
    End Sub
    Problème 2 : j'ai du mal également du mal à intégrer cette fonctionnalité à mon code précédent. J'essaye de joindre les deux macros mais mon code ressemble de plus en plus à un patchwork, et évidemment ça ne marche pas.

    Voila donc où j'en suis. Merci d'avance pour votre aide !

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 419
    Par défaut
    Bonjour,

    Le code de votre formulaire devrait sans doute ressembler à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Option Explicit
     
    Private Sub BoutonValider_Click()
        Dim Mail As Variant
        Dim Ligne As Integer
        Dim sDestinataires As String
        sDestinataires = ""
        Ligne = 3
        While Cells(Ligne, 1) <> ""
            If Range("D" & Ligne) = "X" Then
                    sDestinataires = sDestinataires & "; " & Range("B" & Ligne)
            End If
            Ligne = Ligne + 1
        Wend
        If sDestinataires <> "" Then
            Set Mail = CreateObject("Outlook.Application")
            With Mail.CreateItem(0)             '--- olMailItem = 0
                .To = Mid(sDestinataires, 3)
                .Display
            End With
            Set Mail = Nothing
        End If
    End Sub
     
    Private Sub UserForm_Initialize()
        Dim Colonne As Long
        Colonne = 3
        Do While Cells(2, Colonne).Value <> ""
            Me.CboListe.AddItem Cells(2, Colonne).Value
            Colonne = Colonne + 1
        Loop
    End Sub
    Cordialement.

  5. #5
    Membre confirmé
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Avril 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Avril 2012
    Messages : 113
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse, on se rapproche ! Du coup maintenant je bloque sur la syntaxe pour récupérer la valeur sélectionnée par l'utilisateur dans la liste déroulante du userform. J'ai déclaré une nouvelle valeur "Colonne" dans mon code, qui est censée reprendre le choix fait par l'utilisateur. Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Option Explicit
     
    Public Colonne As Integer
     
    Private Sub BoutonValider_Click()
     
        Dim Mail As Variant
        Dim Ligne As Integer
        Dim sDestinataires As String
        sDestinataires = ""
        Ligne = 3
     
        Colonne = frmRecherche.CboListe.Value
     
        While Cells(Ligne, 1) <> ""
            If Range(Colonne & Ligne) = "X" Then
                    sDestinataires = sDestinataires & "; " & Range("B" & Ligne)
            End If
            Ligne = Ligne + 1
        Wend
        If sDestinataires <> "" Then
            Set Mail = CreateObject("Outlook.Application")
            With Mail.CreateItem(0)             '--- olMailItem = 0
                .To = Mid(sDestinataires, 3)
                .Display
            End With
            Set Mail = Nothing
        End If
    End Sub
     
     
    Private Sub UserForm_Initialize()
        Dim Colonne As Long
        Colonne = 3
        Do While Cells(2, Colonne).Value <> ""
            Me.CboListe.AddItem Cells(2, Colonne).Value
            Colonne = Colonne + 1
        Loop
    End Sub
    Sauf que ça ne marche pas, j'ai un bug sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Colonne = frmRecherche.CboListe.Value
    Là où je ne comprends vraiment pas, c'est que si je passe le curseur sur la ligne buggée, le résultat s'affiche tout de même :

    Nom : Résultat Liste.png
Affichages : 103
Taille : 7,9 Ko

    J'ai fait plusieurs test, la valeur affichée est bien la bonne suivant ce qui a été choisi dans la liste déroulante. Donc, si cela fonctionne pour récupérer la valeur, pourquoi le code bug ?

    Merci d'avance, encore une fois...

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 419
    Par défaut
    Bonjour,

    Dans Excel, les n° de ligne d'une feuille peuvent dépasser 32768 (max 1.048.576), c'est donc toujours une variable à déclarer de type Long (et pas Integer). Pour le n° de colonne, on peut le déclarer de type Integer (max 16.384).

    Dans votre code vous n'avez pas déclaré la variable Colonne, et dans votre cas CboListe.Value n'est pas un nombre mais est un texte (String)! Pour avoir un nombre il faut CboListe.ListIndex (-1 = rien de sélectionné, 0 = 1er de la liste, 1 = 2e de la liste, ...). Il me semble donc préférable de nommer ce texte "NomDoc" plutôt que "Colonne".

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Vba Excel et Lotus Notes (envoi de mail automatisé)
    Par kocipia dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/12/2011, 10h43
  2. Envoi de mail au format Rich-Text
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 29/10/2003, 16h27
  3. envoi de mail avec attachement de fichier
    Par GMI3 dans le forum Modules
    Réponses: 2
    Dernier message: 24/09/2003, 11h22
  4. Outlook ne se ferme pas après un envoi de mail
    Par Joke dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/06/2003, 17h32
  5. envoi de mail, protocol SMTP langage C
    Par Heimdall dans le forum Développement
    Réponses: 2
    Dernier message: 23/05/2003, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo