Enregistrer tout le code VBA d’une application dans un fichier
Peut-on sauvegarder le code VBA complet d’une base Access dans un fichier texte ? Ce qui pourrait servir – par exemple – pour imprimer tout le code de l’application en un minimum d’opérations…
Principe
Le code VBA d’une base Access peut se trouver :
- dans les modules de formulaires
- dans les modules d’états
- dans les modules standard
- dans les modules de classe
Il n’y a pas de fonction automatique pour regrouper tous ces modules dans un seul fichier. On va donc s’en occuper !
Le code
Recopiez le code ci-dessous dans un module standard de votre base de données :
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 |
' --- ' ENREGISTRER LE CODE DE ' TOUS LES MODULES DE LA BASE ' DANS UN FICHIER ' --- ' Entrée : strFilename <- Chemin du fichier à créer. ' Sub SaveModules( _ ByVal strFilename As String, _ Optional ByVal blnOpenNotePad As Boolean = False) Dim ao As Access.AccessObject Dim intFileHandle As Integer ' On vérifie si le fichier existe déjà... If Dir(strFilename) <> "" Then If MsgBox("Le fichier existe déjà. Souhaitez-vous le remplacer ?", _ vbQuestion + vbYesNo + vbDefaultButton2, "Export Modules") = vbNo Then Exit Sub End If End If ' Ouvrir le fichier texte intFileHandle = FreeFile Open strFilename For Output As #intFileHandle ' Traiter tous les modules un par un For Each ao In CurrentProject.AllModules ' On ouvre le module... DoCmd.OpenModule ao.Name ' On écrit le code sur disque... SaveModule "MODULE", Application.Modules(ao.Name), intFileHandle ' On referme le module DoCmd.Close acModule, ao.Name Next ' Même traitement pour les modules de formulaires For Each ao In CurrentProject.AllForms ' On ouvre le formulaire DoCmd.OpenForm ao.Name, acDesign ' On écrit le code sur disque If Forms(ao.Name).HasModule Then SaveModule "FORM MODULE", Forms(ao.Name).Module, intFileHandle End If ' On referme le formulaire DoCmd.Close acForm, ao.Name Next ' Même traitement pour les modules d'états For Each ao In CurrentProject.AllReports ' On ouvre l'état DoCmd.OpenReport ao.Name, acDesign ' On écrit le code sur disque If Reports(ao.Name).HasModule Then SaveModule "REPORT MODULE", Reports(ao.Name).Module, intFileHandle End If ' On referme l'état DoCmd.Close acReport, ao.Name Next ' On ferme ! Close #intFileHandle If blnOpenNotePad Then ' Ouvrir le bloc-notes Windows si nécessaire Shell "notepad.exe """ & strFilename & """", vbNormalFocus Else MsgBox "Opération terminée !", vbInformation, "Export Modules" End If End Sub ' --- ' ENREGISTRER LE CODE D'UN MODULE SUR DISQUE ' --- ' Entrée : strTitle <- Texte à afficher en en-tête ' (avant le nom du module). ' mdlModule <- Objet Module à enregistrer. ' intFileHandle <- Pointeur de fichier (handle). ' Sub SaveModule( _ ByVal strTitle As String, _ mdlModule As Access.Module, _ ByVal intFileHandle As Integer) ' Titre du module Print #intFileHandle, "' ----------" Print #intFileHandle, "' " & strTitle & ": " & mdlModule.Name Print #intFileHandle, "' ----------" Print #intFileHandle, "" Print #intFileHandle, mdlModule.Lines(1, mdlModule.CountOfLines) Print #intFileHandle, "" Print #intFileHandle, "" End Sub |
Pour tester…
Pour tester tout ça :
- Ouvrez la fenêtre Exécution (
CTRL
+G
). - Tapez dans cette fenêtre quelque chose comme :
1 |
SaveModules "C:\Documents and Settings\Hervé\Mes documents\modules.txt" |
Entre les guillemets, le nom du fichier à créer, et dans lequel sera recopié le code VBA de tous les modules de la base Access.
Et si vous êtes fainéant, et que vous souhaitez ouvrir automatiquement le bloc-notes de Windows en fin d’opération, écrivez plutôt :
1 |
SaveModules "C:\Documents and Settings\Herv\éMes documents\modules.txt", True |
Bisra > Je n’ai pas d’Access 2000 sous la main pour tester, mais de mémoire, ça devrait marcher sur cette version. Au cas où : est-ce qu’il n’y a pas un formulaire déjà ouvert, en cours d’utilisation ? Et est-ce que le fichier texte lui-même n’est pas aussi ouvert ?
Excellent. Merci pour cet utilitaire.
Malheureusemente le code se plante erreur avec 2174 « impossible de passer à un autre mode pour le moment »
Ca se passe là:
For Each ao In CurrentProject.AllForms
‘ On ouvre le formulaire
DoCmd.OpenForm ao.Name, acDesign
‘ On écrit le code sur disque
If Forms(ao.Name).HasModule Then
SaveModule « FORM MODULE », Forms(ao.Name).Module, intFileHandle
End If
J’utilise access 2000. Est-ce compatible ?
rien a dire toujours le meilleur du web!
juste pour vous dire votre analyse me plais beacouuuup merci