Macro supprimant toutes les macros
RésoluTonyLucky -
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
-
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
-
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.
-
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
-
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 SubSi vous avez une idée, je suis preneur.
Bonne soirée
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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.
-
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 SubBonne journée
-
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.
-
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