Macro supprimant toutes les macros

Résolu
TonyLucky - 4 déc. 2024 à 12:43
 TonyLucky - 5 déc. 2024 à 15:24

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

A voir également:

8 réponses

thev Messages postés 1954 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 11 février 2025 700
4 déc. 2024 à 16:21

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

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
thev Messages postés 1954 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 11 février 2025 700
Modifié le 4 déc. 2024 à 20:06

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

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

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

Posez votre question
thev Messages postés 1954 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 11 février 2025 700
5 déc. 2024 à 01:18

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

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
thev Messages postés 1954 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 11 février 2025 700
5 déc. 2024 à 12:09

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

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