Macro supprimant toutes les macros

Résolu
TonyLucky -  
 TonyLucky -

Bonjour,

Je cherche à faire une macro supprimant toutes les macros du classeur excel actif.

J'ai trouvé sur le net plusieurs exemples, mais si tous fonctionnent, il reste toujours quelques modules, userform et tous les modules de classe.

Voici l'exemple le plus simple que j'ai pu trouver :

Sub Supprimer_toutes_macros()
Dim VBC As Object
 
With ActiveWorkbook.VBProject
    For Each VBC In .VBComponents
        If VBC.Type = 100 Then
            With VBC.CodeModule
                .DeleteLines 1, .CountOfLines
                .CodePane.Window.Close
            End With
        Else
            .VBComponents.Remove VBC
        End If
    Next VBC
End With
 
End Sub

Avez-vous des idées pour résoudre ce problème ?

Je vous en remercie par avance

Tony


Windows / Firefox 133.0

8 réponses

  1. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724
     

    Bonjour,

    ce code devrait faire l'affaire :

    Sub enlever_code()
        Dim vbc As Object
        
        With ActiveWorkbook.VBProject
            For Each vbc In .VBComponents
                If vbc.Type = 1 Or vbc.Type = 2 Or vbc.Type = 3 Then
                    '1 = module standard, 2 = module de classe, 3 = userform
                    .VBComponents.Remove vbc
                End If
            Next vbc
        End With
     
    End Sub
    

    0
  2. TonyLucky
     

    Bonjour,

    Merci pour votre code. Cela fonctionne parfaitement.

    Par contre (on en veut toujours plus), je voudrais enregistrer le fichier automatiquement après cette procédure. Seulement, comme toutes les macros sont supprimées....

    Je suppose que je pourrais créer un module qui ne serait pas supprimé. Une ligne du genre if module name = "xx" then ? Mais je ne vois pas comment faire.

    0
  3. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724
     

    Bonjour,

    Le mieux serait d'opérer à partir d'un autre classeur. Il serait d'ailleurs beaucoup plus simple de réenregistrer votre classeur en .xlsx.

    Si vous souhaitez néanmoins une macro pour enlever tout code, il faut aussi traiter celui lié à une feuille ou au classeur. La macro doit donc être ainsi complétée :

    Sub enlever_code()
        Dim vbc As Object
        Dim volet_code  As Object
        
        With ActiveWorkbook.VBProject
            For Each vbc In .VBComponents
                If vbc.Type = 1 Or vbc.Type = 2 Or vbc.Type = 3 Then
                    '1 = module standard, 2 = module de classe, 3 = userform
                    .VBComponents.Remove vbc
                End If
                
                If vbc.Type = 100 Then
                    'modules objet : feuilles ou classeur
                    With vbc.CodeModule
                        For Each volet_code In .CodePane.Collection
                            volet_code.Show
                            .DeleteLines 1, .CountOfLines
                        Next volet_code
                    End With
                End If
            
            Next vbc
        
        End With
     
    End Sub
    

    0
  4. TonyLucky
     

    En fait, je veux installer cette procédure pour sécuriser mon travail et éviter qu'une personne non-autorisée puisse me pirater. Les solutions que vous proposez ne sont donc malheureusement pas adaptées, mais c'était des pistes. Merci !

    J'ai fait le code suivant pour ne pas effacer le module de suppression. Cela fonctionne très bien sauf si je mets l'instruction enregistrer le fichier : il reste des modules, USF et modules de classe. Par contre, si je lance la macro directement dans le projet VBA, c'est ok. Comme si la procédure d'appel perturbait le déroulement. Pourtant, c'est juste un call

    Je ne comprends pas trop pourquoi. J'ai essayé de mettre un msgbox pour faire une pause ; sans effet.

    Voici mon code :

    Sub SuppressionMacros()
    
    'supprime le contenu de l'objet "thisworkbook"
    With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
        .DeleteLines 1, .CountOfLines
        .CodePane.Window.Close
    End With
       
    ' supprime toutes les macros, sauf celle-ci
    With ActiveWorkbook.VBProject
        For Each vbc In .VBComponents
            '1 = module standard, 2 = module de classe, 3 = userform
            Select Case vbc.Type
                Case 1
                    If vbc.Name = "Mod_Suppression" Then
                    Else
                        .VBComponents.Remove vbc
                    End If
                Case 2, 3
                    .VBComponents.Remove vbc
                End Select
        Next vbc
    End With
    
    'sert de pause dans la macro, pour que l'enregistrement se fasse
    'MsgBox "Projet supprimé !", vbExclamation, "Boîte Alarme"
    
    'enregistre le fichier
    ActiveWorkbook.Save
    
    'pour éviter de revenir à la procédure de départ, dans un USF effacé
    End
    
    End Sub
    

    Si vous avez une idée, je suis preneur.

    Bonne soirée

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724
     

    Bonsoir,

    Je pense qu'il faut attendre la fin de la procédure de suppression du code pour enregistrer le fichier.

    Une solution est certainement d'utiliser l'instruction : Application.Ontime  pour lancer l'enregistrement dans un délai d'une seconde après la fin de la procédure.


    0
  7. TonyLucky
     

    Bonjour,

    C'est une super idée. Merci. Je ne pense jamais à utiliser cette fonction.

    Par contre, j'ai maintenant une erreur 9, l'indice n'appartient pas à la sélection. Et je peux juste cliquer sur "Fin". Si je clique, la procédure se termine normalement mais je ne vois pas d'où peut provenir l'erreur. La seule variable utilisée dans la macro de suppression est déclarée dans le module qui la contient.

    Sub SuppressionMacros()
    
    'supprime le contenu de l'objet "thisworkbook"
    With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
        .DeleteLines 1, .CountOfLines
        .CodePane.Window.Close
    End With
       
    ' supprime toutes les macros, sauf celle-ci
    With ActiveWorkbook.VBProject
        For Each vbc In .VBComponents
            '1 = module standard, 2 = module de classe, 3 = userform
            Select Case vbc.Type
                Case 1
                    If vbc.Name = "Mod_Suppression" Then
                    Else
                        .VBComponents.Remove vbc
                    End If
                Case 2, 3
                    .VBComponents.Remove vbc
                End Select
        Next vbc
    End With
    
    'sert de pause dans la macro
    Application.OnTime Now + TimeValue("00:00:02"), "EnregistrerApresSuppression"
    
    
    End Sub
    
    Sub EnregistrerApresSuppression()
    
    'enregistre et ferme le fichier
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    
    End Sub
    

    Bonne journée

    0
  8. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724
     

    Je n'ai pas d'erreur en exécutant la procédure directement. Cela doit être lié à la façon dont vous appelez la procédure. L'erreur se produit sur une instruction qui fait appel à un objet qui n'existe plus, probablement le classeur qui a été fermé.

    Faites déjà un essai en désactivant l'instruction de fermeture du classeur.


    0
  9. TonyLucky
     

    J'en étais arrivé à la même conclusion que vous. Du coup, j'ai placé la macro qui contrôle si l'utilisateur est autorisé dans le même module que la macro de suppression. Et cela fonctionne parfaitement.

    Encore merci de votre aide.

    Tony

    0