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 :

Macro envoi par e-mail de la liste des modifications


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Macro envoi par e-mail de la liste des modifications
    Bonjour à tous,

    La solution ne sera peut-être pas bien compliquée mais je ne suis pas très dégourdi en VBA et je n'ai pas réussi à trouver de discussion qui correspondent complètement à mon problème.

    J'ai récupéré dans une ancienne discussion sur le forum le code suivant qui permet d'envoyer un e-mail lorsqu'une modification est effectuée sur une plage donnée de ma feuille.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        Const destinataire = "destinataire@adresse.com"
        'ci-dessous on définie la zone à surveiller "A4:AB50"
        If Intersect(Range("A4:AB50"), Target) Is Nothing Then Exit Sub
     
        If Target.Cells.Count > 1 Then Exit Sub
     
        'Si on est dans la zone on crée un Email
        If MsgBox("Voulez-vous valider ce changement ?", vbYesNo, "Envoi Email") = vbYes Then
            Const olMailItem = 0
     
            'Open a new mail item
            Dim outlookApp As Object
            Set outlookApp = CreateObject("Outlook.Application")
            Dim outMail As Object
            Set outMail = outlookApp.CreateItem(olMailItem)
     
     
            outMail.To = destinataire
            outMail.Subject = "Modifs dans le classeur " & ActiveWorkbook.Name
     
     
            'Get its Word editor
            outMail.Display
            Dim wordDoc As Object
            Set wordDoc = outMail.GetInspector.WordEditor
            Const wdStory = 6
            Const wdParagraph = 4
     
     
            'Range([a1], [p1].SpecialCells(xlLastCell)).Select
            'ci-dessous je copie mes lignes de titres dans l'email en créant une feuille temporaire
            Set ws_tempo = Workbooks.Add.ActiveSheet
            Range("A1:AB3").Copy ws_tempo.Range("a1")
     
            Target.EntireRow.Range("a1:ab1").Copy ws_tempo.Range("A4")
            'copie des largeurs de colonnes
            Target.Parent.Range("A1:AB5").Copy
            ws_tempo.Range(ws_tempo.Range("A1"), ws_tempo.Range("A1").SpecialCells(xlLastCell)).PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
                                                                                                             SkipBlanks:=False, Transpose:=False
     
            ws_tempo.Range(ws_tempo.Range("A1"), ws_tempo.Range("A1").SpecialCells(xlLastCell)).Copy
     
            'Pour coller dans l'Email en écrasant tout
            'wordDoc.Range.PasteExcelTable LinkedToExcel:=False, WordFormatting:=False, RTF:=False
     
            'ci-dessous je copie ma ligne modifiée dans l'email au début en conservant la signature
            Set objSel = wordDoc.Windows(1).Selection
            objSel.Move wdStory, -1
            objSel.Move wdParagraph, 1
            'je colle
            objSel.PasteExcelTable LinkedToExcel:=False, WordFormatting:=False, RTF:=False
     
            'Pour envoyer le Mail décommentez
            'outMail.send
     
            Target.Copy
            ws_tempo.Parent.Close SaveChanges:=False
            'enregistrement du fichier
            ActiveWorkbook.Save
        End If
    End Sub
    La macro récupère la ligne complète qui contient une modification et la colle dans un e-mail.
    Jusque là tout va bien, le seul hic est que cela se lance à chaque fois que je réalise la moindre manipulation sur la feuille. Ce qui n'est clairement pas pratique.

    Avez-vous une idée du code qu'il faudrait que j'utilise en plus, ou de la modif que je dois appliquer à mon code actuel pour pouvoir envoyer la liste complète des modifications en une seule fois ?
    Et ceci uniquement lorsque je veux sauvegarder le fichier avant sa fermeture et non à chaque fois que je fais une nouvelle saisie ?

    Merci par avance pour votre aide.
    Cordialement.

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Tu crées une colonne "Modifié" dans laquelle tu placeras un caractère quelconque indiquant que la ligne a été modifiée.
    Pour cela, tu peux utiliser une macro sur l'évènement Worksheet_Change.

    Pour le reste, il faudrait que tu sois plus précis sur l'évènement qui lance le mail.
    Si c'est la sauvegarde, il faut utiliser l'évènement Workbooks_BeforeSave.
    Si c'est la fermeture, il faut utiliser l'évènement Workbook_BeforeClose.

    Tu mets dans cette macro une scrutation de toutes les lignes.
    Tu repères celles dont la colonne "Modifiée" est marquée.
    Tu ajoutes la ligne au corps du mail à envoyé et tu supprimes la marque de la colonne "Modifiée".
    Tu envoies le mail.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Menhir,

    Merci beaucoup pour ta réponse. Je comprends la logique et ça me semble bien.
    Par contre je ne te cache pas que je n'ai aucune idée de comment intégrer une macro avec scrutation des lignes modifiées.
    Et dans ce cas n'est-il pas possible d'intégrer une marque dans cette fameuse colonne "modifié" sans avoir à la mettre moi-même ? La case serait cochée automatiquement si je fais une modif sur la ligne concernée.

    Ensuite pour le reste, il serait mieux je pense de partir sur l’événement Workbook_BeforeClose. Ça obligerait les utilisateurs à n'envoyer l'e-mail qu'à la véritable fin de leur manip'.
    Par contre j'ai déjà essayé d'intégrer cet événement à ma macro actuelle, sans succès.
    Il y a quelque chose que je dois oublier d'écrire... Mais je ne vois pas quoi.

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par MPackers Voir le message
    je n'ai aucune idée de comment intégrer une macro avec scrutation des lignes modifiées.
    Il suffit de faire une boucle "For To" sur les numéro de lignes ou une boucle "For Each" sur la zone de cellules concernée.
    Et dans cette boucle, faire test "If" qui vérifie la présence de la marque.

    Et dans ce cas n'est-il pas possible d'intégrer une marque dans cette fameuse colonne "modifié" sans avoir à la mettre moi-même ?
    Comme je l'ai dit dans mon message précédent, ça peut être fait par une macro évènementielle Worksheet_Change.

    Ensuite pour le reste, il serait mieux je pense de partir sur l’événement Workbook_BeforeClose. Ça obligerait les utilisateurs à n'envoyer l'e-mail qu'à la véritable fin de leur manip'.
    L'utilisateur ne serait "obligé" de rien du tout puisque ceci se ferait sans qu'il ait à intervenir.

    Par contre j'ai déjà essayé d'intégrer cet événement à ma macro actuelle, sans succès.
    On ne peut pas intégrer un évènement à une macro puisque c'est l'évènement lui-même qui constitue la macro.
    Lis ceci : http://silkyroad.developpez.com/VBA/EvenementsFeuille/
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

Discussions similaires

  1. Réponses: 18
    Dernier message: 24/05/2013, 08h58
  2. Formulaire avec envoi par e-mail
    Par riboul dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2010, 16h13
  3. Réponses: 2
    Dernier message: 14/06/2010, 09h18
  4. Sauvegarde MySQL et envoi par e-mail
    Par Steph21 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 06/11/2009, 14h15
  5. [MySQL] Sauvegarde de base de données et envoi par e-mail
    Par lemirandais dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/01/2009, 21h27

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