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
- Macro supprimant toutes les macros
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Comment récupérer les messages supprimés sur whatsapp - Guide
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Supprimer toutes les publications facebook - Guide
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 Sub
Si vous avez une idée, je suis preneur.
Bonne soirée
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonsoir,
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 Sub
Bonne 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.