Gérer plusieurs fichiers de façon identique
Bonjour,
J'ai un fichier Excel qui permet de faire des suivis, individuels.
Ce fichier comporte plusieurs onglets, du code, partagé sur un serveur ... mais ils ont tous une trame identique.
Je cherche des astuces pour gérer ces fichiers de façon identique : c'est à dire que lorsque je souhaite faire une modification de la trame "vierge", cela se répercute sur l'ensemble des fichiers individuels.
Est-ce possible de gérer cela?
Et si oui, quel serait le meilleur moyen ?
J'ai lu des choses sur XLA mais je ne comprend pas vraiment le fonctionnement ni si cela s'adapte bien à ce cas précis.
Merci par avance pour vos conseils
Bien cordialement.
Bonjour
Concernant le contenu des onglets, même avec l’utilisation d'un modèle xlt, la modification du modèle n'impacte pas les classeurs créés à partir du modèle.
Le code peut être mis dans un complément xlam partagé et sa modification impacte donc son usage
Bonjour,
Ok vous venez de m'apprendre l'existence et l'utilité des fichiers xlt
Je vais me renseigner davantage sur le xlam.
Merci!
Cdt
Edit : j'ai retrouvé ce post très instructif sur l'utilisation de base
Bonjour,
j'ai réussi à installer un complément, cela fonctionne mais j'ai un problème.
1) J'ai un fichier nommé "test" contenant le code suivant :
Sub Test()
Call Export
End Sub2) Le "Export" est issu du complément .xlam . Cette macro permet actuellement de tester s'il y a une correspondance existante ou non dans un tableau structuré externe. Voici son code :
Sub Export()
Dim wk_fichier_recap_prépa As Workbook
Dim ws_feuille_recap_prépa As Worksheet
Dim tb As ListObject
'définition des feuilles et fichier externe
Set wk_fichier_recap_prépa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prépa = wk_fichier_recap_prépa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prépa.ListObjects("Tableau1")
ref = ActiveWorkbook.Sheets("Prépa devis").Cells(11, 37)
With tb
If .ListRows.Count = 0 Then Exit Sub
If IsError(Application.Match(ref, tb.ListColumns(22).DataBodyRange, 0)) Then MsgBox ("Il n'y a rien") Else MsgBox ("Il y a une correspondance")
End With
End SubEt là où ça bug, c'est au niveau du :
ref = ActiveWorkbook.Sheets("Prépa devis").Cells(11, 37)Car, d'après mon interprétation, le complément Xlam pense que Activeworkbook fait référence à lui même .
Or, je veux qu'il fasse référence au fichier qui lance la macro (donc à mon fichier nommé "test")
Si je modifie ainsi :
ref = Workbooks("test").Sheets("Prépa devis").Cells(11, 37)La référence est bonne et donc ça fonctionne.
____
Comment faire pour que le complément comprenne que la donnée cherchée ne vient pas de lui même mais du classeur qui lance la macro ?
J'ai testé "ThisWorkbook" et "ActiveWorkbook", peut-être y a t-il d'autres astuces ?
Par avance je vous remercie.
Cordialement.
Bonjour
Il vaut mieux nommer les tableaux structurés de façon signifiante plutôt que de garder le nom automatique
Si le classeur contenant la cellule est celui qui vient d'être ouvert utiliser
wk_fichier_recap_prépa au lieu ActiveWorkbookde façon générale éviter les accents dans les noms et ne jamais utiliser Active... : c'est trop flou donc casse gueule
Si c'est le classeur qui lance prévoir une sub à laquelle on passe un ou plusieurs paramètres, nom du classeur appelant notamment
Bonjour,
Ok je note pour les accents et "ActiveWorkbook" à éviter, merci
_____
Je pense m'être mal exprimé :
- J'ai un fichier, qui est une trame type, actuellement il s'appelle "Test". C'est lui qui contient la ref. Mais comme c'est une trame qui sera amenée à être utilisée plusieurs fois, il peut y avoir pleins de noms différents. Donc Workbooks("Test") ne convient pas.
- Le fichier externe (le "wk_fichier_recap_prépa") est celui qui contient le tableau structuré de destination, [tableau1], nom que je changerais
Ce qui fait que la solution
wk_fichier_recap_prépa au lieu ActiveWorkbookne convient pas puisque la ref n'est pas contenue dans le fichier récap.
J'ai besoin de savoir comment faire en sorte que la ref soit piochée, non pas dans le .xlam, mais dans le classeur qui sert de trame, = celui qui lance la sub.
______
Si c'est le classeur qui lance prévoir une sub à laquelle on passe un ou plusieurs paramètres, nom du classeur appelant notamment
Il faut faire :
dim trame As Workbook
trame = "fichier qui lance la sub"et ce serait à placer dans le .xlam ?
J'avoue ne pas savoir faire du tout
Merci pour votre aide.
Cordialement.
RE
Il faut un bout de code dans le fichier qui appelle l'Export :
Par exemple
Sub AppelExport()
Go = Application.Run("Test.xlam!Module1.Export", ThisWorkbook)
End SubLe code Export de Text.xlam est dans le Module1 et commence par
Sub Export(WK As Workbook)Il récupère donc l'objet appelant qui contient la feuille Prépa devis
Bonjour,
Merci pour ce retour.
J'ai testé mais j'ai le même problème. Bug au niveau de
ref = ThisWorkbook.Sheets("Prépa devis").Cells(11, 37)Pour être sûr, voici le code,
Dans le fichier xlam :
Sub Export(WK as Workbook)
Dim wk_fichier_recap_prépa As Workbook
Dim ws_feuille_recap_prépa As Worksheet
Dim tb As ListObject
'définition des feuilles et fichier externe
Set wk_fichier_recap_prépa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prépa = wk_fichier_recap_prépa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prépa.ListObjects("Tableau1")
ref = ThisWorkbook.Sheets("Prépa devis").Cells(11, 37)
With tb
If .ListRows.Count = 0 Then Exit Sub
If IsError(Application.Match(ref, tb.ListColumns(22).DataBodyRange, 0)) Then MsgBox ("Il n'y a rien") Else MsgBox ("Il y a une correspondance")
End With
End SubEt le fichier qui appel l'export :
Sub AppelExport()
Go = Application.Run("Test.xlam!Module1.Export", ThisWorkbook)
End SubMerci par avance :)
Cordialement
Bonjour
Puisque le procédure appelante passe le nom du classeur appelant
il faut bien évidemment s'en servir
ref = WK.Sheets("Prépa devis").Cells(11, 37)Bonjour 78chris, FBidee,
Un code qui pourrait être teste dans le complément (.xlam) :
Sub Export(WK as Workbook)
Dim wk_fichier_recap_prépa As Workbook
Dim ws_feuille_recap_prépa As Worksheet
Dim tb As ListObject
'définition des feuilles et fichier externe
Set wk_fichier_recap_prépa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prépa = wk_fichier_recap_prépa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prépa.ListObjects("Tableau1")
ref = WK.Sheets("Prépa devis").Cells(11, 37)
With tb
If .ListRows.Count = 0 Then Exit Sub
If IsError(Application.Match(ref, tb.ListColumns(22).DataBodyRange, 0)) Then MsgBox ("Il n'y a rien") Else MsgBox ("Il y a une correspondance")
End With
End SubEt dans le fichier qui appelle l'export :
Sub AppelExport()
Go = Application.Run("Test.xlam!Module1.Export", ThisWorkbook)
End SubLorsque la fonction "Export" est appelée, l'objet Workbook actif (dans ce cas, le classeur contenant la macro d'appel) est passé en tant que paramètre à la fonction "Export". Au sein de cette fonction, l'objet Workbook est désigné par "WK", et est donc utilisé pour faire référence à la feuille de calcul et à la cellule spécifique.
Bonjour Chris et Abderrahmane,
Vos réponses ont du se croiser
En tout cas un grand merci car c'était bien ça. J'ignorais totalement l'utilité du "WK" et je n'avais pas envisagé cette modification :)
Tout est clair à présent.
J'adore ce forum
Cordialement.
Re,
Un autre problème, décidément je n'y arriverais jamais seul :(
Supposons qu'à la place des msgbox, je souhaite faire appel à 2 macros différentes (dans le xlam).
Cela donnerait cette modification :
Sub Export(WK as Workbook)
Dim wk_fichier_recap_prépa As Workbook
Dim ws_feuille_recap_prépa As Worksheet
Dim tb As ListObject
'définition des feuilles et fichier externe
Set wk_fichier_recap_prépa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prépa = wk_fichier_recap_prépa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prépa.ListObjects("Tableau1")
ref = WK.Sheets("Prépa devis").Cells(11, 37)
With tb
If .ListRows.Count = 0 Then Exit Sub
If IsError(Application.Match(ref, tb.ListColumns(22).DataBodyRange, 0)) Then Creation_Prepa Else Modification_Prepa
End With
End SubDonc ça RAS ça fonctionnait avec les msgbox donc ça déclenche les bonnes macro.
Voici mon code pour "Creation_Prepa"
Sub Creation_Prepa()
'identifier les variables fichier et feuilles
Dim wk_fichier_prepa As Workbook
Dim ws_feuille_prepa As Worksheet
Dim wk_fichier_recap_prepa As Workbook
Dim ws_feuille_recap_prepa As Worksheet
Dim i As Long
Dim ligne As ListRow
Dim tb As ListObject
'définition des feuilles et fichier interne
Set wk_fichier_prepa = ThisWorkbook
Set ws_feuille_prepa = wk_fichier_prepa.Sheets("Prépa devis")
'définition des feuilles et fichier externe
Set wk_fichier_recap_prepa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prepa = wk_fichier_recap_prepa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prepa.ListObjects("Tableau1")
With tb
Set ligne = .ListRows.Add: i = ligne.Index 'insérer à la dernière ligne
.DataBodyRange(i, 1) = ws_feuille_prepa.Cells(11, 21)
.DataBodyRange(i, 2) = ws_feuille_prepa.Cells(11, 22)
.DataBodyRange(i, 3) = ws_feuille_prepa.Cells(11, 23)
.DataBodyRange(i, 4) = ws_feuille_prepa.Cells(11, 24)
.DataBodyRange(i, 5) = ws_feuille_prepa.Cells(11, 25)
.DataBodyRange(i, 6) = ws_feuille_prepa.Cells(11, 26)
.DataBodyRange(i, 7) = ws_feuille_prepa.Cells(11, 27)
.DataBodyRange(i, 8) = ws_feuille_prepa.Cells(11, 28)
.DataBodyRange(i, 9) = ws_feuille_prepa.Cells(11, 29)
.DataBodyRange(i, 10) = ws_feuille_prepa.Cells(11, 30)
.DataBodyRange(i, 11) = ws_feuille_prepa.Cells(11, 31)
.DataBodyRange(i, 12) = ws_feuille_prepa.Cells(11, 32)
.DataBodyRange(i, 13) = ws_feuille_prepa.Cells(11, 33)
.DataBodyRange(i, 14) = ws_feuille_prepa.Cells(11, 34)
.DataBodyRange(i, 15) = ws_feuille_prepa.Cells(11, 35)
.DataBodyRange(i, 16) = ws_feuille_prepa.Cells(11, 36)
End With
End SubCe code permet de créer une nouvelle ligne dans le tableau externe. Il bloque à la définition de la feuille :
Set ws_feuille_prepa = wk_fichier_prepa.Sheets("Prépa devis")donc j'ai exactement le même problème qu'au début, c-a-d qu'il croit que la référence est contenue dans le XLAM.... et j'ai donc voulu contourner grâce à "WK as Workbook"
J'ai tenté :
Sub Creation_Prepa(WK as Workbook)
.....avec toutes les modifications qui s'en suivent, sauf que j'ai le message "Argument non facultatif"
J'ai un peu de mal à comprendre à quel moment il perd le contact avec le WK, qui lance la procédure ...
Si vous pouviez m'aider là dessus ce serait génial.
Merci beaucoup
Cordialement.
Edit : le code "Modification_Prepa" est quasiment le même donc pas besoin d'alourdir mon message déjà bien lourdingue
RE
Il faut transmettre le WK de sub en sub
If IsError(Application.Match(ref, tb.ListColumns(22).DataBodyRange, 0)) Then Creation_Prepa(WK) Else Modification_Prepa(WK)Il faut que tu fasses un schéma : du point de départ au point d'arrivée.
Quelle sub démarre, conditions et appel d'une autre sub selon résultat, du début à la fin du processus et ensuite à quoi chaque sub se réfère et donc ce qui est à transmettre d'une sub à une autre
Sinon sans cette vue d'ensemble tu vas re coincer à chaque appel ou modif...
Re,
Le code
Then Creation_Prepa(WK) Else Modification_Prepa(WK)me renvoi l'erreur de compilation : Nb d'argument incorrect ou affectation de propriété incorrecte
Il faut faire quelque chose de particulier à la macro Creation_Prepa ? Je viens de tenter de rajouter le (WK as Workbook) et de modifier le code en conséquence mais ça n'y fait rien.
Je comprend pas trop le principe désolé ^^
Bonjour,
Concernant votre problème de hier à 15h35 vous pouvez passer le classeur (Workbook) qui lance la macro comme un argument aux sous-routines Creation_Prepa et Modification_Prepa. A tester :
Modifiez la sous-routine Export pour passer le Workbook WK comme un argument aux sous-routines Creation_Prepa et Modification_Prepa :
Sub Export(WK as Workbook)
Dim wk_fichier_recap_prépa As Workbook
Dim ws_feuille_recap_prépa As Worksheet
Dim tb As ListObject
'définition des feuilles et fichier externe
Set wk_fichier_recap_prépa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prépa = wk_fichier_recap_prépa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prépa.ListObjects("Tableau1")
ref = WK.Sheets("Prépa devis").Cells(11, 37)
With tb
If .ListRows.Count = 0 Then Exit Sub
If IsError(Application.Match(ref, tb.ListColumns(22).DataBodyRange, 0)) Then
Call Creation_Prepa(WK)
Else
Call Modification_Prepa(WK)
End If
End With
End SubEnsuite, modifiez la sous-routine Creation_Prepa pour accepter un argument Workbook et utiliser cet argument pour définir wk_fichier_prepa:
Sub Creation_Prepa(WK as Workbook)
'identifier les variables fichier et feuilles
Dim wk_fichier_prepa As Workbook
Dim ws_feuille_prepa As Worksheet
Dim wk_fichier_recap_prepa As Workbook
Dim ws_feuille_recap_prepa As Worksheet
Dim i As Long
Dim ligne As ListRow
Dim tb As ListObject
'définition des feuilles et fichier interne
Set wk_fichier_prepa = WK
Set ws_feuille_prepa = wk_fichier_prepa.Sheets("Prépa devis")
'définition des feuilles et fichier externe
Set wk_fichier_recap_prepa = Application.Workbooks.Open("C://*************.xlsm")
Set ws_feuille_recap_prepa = wk_fichier_recap_prepa.Sheets("Récap prépa")
'définition du tableau de destination
Set tb = ws_feuille_recap_prepa.ListObjects("Tableau1")
'... Le reste de votre code ...
End SubFaites la même chose pour Modification_Prepa.
Le classeur qui lance la macro est passé à Export comme WK, puis WK est passé à Creation_Prepa ou Modification_Prepa pour être utilisé dans la définition de wk_fichier_prepa. J'espere que cela vous aidera !
Bonjour,
Merci pour cette réponse, ça m'a bien aidé !
Hier soir, je n'avais pas jugé utile de modifier le Modification_Prepa car il n'était pas censé se déclencher (bien que présent dans le code), or si j'ai bien compris, Excel vérifie TOUTES les références déclarées avant même l’exécution de son code ?
Quoi qu'il en soit tout fonctionne correctement.
Je n'en suis qu'à ma première commande, en passant par un xlam ... Ca risque d'être long à ce rythme
Merci pour tout !
Cordialement.
Oui exactement, lors de l'exécution d'une macro, Excel vérifie toutes les références déclarées, même si la portion de code n'est pas censée s'exécuter. C'est pourquoi il est important de s'assurer que toutes les références sont correctes ^^