Macro "Save and Send" - Fichier Mère vide + Nveau Fichier Pbm Lien
Bonjour à tous,
J'ai créé un fichier de demande de remise commerciale pour ma boîte en m'inspirant de bout de codes trouvés à droite et à gauche.
Ce fichier comporte deux macros :
- Requêteur de la remise - Module 1 - "Saveasxlsmandsend2" : cette macro permet à l'utilisateur d'envoyer au décideur final sa demande de remise remplie et d'en faire une sauvegarde Excel dans le dossier de son choix (boite de dialogue)
- Approbateur de la remise - Module 3 - "Saveaspdfandsend" : cette macro permet à l'utilisateur qui approuve la remise de la renvoyer au demandeur sous format PDF et d'en faire une copie dans une fichier spéficique pour historique
Le fichier mère que le requêteur va utiliser est Local Charges Waiver Form Test (en attache), lorsqu'il activera la macro "Saveasxsmandsend2" le destinatataire- l'approbateur - recevra le fichier fille sous le nom Spot Waiver Application 04-21-2021 (en attache).
Je sollicite votre aide sur deux points :
- Sur la macro "Saveasxlsmandsend2" j'aimerais que le fichier mère reste vierge/vide une fois que la demande a été envoyé au destinataire, ainsi le fichier sera prêt à l'emploi pour le prochain utilisateur. A l'heure actuelle une fois que la demande de remise a été envoyée, l'utilisateur suivant retrouvera les informations enregistrées par l'utilisateur précédent
If Application.WorksheetFunction.CountA(xUsedRng.Cells) <> 0 Then
xSht.Copy 'copie dans nouveau classeur
With ActiveWorkbook
.SaveAs Filename:=xFolder, FileFormat:=xlOpenXMLWorkbookMacroEnabled 'sauver nv classeur sous nom xFileName
.Close 'fermeture
End WithJe pense que ca se joue sur cette partie du code mais je n'y arrive pas.
- Les charges pour lesquelles le demandeur peut faire une demande remise sont listées sur l'onglet List et peuvent être sélectionnées sur l'onglet principal "Spot Waiver" par le menu déroulant de B18 à B35.
Certaines de ces charges n'ont pas un tarif fixe et dépendent de variables que le demandeur doit renseigner dans le tableau K23:N30. Exemple : si on sélectionne "Late Payment Interest" en B18, le tarif F18 sera lié à la cellule M29 par la formule =VLOOKUP(B18,List!$B$2:$C$38,2,FALSE) à la cellule B18 de l'onglet "Spot Waiver" et la cellule C22 de l'onglet "List".
Jusqu"ici tout va bien.
Mon problème se pose sur le fichier fille envoyé à l'approbateur "Spot Waiver Application 04-21-2021" où j'ai un problème au niveau du tarif pour cette même charge car l'onglet "List" de la formule en F18 fait référence à un classeur dont l'approbateur n'a pas accès. Je souhaite donc savoir si l'unique solution est lors de l'activitation de la première macro de procéder à l'envoi du nouveau fichier avec les deux mêmes onglets et non uniquement l'onglet principal de la demande.
En effet si la personne qui approuve n'a pas accès au fichier de base dans ce cas le montant en F18 fera référence à un onglet (fichier mère) auquel il n'a pas accès et donc aucune valeur ne s'affichera.
Merci par avance pour votre aide. En espérant avoir été clair.
Jeremy
Bonjour,
Je pense que votre post a du passer au travers bien qu'il soit bien expliqué avec des exemples, etc ... bravo !
Donc pour le nettoyage de la feuille mère je partirais comme ça après la partie d'envoi du mail :
'.Send
End If
End With
ThisWorkbook.Application.Union([A1], [B6:B9], [B11:B16], [B18:D35], [H18:H35], [B38:B39], [I40], [A44:E47]).Select
Selection.ClearContents
[E12] = "2nd Trade Lane :"Malheureusement je n'ai pas pu partir sur autre chose qu'un SELECT a cause des cellules fusionnées qui m'embêtent clairement, ce qui efface également la cellule E12 car la ligne B11 est fusionnée sur toute sa longueur et contigüe à la cellule E12.
Pour ce qui est du second problème pourquoi ne pas intégrer cette "List" directement dans la feuille principale, masquer les colonnes ou écrire en blanc sur blanc, verrouiller les cellules avec impossibilité de cliquer dessus et protéger la feuille ?
Hormis ça je trouve ça risqué d'envoyer un fichier avec macro à un client (si j'ai bien compris son utilité) sachant que certaines entreprises filtrent ce genre de fichier. Je serais plutôt parti du principe d'envoyer une copie de ce fichier sans macro, puis l'importer dans votre fichier mère pour le générer en PDF et l'envoyer au client pour approbation ?
Enfin c'est à vous de voir, en tout cas si la personne recevant le fichier n'a pas accès à l'onglet liste impossible de calculer le taux.
Cdlt,
Salut Ergotamine,
Désolé du retour tardif je m'étais lancé sur un autre projet. Un grand merci car cela m'a beaucoup aidé.
Grâce à tes pistes j'ai pu travaillé sur quelque (nouveau fichier en attache).
Pour répondre à ta préoccupation sur l'envoi du fichier au client, c'est un fichier en interne avec une première demande qui est envoyé par le demandeur de la remise (normalement un commercial) à la personne qui autorité pour approuver les remises commerciales.
Du coup pour la partie cleaning, j'ai fait ça en mode un peu dégueux mais ca marche. Cela me permet une fois envoyé de nettoyer le fichier et le laisser vierge pour le prochain utilisateur qui fera une demande.
With xSht
.Range("B6:C6,B7:D7,B8:D8,B9:D9").ClearContents
.Range("B11:I11").ClearContents
.Range("B12:D12").ClearContents
.Range("F12:H12").ClearContents
.Range("B13:D13,B14:D14,B15:D15,B16:D16").ClearContents
.Range("B18:C18,B19:C19,B20:C20,B21:C21,B22:C22,B23:C23,B24:C24,B25:C25,B26:C26,B27:C27,B28:C28,B29:C29,B30:C30,B31:C31,B32:C32,B33:C33,B34:C34,B35:C35").ClearContents
.Range("D18:E18,D19:E19,D20:E20,D21:E21,D22:E22,D23:E23,D24:E24,D25:E25,D26:E26,D27:E27,D28:E28,D29:E29,D30:E30,D31:E31,D32:E32,D33:E33,D34:E34,D35:E35").ClearContents
.Range("H18,H19,H20,H21,H22,H23,H24,H25,H26,H27,H28,H29,H30,H31,H32,H33,H34,H35").ClearContents
.Range("M25,M26,M27,M28,M29,M30").ClearContents
.Range("N30:Q30").ClearContents
.Range("B38:I38").ClearContents
End WithJ'ai ajouté un bloc pour effacer les objets du cadre "Attachments" où normalement le commercial qui fait sa demande met en PJ (via le module Objet) les documents potentiels appuyant la demande de remise pour compte de son client.
D'abord définir la dimension shape dans le bloc haut:
Dim oShape As ShapePuis après le bloc d'effaçage des données :
For Each oShape In ActiveSheet.Shapes
If Not Application.Intersect(oShape.TopLeftCell, ActiveSheet.Range("B39:F39")) Is Nothing Then
oShape.Delete
End IfVoilà.
Encore un grand merci à toi Ergotamine et toute la communauté.
Si quelqu'un veut utiliser mon fichier comme base pour un autre projet ne pas hésiter. Si des questions m'envoyer un message j'essaierais d'aider au mieux.
Bon weekend à tous.
Bonjour,
Merci pour votre retour et la solution apportée.
Juste une suggestion lorsque je lit ça :
Du coup pour la partie cleaning, j'ai fait ça en mode un peu dégueux mais ca marche. Cela me permet une fois envoyé de nettoyer le fichier et le laisser vierge pour le prochain utilisateur qui fera une demande.
Je pense uniquement au type de fichier qui s'appelle "Modèle" et que je vous invite fortement a aller approfondir cette piste. En effet un modèle est telle une trame, dès que vous l'ouvrez elle n'ouvre qu'une copie du document, ainsi vous ne modifiez et n'écrasez jamais la trame en elle même. Il existe des modèles avec ou sans macros. Ainsi, si vous avez votre modèle, dès lors qu'un utilisateur double clic dessus, il ouvre une copie de ce document et plus besoin de nettoyer des cellules ou de s'occuper du versionning : tout le monde travaille sur une copie vierge à la dernière version.
Je vous laisse juger si cela peut répondre plus simplement à votre besoin.
Cdlt,
Merci pour le tips sur le "Modèle" en effet cela s'applique parfaitement à mon example.
Bonne semaine.