Export / import VBA code par instructions VBA
Bienvenue chez moi
Le web propose beaucoup de lecture sur ce sujet surtout pour Excel moins sur Access, voir d'ailleurs sur Developpez.com ces posts très intéressants:
http://www.developpez.net/forums/d27...-frm-d-projet/
http://www.developpez.net/forums/d10...d-base-access/
L'objectif
Je veux remplacer le code VBA d'un formulaire ou d'un rapport par celui d'un fichier, par défaut .CLS
Le problème
La routine pompée sans vergogne sur les 2 posts cités plus haut, charge tous les .CLS comme un nouveau module et ne remplace donc pas le code du formulaire ou du rapport :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Sub importVBACode(pPathImportDir As String)
Dim sFileName As String, sExt As String
If ExisteDir(pPathImportDir) = False Then MsgBox "Répertoire inexistant!" & Chr(13) & "Opération annulée!", vbCritical: Exit Sub
sFileName = Dir(pPathImportDir & "*.*")
Do While sFileName <> ""
sExt = Right(sFileName, 3)
Select Case sExt
Case "cls", "bas"
Application.VBE.ActiveVBProject.VBComponents.Import (pPathImportDir & sFileName)
End Select
sFileName = Dir
Loop
End Sub
Function ExisteDir(pPathDir As String) As Boolean
On Error Resume Next
ExisteDir = GetAttr(pPathDir) And vbDirectory
End Function |
UNE :f1: EST LA BIENVENUE
Pour ceux qui cherchent encore, la routine d'import, toujours pompée férocement sur les 2 posts cités
Code:
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
| Sub exportVBACode(pPathExportDir As String)
Dim obj As Access.AccessObject
Dim IdFile As Integer
Dim sMsg As String
' Traiter tous les modules un par un
sMsg = "Ecraser le fichiers VBA des modules (.bas)?"
If OverWriteFile(sMsg) = False Then Exit Sub
For Each obj In CurrentProject.AllModules
DoCmd.OpenModule obj.Name
' Ouvrir le fichier texte
IdFile = FreeFile
Open pPathExportDir & obj.Name & ".bas" For Output As #IdFile
DoCmd.Close acModule, obj.Name
' Ferme le fichier texte
Close #IdFile
Next
'Traiter tous les formulaires un par un
sMsg = "Ecraser le fichiers VBA des formulaires (.cls)?"
If OverWriteFile(sMsg) = False Then Exit Sub
For Each obj In CurrentProject.AllForms
DoCmd.OpenForm obj.Name, acDesign
If Forms(obj.Name).HasModule Then
' Ouvrir le fichier texte
IdFile = FreeFile
Open pPathExportDir & "Form_" & obj.Name & ".cls" For Output As #IdFile
' Ferme le fichier texte
Close #IdFile
End If
DoCmd.Close acForm, obj.Name
Next
'Traiter tous les états un par un
sMsg = "Ecraser le fichiers VBA des état (.cls)?"
If OverWriteFile(sMsg) = False Then Exit Sub
For Each obj In CurrentProject.AllReports
DoCmd.OpenReport obj.Name, acDesign
If Reports(obj.Name).HasModule Then
IdFile = FreeFile
Open pPathExportDir & "Report_" & obj.Name & ".cls" For Output As #IdFile
' Ferme le fichier texte
Close #IdFile
End If
DoCmd.Close acReport, obj.Name
Next
MsgBox "Opération terminée !", vbInformation, "Code VB exporté"
End Sub
Private Function OverWriteFile(pMsg As String) As Boolean
Dim bEcraseFile As Boolean
oOverWrite = True
If MsgBox(pMsg, vbQuestion + vbYesNo + vbDefaultButton2, "Export Modules") = vbNo Then
oOverWrite = False
End If
OverWriteFile = oOverWrite
End Function |
Voilà et n'oubliez pas, bonjour chez vous :ccool: