Mails automatiques prenant en compte plusieurs lignes d'un TCD

Bonjour à tous !

Ne connaissant pas bien le langage VBA, j'aurais besoin de conseils afin de pouvoir réaliser un envoi de mails automatiques à partir d'un TCD. Dans ces mails, plusieurs lignes du TCD appartenant à même ensemble apparaitraient.

J'ai effectué de nombreuses recherches à ce sujet, mais je n'ai malheureusement pas trouvé mon bonheur.

Pour des raisons de confidentialité, j'ai transformé complètement la réalité de mon fichier (d'où le contenu un peu simpliste). L'important étant bien sûr que je comprenne la logique afin de pouvoir l'appliquer de mon côté ! Vous trouverez donc une version simplifiée en fichier joint, contenant un TCD ainsi que l'exemple d'un mail type.

18aide-excel.xlsm (34.42 Ko)

Je m'explique.

Mon TCD fait apparaitre : un client (à contacter, avec son mail), un numéro de facture, les articles qui y figurent et leurs quantités. Le but est d'envoyer un mail automatique au client qui lui récapitule la quantité de chaque article présent dans sa facture n°X. Le client est à contacter si la colonne "Action" contient la mention "Contacter".

Une même facture peut contenir plusieurs articles, et là est tout le problème. En effet, mon TCD affiche une ligne par article. Lorsque j'essaye de construire un code en VBA avec une boucle If, j'ai simplement mis comme critère le fait d'avoir la mention "Contacter" présente dans l'une des colonnes. Ainsi, quand je lance la macro, cela m'ouvre bien Outlook, mais forcément cela m'ouvre un mail PAR article, et non un seul pour l'ensemble des articles présents sur une facture comme je le souhaiterais.

Avez-vous une idée de la façon dont je pourrais m'y prendre pour réaliser cela s'il vous plait ?

Merci par avance pour le temps que vous m'accorderez

Hello,

Le problème avec le tcd c'est qu'il fusionne des cellules du coup c'est compliqué de l'exploiter en vba ...

Je te propose 2 méthodes.

Methode 1 (bourrin) :

-Défusionner toutes les cellules de ta feuille

- Boucler sur les facture du tcd et remplacer les vides par la valeur du dessus

Methode 2 (+ Complexe) :

-Emuler un tcd

Tu saurais faire ?

Salut Rag !

Tout d'abord, merci de m'avoir répondu

Oui effectivement les cellules du TCD sont fusionnées, je ne pensais pas que ça posait problème pour la programmation ! Ce n'est pas une obligation de les avoir en fusionnées, j'ai donc défusionné les cellules et répété les étiquettes d'élément pour chaque ligne à la place.

Sinon, concernant tes deux solutions, j'expérimenterais bien la deuxième mais je n'ai pas tellement de connaissances, et je ne sais pas ce que tu entends par "émuler un TCD". Qu'est-ce que tu veux dire par là ?

Pour préciser : mon fichier sera mis à jour régulièrement, et les plages à afficher dans le mail, par conséquent, vont varier. Le numéro de facture est unique, et je souhaiterais que chaque client puisse recevoir un mail unique par facture, avec à l'intérieur le détail des articles qui la composent.

Je remets un exemple pour clarifier : si Pierre a une facture X composée d'1 article A, de 2 articles B et de 3 articles C, j'aimerais pouvoir "extraire" ou du moins afficher les deux lignes d'articles et les quantités.

Le TCD affiche alors :
Colonne A - Colonne B - Colonne C

Facture X - Article A - 1
Facture X - Article B - 2
Facture X - Article C - 3

Le mail afficherait donc :

Facure X :
- Article A : 1
- Article B : 2
- Article C : 3

Et cela pour chaque facture de chaque client apparaissant dans le tableau.

Tu penses que c'est possible ?

Hello,

Un émulateur est utilisé dans les jeux vidéos, c'est le fait de reproduire une console de jeux jouable sur un pc

Mais ce n'est pas une console de jeux.

Emuler un tcd c'est retourner la même vue qu'un tcd (avec calculs et autres ...) mais sans passer par les méthodes du tcd

Je vais essayer de te fournir un code qui utilises les tcd (+ simple que l'emulation du tcd je pense ), ça fait un bail que je ne l'ai pas fait, ça risque d'être amusant ...

Voila, je pense que c'est ok

C'était amusant les tcd

20aide-excel.xlsm (42.58 Ko)

Wow merci énormément Rag ! J'ai eu le temps de potasser un peu ta macro et d'essayer de l'adapter à mon fichier ! C’est super intéressant

Ah d’accord, je ne connaissais pas le concept d’émulateur, mais pourquoi pas me pencher dessus lorsque je serais un peu plus expérimentée ahah

Si jamais tu as encore un peu de temps à m’accorder, je me suis aperçue de deux petites coquilles dans mon explication, que je peine à régler :

1) La colonne que j'ai appelé "facture" peut (rarement mais ça arrive) avoir des doublons. Je m'en suis rendue compte lorsque j'ai constaté un petit décalage pour certaines quantités De ce fait, si par malheur j’ai le même numéro de facture pour deux clients, l’envoi de mail ne se fait qu’à une seule adresse, et le total est faussé (car il cumule les articles et quantités des deux clients).

Pour sécuriser cela, je me suis dit qu’il fallait peut-être déclarer « Item_Client » en tant que Pivot Item (au même titre que Facture et Article), ainsi que « Champ_Client » en tant que Pivot Fied, afin de pouvoir filtrer à la fois sur la facture ET le client ? Pour ensuite mettre "With .PivotFields" et "Set". Mais lorsque j’ai rajouté ça je n’ai pas eu l’impression que ça ait changé quelque chose, il doit me manquer un élément. Faut-il rajouter une ligne de code également dans la boucle des factures ?

2) La mention « contacter » n’est pas toujours présente sur les lignes, et parfois d’autres mentions sont indiquées. Si « contacter » apparaît, alors on envoie un mail, sinon non. A l’heure actuelle, toutes les lignes sont concernées par l’envoi de mail.

Est-ce que ça suffirait de placer une condition (type « if », où l’on viendrait extraire les données qui contiennent le mot « contacter ») avant la création du TCD ? Ou ce n’est pas la meilleure méthode ?

Pour illustrer mes deux questions, je remets un exemple dans le même thème pour que l'on voit bien la nuance :

image

PS : pour l’ajout des lignes du TCD, tu as utilisé « .Position = 1: » (ou 2), ça revient à choisir le "premier" emplacement, mais il correspond à quoi exactement ?

Bon, là je pense que ça fait déjà beaucoup de questions pour un samedi soir merci encore et bon week-end !

Hello,

Position correspond au placement dans le tcd.

position 1 = dans le tcd la ligne la + en haut

position 2 = celle juste en dessous et ainsi de suite.

Pour les 2 autres questions je verrai demain ou lundi .... je suis un peu fatigué

Hello,

Pour sécuriser cela, je me suis dit qu’il fallait peut-être déclarer « Item_Client » en tant que Pivot Item (au même titre que Facture et Article), ainsi que « Champ_Client » en tant que Pivot Fied, afin de pouvoir filtrer à la fois sur la facture ET le client ? Pour ensuite mettre "With .PivotFields" et "Set". Mais lorsque j’ai rajouté ça je n’ai pas eu l’impression que ça ait changé quelque chose, il doit me manquer un élément. Faut-il rajouter une ligne de code également dans la boucle des factures ?

Que de complications ....

Je pense que le plus simple serait d'ajouter une colonne de concatenation Facture & client pour avoir l'unicité, après il faudrait gérer l'affichage de la facture dans le corps du mail ... Je te laisse t'en occuper ...

2) La mention « contacter » n’est pas toujours présente sur les lignes, et parfois d’autres mentions sont indiquées. Si « contacter » apparaît, alors on envoie un mail, sinon non. A l’heure actuelle, toutes les lignes sont concernées par l’envoi de mail.

Est-ce que ça suffirait de placer une condition (type « if », où l’on viendrait extraire les données qui contiennent le mot « contacter ») avant la création du TCD ? Ou ce n’est pas la meilleure méthode ?

Pas besoin... le tcd donne la possibilité d'ajouter des filtres comme pour la facture ... donc :

ajouter à la sute :

    With .PivotFields("Action"):                                   .Orientation = xlPageField:          End With

à

    'Ajout filtre
    With .PivotFields("Facture"):                                   .Orientation = xlPageField:          End With
    'Ajout filtre
    With .PivotFields("Facture"):                                   .Orientation = xlPageField:          End With
    With .PivotFields("Action"):                                   .Orientation = xlPageField:          End With

Déclarer une variable du filtre Action :

Dim Champ_Factu As PivotField, Champ_Action As PivotField

Puis la définir :

    Set Champ_Factu = .PivotFields("Facture")
    Set Champ_Action = .PivotFields("Action")

Puis l'appliquer au numéro de facture :

    For Each Item_Facture In Champ_Factu.PivotItems
        Champ_Factu.ClearAllFilters 'Enlève les filtres
        Champ_Factu.CurrentPage = CStr(Item_Facture) 'Applique le filtre sur le code facture
        Champ_Action.CurrentPage = "Contacter"

Et voila le travail !

Salut !

Désolée de ce temps de réponse un peu long Rag, j'étais très occupée ces derniers jours.

Tout à l'heure je me suis attelée à modifier la version existante pour que les numéros de facture s'affichent correctement malgré l'ajout de la colonne concatener (comme tu me l'as conseillé), et ça à l'air de fonctionner, yes En ce qui concerne le filtre supplémentaire pour prendre uniquement les colonnes "Contacter", c'est top aussi.

Je vais donc maintenant essayer d'adapter cette version "concatener" à mon vrai fichier, et une fois que j'y serai parvenue je clôturerai le sujet ici. Affaire à suivre

Merci beaucoup pour ton aide, c'est vraiment gentil d'avoir pris le temps de me conseiller (et c'est super bien expliqué) ! Ca m'a ENORMEMENT aidé.

Je mets le fichier ici pour ceux qui seraient intéressés :

Rechercher des sujets similaires à "mails automatiques prenant compte lignes tcd"