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 Merci pour l'info! Dommage qu'on ne puisse pas modifier le contenu de manière global, tant pis.

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 Sub

2) 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 Sub

Et 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 ActiveWorkbook

de 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 ActiveWorkbook

ne 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 Sub

Le 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 Sub

Et le fichier qui appel l'export :

Sub AppelExport()
Go = Application.Run("Test.xlam!Module1.Export", ThisWorkbook)
End Sub

Merci 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 Sub

Et dans le fichier qui appelle l'export :

Sub AppelExport()
Go = Application.Run("Test.xlam!Module1.Export", ThisWorkbook)
End Sub

Lorsque 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 Sub

Donc ç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 Sub

Ce 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 Sub

Ensuite, 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 Sub

Faites 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 ^^

Rechercher des sujets similaires à "gerer fichiers facon identique"