Suppression de modules via vba

Sly le globe trotter

XLDnaute Occasionnel
Bonjour tout le monde,

En cherchant sur le net de quoi résoudre mon problème, à savoir la suppression du Module1 d'un fichier B à partir d'un fichier A, je suis tombé sur le code suivant :
Code:
Sub DeleteModule()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
    
Set VBProj = Activeworkbook.VBProject
Set VBComp = VBProj.VBComponents("Module1")
VBProj.VBComponents.Remove VBComp
End Sub
Source : Programming In The VBA Editor

Est-il possible de modifier ce code pour pouvoir modifier le Module1 d'un classeur autre que le classeur actif, en passant ce classeur en argument de la fonction ?
J'ai essayé quelques modifications mais n'ai pas trouvé la bonne :(

Merci pour votre aide
 
Dernière édition:
G

Guest

Guest
Re : Suppression de modules via vba

Bonjour,

Avec ceci:
Code:
Sub DeleteModule(wb As Workbook, NomModule As String)
    Dim VBComp As Object
    With wb.VBProject
        Set VBComp = .VBComponents(NomModule)
        .VBComponents.Remove VBComp
    End With
End Sub
Utilistation

DeleteModule WorkBooks("NomDuClasseurOuvert.xls"), NomDuModuleAsupprimer

A+
 

Sly le globe trotter

XLDnaute Occasionnel
Re : Suppression de modules via vba

Salut Hasco,

Merci pour ta réponse !
Je viens de faire un test mais j'ai un problème avec l'utilisation de ta fonction... Elle me génère une erreur.

J'ai tenté ceci :
Code:
DeleteModule Workbooks("NomDuClasseurOuvert.xls"), "Module1"
mais ça ne fonctionne guère mieux. Le code s'exécute mais le module n'est pas supprimé.

Merci encore
 
G

Guest

Guest
Re : Suppression de modules via vba

Re,

quelle erreur?

Numéro d'erreur, message, ligne sur laquelle elle se produit?

Dans les options de Sécurité d'excel
Avec une niveau de sécurité générale à moyen
Ne pas oublier dans options/sécurité/sécurité des macro/Source fiable de cocher la case:faire confiance au projet Visual Basic.

chez moi cela fonctionne.
A+
 

Sly le globe trotter

XLDnaute Occasionnel
Re : Suppression de modules via vba

Re salut Hasco,

Je ne comprends plus grand chose étant donné que je n'ai plus d'erreur. Cependant, le module n'est pas supprimé...

Voici mon code exact :
Code:
' FichierAModif correspond au fichier dans lequel supprimer le module
FichierAModif = ActiveWorkbook.Name

DeleteModule Workbooks(FichierAModif), "Module1"

ActiveWorkbook.Save

Je précise que mon code se trouve dans un fichier A et que je souhaite faire ces modifications dans un fichier B.

Merci encore !!!
 
G

Guest

Guest
Re : Suppression de modules via vba

Re,

ActiveWorkBook est le fichier actif, donc à priori le fichier qui contient la macro (ton code)!!!!?

C'est le fichier B qu'il faut passer à la macro, pas le fichier A et le nom d'un module qui existe dans le fichier B.

Et si tu veux sauvegarder B après avoir supprimer le module
WorkBooks('FichierB.xls').Save et non ActiveWorkBook.Save

A+
 

Sly le globe trotter

XLDnaute Occasionnel
Re : Suppression de modules via vba

Re,

En fait, je travaille au départ dans mon fichier A. De ce fichier, j'extrais un des onglets dans un nouveau classeur qui devient donc le classeur actif.

C'est pour ça que j'utilise ActiveWorbook. ça ne doit pas être très rigoureux...

Mais comment expliquer que le module ne soit pas supprimé, ni dans le fichier A, ni dans le B ???
 

Bigfish

XLDnaute Occasionnel
Re : Suppression de modules via vba

Bonjour Sly le globe trotter,
Bonjour le forum,

ce code devrait résoudre tes probleme:

Code:
Sub StartDeleteModule()
    Dim MonClasseur As Workbook
    Application.ScreenUpdating = False
    On Error Resume Next
    Set MonClasseur = Workbooks.Open(Filename:=DialogBox())
    If Not err = 0 Then Exit Sub
    Call DeleteModule(MonClasseur, "Module1")
    Application.ScreenUpdating = True
End Sub
Sub DeleteModule(ByRef Classeur As Workbook, Optional ByVal ModuleName As String)
    Dim LeModule As Object, reponse As VbMsgBoxResult
    On Error Resume Next
    If Len(Classeur.VBProject.VBComponents(ModuleName).Name) <> 0 Then
        If err = 0 Then
            reponse = MsgBox(" Etes sur de vouloir supprimer le module '" & ModuleName & "' du Classeur '" & Classeur.Name & "' ? ", vbQuestion + vbYesNo)
            If reponse = vbYes Then
                Set LeModule = Classeur.VBProject.VBComponents(ModuleName)
                Classeur.VBProject.VBComponents.Remove LeModule
            Else
                Exit Sub
            End If
        Else
            MsgBox "Le module spécifié n'à pu être supprimé ! " & vbCrLf & _
                    "Le module n'existe pas ou vous n'etes pas autorisé à le supprimer.", vbExclamation
        End If
    End If
End Sub
Function DialogBox(Optional Root As String, Optional DialogTitle As String = "Selection du Classeur...", Optional DialogType As MsoFileDialogType = msoFileDialogFilePicker) As String
        With Application.FileDialog(DialogType)
            .AllowMultiSelect = False
            .Title = DialogTitle
            .InitialFileName = Root
            If .Show = -1 Then DialogBox = .SelectedItems(1)
        End With
End Function

Attention dans l'onglet 'Editeur Approuvé' du menu 'securité' tu doit cocher 'Faire confiance aux projets visual basic'

Un petit mot pour Hasco:
désolé car j'ai oublié de rafraichir avant de poster. Tu as effectivement déjà bien repondu à l'ami Sly le globe trotter.

A+
 
Dernière édition:

Sly le globe trotter

XLDnaute Occasionnel
Re : Suppression de modules via vba

Bonjour à tous,

Je viens de trouver ce qu'il se passe mais ne comprend pas !!!

En fait, le module est bien supprimé... Mais il y a un mais...

Dans mon code, je supprime le module, j'enregistre mon fichier via vba, ferme ce fichier toujours via vba
Code:
ActiveWorkbook.SaveAs "toto.xls"
et termine l'exécution du code.
Quand je rouvre le fichier, le module est toujours là !

Si je supprime la fermeture du fichier et que je l'enregistre manuellement, tout a bien disparu... :confused:

Il semblerait donc que ce la provienne de la façon dont j'enregistre le fichier...

Vous n'auriez pas une piste ???

Merci
 
Dernière édition:

Bigfish

XLDnaute Occasionnel
Re : Suppression de modules via vba

re:

essai d'ajouter un 'Doevents' comme suit:

Code:
Sub DeleteModule(wb As Workbook, NomModule As String)
    Dim VBComp As Object
    With wb.VBProject
        Set VBComp = .VBComponents(NomModule)
        .VBComponents.Remove VBComp
    End With
    [COLOR="Blue"]Doevents[/COLOR]
End Sub

ou/et comme ceci:

Code:
DeleteModule Workbooks(FichierAModif), "Module1"
[COLOR="Blue"]Doevents[/COLOR]
A+
 

Sly le globe trotter

XLDnaute Occasionnel
Re : Suppression de modules via vba

Salut Bigfish,

Entre temps, j'ai trouvé une fonction qui me permet de supprimer à la fois les modules et le code contenu dans les feuilles.
Je l'indique à titre indicatif :
Code:
Sub SupprimeTtCode(Classeur As String)

Dim VBComp As Object
Dim VBComps As Object

Set VBComps = Workbooks(Classeur).VBProject.VBComponents

For Each VBComp In VBComps
    Select Case VBComp.Type
        Case 100
            With VBComp.CodeModule
            .DeleteLines 1, .CountOfLines
            End With
        Case Else
            VBComps.Remove VBComp
    End Select
Next VBComp
DoEvents
End Sub

J'ai rajouté dans cette fonction la commande DoEvents à la fin.

Résultat des courses : tout est supprimé (code, code dans les feuilles) mais à l'ouverture du fichier on me demande toujours si je souhaite activer ou désactiver les macros...
Pourtant, le fichier est vierge de tout code...

Si j'ouvre ce fichier, efface le contenu d'une cellule vide et l'enregistre, plus de trace de macros à l'ouverture. :confused:

Avez-vous une idée ???
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 559
Messages
2 089 605
Membres
104 226
dernier inscrit
siala Mohamed