Remplacer des macros dans un fichier automatiquement

Bonjour, j'ai un fichier excel dans lequel j'ai créé des macros, beaucoup de macros. Malheureusement, le fichier est souvent changement à des modifications. Il est évolutif et le restera toujours. Ce que je voudrais, c'est faire un update des macros.

Voilà ce à quoi je pense comme procédure:

J'ouvre le fichier, je mets une macro dans le "thisworkbook" et la macro qui s'active automatiquement à l'ouverture du fichier, supprime toutes les macros contenues dans le fichier pour les remplacer par les nouvelles qui sont à un emplacement définie qui est toujours le même.

Est-ce que cela est possible ?

merci!

Bonjour,

C'est possible. Voici une piste. Le code supprime les modules standards et importe le nouveau module qui lui, doit se trouver dans le même dossier que le classeur. Fais un test sur un classeur bidon et adaptes :

Sub ExportImportModule()

    Dim Classeur As Workbook
    Dim NomClasseur As String
    Dim NomModule As String
    Dim Chemin As String

    NomClasseur = "Classeur1.xlsm"
    NomModule = "Module1"

    Set Classeur = Workbooks(NomClasseur)

    Chemin = ThisWorkbook.Path & "\" & NomModule & ".bas"

    'supprime les modules et lignes de code(adapter dans la procédure "SupprimerModules" ci-dessous)
    SupprimerModules Classeur

    'importe le module qui se trouve dans le même dossier que le classeur
    Workbooks(NomClasseur).VBProject.VBComponents.Import Chemin

End Sub

Sub SupprimerModules(Classeur As Workbook)

    '1 => Module standard
    '2 => Module de Classe
    '3 => UserForm
    '100 => ThisWorkbook + Feuille

    Dim ColMod As Object
    Dim Module As Object

    Set ColMod = Classeur.VBProject.VBComponents

    For Each Module In ColMod

        Select Case Module.Type

            'supprime Modules standard, de classe et UserForms (ici, seulement les modules standard car 2 et 3 en commentaire)
            Case 1 ', 2, 3
                ColMod.Remove Module

            'efface les lignes de code des modules feuilles et classeur
'            Case 100
'                With Module: .CodeModule.DeleteLines 1, .CodeModule.CountOfLines: End With

        End Select

    Next

End Sub

Bonsoir, Theze

Pas de code dans le classeur (Pour l'essentiel) Tout le code est dans une xlam en référence. Comme ça tu peux changer le code tous les jours sans jamais avoir toucher au fichier de données ni à lancer la moindre macro. YAKA changer la .xlam de temps en temps...

A+

Effectivement, la piste du. xlam est une très bonne piste, il suffit de remplacer le fichier dans le dossier Addins !

Si on veut qu'il ne soit accessible que pour un certain classeur, il suffit de le charger à l'ouverture et le décharger à la fermeture :

Sub Charger()

    Dim XLAM As AddIn

    Set XLAM = Application.AddIns.Add("C:\Users\UTILISATEUR\AppData\Roaming\Microsoft\AddIns\MonAddin.xlam")

    XLAM.Installed = True

End Sub

Sub Decharger()

    Dim XLAM As AddIn

    Set XLAM = Application.AddIns.Add("C:\Users\UTILISATEUR\AppData\Roaming\Microsoft\AddIns\MonAddin.xlam")

    XLAM.Installed = False

End Sub

Un code pour copier le nouveau .xlam et écraser l'ancien. A adapter tout ça bien sûr :

Declare Function CopyFile _
        Lib "kernel32" _
        Alias "CopyFileA" ( _
        ByVal lpExistingFileName As String, _
        ByVal lpNewFileName As String, _
        ByVal bFailIfExists As Long) As Long

Sub CopierFichier()

    Dim DosOrigine As String
    Dim DosDestination As String
    Dim Fichier As String
    Dim Ecraser As Boolean

    Ecraser = True 'écrase l'existant

    Fichier = "MonAddin.xlam"

    DosOrigine = "D:\Mon dossier ou se trouve mon nouvel AddIn\" & Fichier

    DosDestination = "C:\Users\UTILISATEUR\AppData\Roaming\Microsoft\AddIns\" & Fichier

    CopyFile DosOrigine, DosDestination, Abs(CLng(Not Ecraser))

End Sub

Bonjours, merci pour les réponses, j'ai pris la première solution qui fonctionne très bien. J'ai juste une question, les macros lorsqu'ils sont importer change de nom, y-a-t-il une raison? Ex: j'ai dans mon fichier avant de les effacer, M000_test et elle la remplace par modtest.

merci!

Bonjour,

J'ai juste une question, les macros lorsqu'ils sont importer change de nom, y-a-t-il une raison? Ex: j'ai dans mon fichier avant de les effacer, M000_test et elle la remplace par modtest.

Normalement le module conserve son nom si il n'y a pas conflit lors de l'importation par contre, si tu le renommes dans l'explorateur Windows, il prendra le nom qu'il avait lors de l'exportation car la première ligne dans le module est : Attribute VB_Name = "M000_test" si ton module se nomme "M000_test" (pour contrôler, ouvre le avec le bloc notes)

merci, j'ai tout corrigée les noms.

Rechercher des sujets similaires à "remplacer macros fichier automatiquement"