Suppression de modules via VBA

coco_lapin

XLDnaute Impliqué
Bonjour le forum.

Avant de diffuser un classeur je souhaiterais supprimer un bon nombre de modules en utilisant du code VBA (donc autrement que manuellement) dans le but de réduire la taille du classeur.

Avez-vous des solutions?
 

MichelXld

XLDnaute Barbatruc
bonjour coco_lapin , bonjour Charly

j'espere que ces infos pourront t'aider


Supprimer une procedure Workbook_Open par macro
*********************************************
A chaque ouverture du classeur contenant la macro , une copie du document est créée , expurgée de la procédure Workbook_Open

Private Sub Workbook_Open()
Dim Debut As Integer, Lignes As Integer
'enregistrement du nouveau classeur
Thisworkbook.Saveas Filename:='C:\\excel\\enregistrement ' & Format(Time, 'hh mm ss') & '.xls'
'suppression de la procedure Workbook_Open
With Thisworkbook.VBProject.VBComponents('Thisworkbook').codemodule
Debut = .Procstartline('Workbook_Open', 0)
Lignes = .Proccountlines('Workbook_Open', 0)
.Deletelines Debut, Lignes
End With
'sauvegarde modification
Thisworkbook.Save
End Sub



Supprimer la macro nommée 'MaMacro' dans le 'module3'
**************************************

Sub supprimerUneMacroPrecise()
Dim Debut As Integer, Lignes As Integer

With ThisWorkbook.VBProject.VBComponents('Module3').CodeModule
Debut = .ProcStartLine('MaMacro', 0)
Lignes = .ProcCountLines('MaMacro', 0)
.DeleteLines Debut, Lignes
End With
End Sub



Supprimer un module
******************

Sub supprimerUnModule()
With ThisWorkbook.VBProject.VBComponents
.Remove .Item('Module2')
End With
End Sub



Supprimer un UserForm par macro
*******************************

Sub suppressionUSF()
'necessite d'activer la reference Microsoft Visual Basic for Applications Extensibility 5.3
Dim VBComp As VBComponent
Set VBComp = ThisWorkbook.VBProject.VBComponents('UserForm1')
ThisWorkbook.VBProject.VBComponents.Remove VBComp
End Sub



Supprimer la totalité des procédures du classeur
*******************************************

Sub SupprimeToutVBA()
'copie le classeur en supprimant la totalité des procedures
Dim VbComp As VBComponent

ThisWorkbook.SaveAs 'C:\\test.xls'

For Each VbComp In ActiveWorkbook.VBProject.VBComponents
Select Case VbComp.Type
Case 1 To 3
ActiveWorkbook.VBProject.VBComponents.Remove VbComp
Case Else
With VbComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
Next VbComp

ActiveWorkbook.Save
End Sub





Supprimer les modules vides dans le classeur actif
********************************************

Sub supprimerTousModulesVides()
Dim vbComp As Object
Dim i As Long, j As Long

For Each vbComp In ActiveWorkbook.VBProject.VBComponents
If vbComp.Type = 1 Then
i = vbComp.CodeModule.CountOfDeclarationLines + 1
j = vbComp.CodeModule.CountOfLines
If j < i Then ActiveWorkbook.VBProject.VBComponents.Remove vbComp
End If
Next
End Sub




bonne journée
MichelXld
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir à tous,


Sans oublier aussi ce Fil en complément de ce que nous dit notre ami Michel :

DATABASE XLD RECENCEMENT FIL 21649 'VBA Effacement/Ecriture Macro'

Une solution de mon copain Laurent Longre sur le MPFE à l'époque, pas testée, mais comme il le dit lui-même c'est un peu 'cochon' :

Laurent Longre MPFE 20 sep 2000 08:00
Bon, eh bien voilà. Comme tu peux le constater, c'est excessivement
cochon.

'=================================================


Private Declare Function FindWindowA Lib 'User32' _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long


Private Declare Function GetForegroundWindow Lib 'User32' () As Long


Private Declare Function SetForegroundWindow Lib 'User32' _
(ByVal hWnd As Long) As Long


Function Déprotège(Classeur As String, MdP As String) As Boolean


Dim XLhWnd As Long, VBEhWnd As Long, CurhWnd As Long
Dim Wbk As Workbook


On Error Resume Next
Set Wbk = Workbooks(Dir$(Classeur))
On Error GoTo Fin
If Not Wbk Is Nothing Then
If Wbk.FullName 'DIFFERENT DE' Classeur Then Exit Function
If Not Wbk.Saved Then Wbk.Save
Else: Application.ScreenUpdating = False
End If


CurhWnd = GetForegroundWindow
XLhWnd = FindWindowA(vbNullString, Application.Caption)


With Application.VBE
VBEhWnd = FindWindowA(vbNullString, .MainWindow.Caption)
If CurhWnd = XLhWnd Then SetForegroundWindow VBEhWnd
.CommandBars.FindControl(ID:=2557).Execute
' NE PAS EFFACER, même si le classeur est déjà ouvert !!!!!!
Workbooks.Open Classeur
If ActiveWorkbook.VBProject.Protection = vbext_pp_locked Then
SendKeys '~' & MdP & '~', True
.ActiveCodePane.Window.Close
End If
End With


SetForegroundWindow CurhWnd
Déprotège = True
Exit Function


Fin:
End Function


Sub Test()


' Déprotection du projet VBA C:\\Temp\\Test.xls (mot de passe 'Zaza'),
' Ajout d'un module standard dans ce projet, puis rétablissement
' de la protection


Const Classeur = 'C:\\Temp\\Test.xls'
If Not Déprotège(Classeur, 'Zaza') Then
MsgBox 'Erreur'
Else
MsgBox 'Projet VBA déprotégé.'
With Workbooks(Dir$(Classeur))
.VBProject.VBComponents.Add vbext_ct_StdModule
.Close True
End With
Workbooks.Open Classeur
MsgBox 'Projet reprotégé, ajout d'un module standard.'
End If


End Sub


'=================================================


Testé sous Excel 2000 SR-2.


Petit inconvénient : si le classeur à 'déprotéger' (cad à ouvrir en
entrant le mot de passe) est déjà ouvert au moment ou la procédure
'Déprotège' s'exécute, il sera ré-enregistré si des modifications y ont
été faites par l'utilisateur, avant la déprotection.


Bonne Soirée
@+Thierry
 

Mi_

XLDnaute Occasionnel
Bonsoir,

La procédure ci-dessus s'applique à un tier classeur.

Mais comment déverrouiller le classeur actif lui-même (le projet), éffacer les modules, puis le reverrouiller ?


Je me retrouve dans l'impossibilitée d'alleger mon classeur une fois le travail fini, pour l'archivage, car le projet est verrouillé et le code ThisWorkbook.VBProject.VBComponents.Remove ne fonctionne pas.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re bonsoir Mi_

C'est aussi un peu normal, l'intégration de VB6 dans VBA oblige de toute manière à sauver/fermer le classeur pour qu'une protection prenne effet, ceci même manuellement. Ce n'est pas 'bête' c'est juste que VB est intégré ) Excel, mais il ne réagit pas aussi facilement qu'un objet WorkSheet en protection/déprotection qui lui est totalement partie intégrante d'Excel.

Bonne Soirée
[ol]@+Thierry[/ol]
 

coco_lapin

XLDnaute Impliqué
Déprotéger par macro le projet VBA via mot passe

Bonjour le forum.

Je voudrais faire évoluer une application que j'ai diffusée à des utilisateurs.

Pour cela j'envisage de leur envoyer un classeur qui contiendra une macro de mise à jour des modules.

Mais j'avais protégé le projet VBA de cette application par un mot de passe.

J'essais en vain de trouver le code qui me permettrait de déverrouiller/verrouiller le projet VBA avec un mot de passe.

J'ai essayé avec l'exemple de _Thierry (de son ami Laurent) sans succès.
 

coco_lapin

XLDnaute Impliqué
Re:Déprotéger par macro le projet VBA via mot passe

Bonjour le forum.

Je viens de trouver un code qui permet de déverrouiller puis de verrouiller le projet VBA (sur site de Sigonneau)

j'ai essayé et cela fonctionne très bien.
Je vous joins l'exemple en annexe.

Attention il ne faut pas faire du pas à pas sinon cela ne réagit pas de la même façon.

Merci coco_lapin. [file name=deprotectionvba.zip size=6322]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/deprotectionvba.zip[/file]
 

Pièces jointes

  • deprotectionvba.zip
    6.2 KB · Affichages: 187
  • deprotectionvba.zip
    6.2 KB · Affichages: 186
  • deprotectionvba.zip
    6.2 KB · Affichages: 187

_Thierry

XLDnaute Barbatruc
Repose en paix
Re:Déprotéger par macro le projet VBA via mot passe

Bonsoir Coco, le Fil, le Forum

Pas mal ce code de Bill Manville 'mpep' (Microsoft_Public_Excel_Programming)... Tu vois comme quoi, même Laurent est allé chercher un truc archi-compliqué alors qu'il y avait besoin que de quelques lignes.

Merci à toi de nous la faire découvrir (et à Frédérique de l'avoir publiée)

Bon Week End
[ol]@+Thierry[/ol]
 

Discussions similaires

Réponses
1
Affichages
127

Statistiques des forums

Discussions
312 329
Messages
2 087 324
Membres
103 516
dernier inscrit
René Rivoli Monin