1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| Sub ImportModuleDansClasseurs()
Dim Cls As Workbook
Dim TestMod As Object
Dim Tbl
Dim Chemin As String
Dim NomModule As String, Password As String
Dim i As Integer
NomModule = "Module1" 'adapter le nom du module à exporter dans le dossier du classeur contenant cette macro
Password = "Gestion2011" ' mot de passe des fichiers à traiter
'Le module est exporté dans le dossier contenant tous les classeurs (y compris celui contenant cette macro)
Chemin = ThisWorkbook.Path & "\" & NomModule & ".bas"
'exporte le module
ThisWorkbook.VBProject.VBComponents(NomModule).Export Chemin
'Récupère le chemin et nom des différents classeurs .xls et .xlsm
'les classeurs sont dans le même dossier que le classeur contenant cette macro
Tbl = RecupFichiers(ThisWorkbook.Path & "\", ThisWorkbook.Name)
'évite les éventuelles boites de message
Application.DisplayAlerts = False
'Boucle sur les fichiers du répertoire
For i = 1 To UBound(Tbl)
Set Cls = Workbooks.Open(Tbl(i))
Deverrouill_Classeur = UnprotectVBProject(Cls, Password)
'Teste si le module est déjà présent dans le classeur ou si un module porte déjà ce nom
On Error Resume Next
Set TestMod = Cls.VBProject.VBComponents(NomModule)
'si pas d'erreur, le module existe demande alors si on veux le remplacer
'dans la négative, il sera renommé en "MonModule1" ou "MonModule2" etc...
'sinon, le module existant sera supprimé et remplacé par le nouveau
If Err.Number = 0 Then
'If MsgBox("Le module '" & NomModule & "' existe déjà dans le classeur '" & Cls.Name & "' !" _
' & vbCrLf _
' & vbCrLf _
' & "Voulez-vous le remplacer ?", _
' vbQuestion + vbYesNo) = vbYes Then
'
Cls.VBProject.VBComponents.Remove TestMod 'supprime le module
'End If
Err.Clear
End If
Cls.VBProject.VBComponents.Import Chemin 'importe le module
Cls.Close True 'enregistre et ferme
Next i
'Rétabli les alertes
Application.DisplayAlerts = True
End Sub
Function RecupFichiers(Chemin As String, NomClasseur As String) As String()
'==========================================================================
' Liste des classeurs à traiter dans ce répertoire
'==========================================================================
Dim TableauFichiers() As String
Dim Fichier As String
Dim i As Integer
Fichier = Dir(Chemin & "*.xls*")
Do While (Len(Fichier) > 0)
If Right(Fichier, 5) <> ".xlsx" And Fichier <> NomClasseur Then 'évite les ".xlsx et ce classeur"
i = i + 1
ReDim Preserve TableauFichiers(1 To i)
TableauFichiers(i) = Chemin & Fichier
End If
Fichier = Dir()
Loop
RecupFichiers = TableauFichiers()
End Function
Function UnprotectVBProject(Cls As Workbook, ByVal Password As String) As Boolean
'==========================================================================
' Déverrouillage du projet VBA du classeur en traitement
'==========================================================================
Dim vbProj As Object
Set vbProj = Cls.VBProject
'Inutile si le projet est déjà déprotégé
If vbProj.Protection <> 1 Then
UnprotectVBProject = True
Exit Function
Else
Set Application.VBE.ActiveVBProject = vbProj
'Saisie du mot de passe avec SendKeys, {ESC} sort de la fenêtre de saisie du mot de passe
SendKeys Password & "~~" & "{ESC}"
Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
If vbProj.Protection <> 1 Then
UnprotectVBProject = True
Else
'Password n'est pas le bon
UnprotectVBProject = False
SendKeys "%{F11}", True
End If
End If
End Function |
Partager