Envoi de plusieurs mails selon tableau dynamique

Signaler
Messages postés
85
Date d'inscription
mercredi 12 janvier 2011
Statut
Membre
Dernière intervention
7 janvier 2021
-
Messages postés
85
Date d'inscription
mercredi 12 janvier 2011
Statut
Membre
Dernière intervention
7 janvier 2021
-
Bonjour,

Je vous joints le fichier, vu le morceau ça me parait plus clair. En l'état, elle fonctionne "presque"...

Ce fichier a pour fonction la centralisation d'informations (texte + numérique) sur la feuille "Projet_Abonnement" et je cherche à automatiser l'envoi de ces informations à chaque fournisseur impliqué (un mail par frn). L'utilisation logique est de traiter tous les frn à la fois (voir plus bas).
Ces informations sont sous forme de tableaux.
Ces tableaux peuvent évoluer en nombre de ligne, indépendamment des uns et des autres. Ils ne bougeront pas en nombre de colonne.

Le bouton actuel ouvre un UserForm1 avec case à cocher et validation.

Chaque case permet de copier le tableau attitré dans une nouvelle feuille "FRN1", "FRN2", "FRN3".
Ceci après avoir vérifier l'exactitude du nom du frn, ce qui renvoi un msgbox si erreur, et ferme la macro : on peut être amené à changer le nom du frn d'un ou de plusieurs tableaux. En ce cas l'utilisateur doit aussi aller changer les données de la feuille "LISTE_FRN" pour mettre à jour les adresses. (voir plus bas) Ce msgbox a donc un rôle de prévention.

SI vrai, elle copie. Une fois ces tableaux copiés sur chaque feuille (selon les cases précédemment cochées) la macro crée un classeur par feuille et l'enregistre avec du texte, le nom du frn et la date du jour, puis ferme ce nouveau classeur.

Ensuite, elle ouvre un mail, intègre les adresses selon le tableau préparé dans la feuilles "LISTE_FRN" selon le fournisseur ou les fournisseurs choisis.
Elle ajoute du texte pré déterminé, ainsi que la pièce jointe correspondant au frn visé.
Elle intègre les adresses en copie des collègues, depuis la même feuille.
Ces données (adresses et noms frn) peuvent évoluer et logiquement, tel que fait, on peut ajouter ou modifier des adresses mails sur les frn existants sans toucher la macro. S'il faut ajouter un frn supplémentaire (ce qui peut quand même arriver), il faudra de toute façon ajouter une case à cocher et donc dupliquer la macro.


Mes problèmes :

Comme dit plus haut, cette macro est quasi fonctionnelle, ce qui n'est pas assez.
Voici où je coince :

Problèmes principaux

1/ Problème en cascade : je n'arrive pas à déclarer un tableau qui peut avoir son nombre de ligne variable.
Dès lors, je n'arrive pas à signifier, pour la vérification du nom du frn, quelle cellule regarder si le ou les tableaux précédent ont augmenté ou diminué son nombre de ligne.
En prime, des lignes peuvent parfois être masquées (car qté totale à 0), je veux faire en sorte qu'elles soient supprimées dans leur nouveau classeur. Sur ce point, je suppose qu'une condition pour aller vérifier si total=0 et supprimer devrait suffire, je n'y pense que maintenant...

2/ Chaque case fonctionne comme espéré individuellement . Mais quand je sélectionne les 3 cases d'un coup, ce qui arrivera fréquemment, il n'ouvre pas 1 mail par option : il compile tout dans le même.
Comment lui demander d'ouvrir un mail propre par case à cocher ? C'est le second gros problème.

Problèmes secondaires :

3/ J'ai essayé de limiter les répétitions, mais ce code est redondant, il se peut que je m'y prenne à l'envers. Si vous avez des suggestions, je suis preneur. Vous me direz, il n'y a pas qu'un chemin possible, mais je n'ai peut-être pas prit le plus pertinent.

4/ Je n'arrive pas à automatiser plus que ça le msgbox. Il est sur un Module et est appelé par la macro, mais je dois répéter la demande de fermeture de la macro sur chaque appel de cette msgbox.
N'y a t-il pas une possibilité d'inclure l'exit sub dans la msgbox ?


J'espère que malgré la longueur, les points évoqués sont clairs...
Pour info, cette macro résulte de vos nombreuses aides et de ce que je trouve sur le net. Il serait donc normal que certains retrouvent la marque de leur travaux :)
J'ai essayé d'éclaircir au maximum les différents blocs, avec des commentaires tout le long.

De plus, je continue mes recherches dans mon coin.

Encore une fois, merci pour l'aide et la patience dont vous faites preuve. Pour des personnes comme moi qui pataugent vite, c'est un vrai plus !!

https://www.cjoint.com/c/KAhhN4RtGhD


Configuration: Windows / Chrome 87.0.4280.88

2 réponses

Messages postés
85
Date d'inscription
mercredi 12 janvier 2011
Statut
Membre
Dernière intervention
7 janvier 2021
1
Hop, un problème en moins, les mails.
Je ne dois pas affecter de manière commune, mais pour chaque macro de case à cocher :

 'contenu du mail
On Error Resume Next
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.ObjMessage.Display
.Display
.To = AM3
.CC = ACC
.Subject = Nom_Mail3
.HTMLBody = strbody & "<br>" & .HTMLBody
.Attachments.Add Nom_Fichier3
End With


Dans les problèmes principaux, ne reste "plus que" mes tableaux à dimensionner selon un nombre de ligne évolutif et je crois avoir une solution pour la vérification du nom du frn. au lieu de partir de la feuille "Projet", je vais partir de la feuille "liste frn" et comparer pour chaque cellule avec un nom frn sa présence dans la colonne C de la feuille "Projet". je poste dès que j'ai réussi, pour illustrer...

++
Messages postés
85
Date d'inscription
mercredi 12 janvier 2011
Statut
Membre
Dernière intervention
7 janvier 2021
1
C'est moche, mais j'ai trouvé une solution !
Comme pour les tableau il y a un moyen de sélectionner son point de départ par un code dont je ne comprends pas la logique (mais peu importe) j'ai donc un point de départ pour mes tableaux quel que soit le nombre de ligne.
J'ai répété ce code pour chaque tableau et zou, ça fonctionne.


If CheckBox1 Then
Dim FR1 As Worksheet
Set FR1 = ThisWorkbook.Worksheets("FRN1")
Dim Plagefrn1 As Range
Dim Nfr1 As String
Nfr1 = SHLF.Cells(2, 1)

On Error GoTo gestionErreurs
If Nfr1 = SHPa.Columns(3).Find(What:=Nfr1, LookAt:=xlPart) Then
SHPa.Activate
Range("Tableau130[#Headers,[REF GMAO]]").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Set Plagefrn1 = Selection


End If


Il ne reste plus que l'optimisation (si jamais) !
Je crois que c'est la seconde fois où je sollicite CCM pour finalement trouver une solution moi-même. Il doit y avoir un champ magique plein d'idées sur ce site... :)