Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Organisation des projets VBA

  • Initiateur de la discussion Initiateur de la discussion Christian22
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

C

Christian22

Guest
Bonjour à tous,

j'ai des développements VBA de plus en plus nombreux (différents modules sur de nombreuses feuilles) et j'ai besoin de trouver un moyen efficace d'organiser tout cela.

Je présume qu'il existe des normes pour nommer et organiser le code chez les professionnels. Connaissez vous des méthodes ou des documents de référence sur le sujet (et pas trop compliqués non plus 😱 ).

Merci,

Christian
 
Re : Organisation des projets VBA

Bonjour.
Le seul conseil que je peux vous donner c'est d'attribuer des noms bien significatifs aux modules. Cela vaut aussi pour les CodeName des feuilles Excel, les noms des userform et de leurs contrôles. Un préfixe court d'1 à 3 lettres identifiant leur nature n'est pas superflu.
Si ça vous intéresse, j'ai aussi un système de documentation automatique (pour ce qui est de l'inventaire des feuilles, des plages nommées et des modules. Les explications sont à ajouter manuellement) le tout avec liens hypertextes permettant de les atteindre.
Cordialement.
 
Dernière édition:
Re : Organisation des projets VBA

bonjour,

pour sauver dans un fichier.txt
voir ce petit Sub placé dans le classeur concerné
et le lancer en faisant tapant sur F5

Code:
'                                                  .
'SaveCodeMacroThisWorkbookDansFichTXT              .
'CETTE ROUTINE DOIT ETRE DANS LE CLASSEUR CONCERNE !
'elle load ttes les routines de ce classeur SOIT "ThisWorkbook"
'et Save les résultats dans un Fichier.Doc dans le Rep Courant !
'                                                             .
'Cocher Référence "Microsoft Visual Basic For Application Extensibility 5.3"
'                                                                          .
Public Sub SaveCodeMacroThisWorkbookDansFichTXT1()
Dim VBCodeMod As CodeModule, Wbk As Workbook
Dim NbrDeRout As Integer, NbrDeRoutGlobal As Integer, NbrDeLigGlobal As Integer
Dim SwapValAlpha As String, SwapValNum As Integer
Set Wbk = ThisWorkbook
NbrDeComponent = Wbk.VBProject.VBComponents.Count
ReDim NomDeLaRout(1 To NbrDeComponent) As String, NbrDeLigRout(1 To NbrDeComponent) As Integer
For I = 1 To Wbk.VBProject.VBComponents.Count
 NomDeLaRout(I) = Wbk.VBProject.VBComponents(I).Name
 NbrDeLigRout(I) = Wbk.VBProject.VBComponents(I).CodeModule.CountOfLines
 NbrDeLigGlobal = NbrDeLigGlobal + NbrDeLigRout(I)
Next
X = NbrDeComponent / 2 ' tri
Do While X
 For A = 1 To NbrDeComponent - X
  If NomDeLaRout(A) > NomDeLaRout(A + X) Then
     SwapValAlpha = NomDeLaRout(A): NomDeLaRout(A) = NomDeLaRout(A + X): NomDeLaRout(A + X) = SwapValAlpha
     SwapValNum = NbrDeLigRout(A): NbrDeLigRout(A) = NbrDeLigRout(A + X): NbrDeLigRout(A + X) = SwapValNum
     For B = A - X To 1 Step -X
      If NomDeLaRout(B + X) >= NomDeLaRout(B) Then Exit For
      SwapValAlpha = NomDeLaRout(B): NomDeLaRout(B) = NomDeLaRout(B + X): NomDeLaRout(B + X) = SwapValAlpha
      SwapValNum = NbrDeLigRout(B): NbrDeLigRout(B) = NbrDeLigRout(B + X): NbrDeLigRout(B + X) = SwapValNum
     Next
  End If
 Next: X = X / 2
Loop
'save
Fich$ = Left(ThisWorkbook.Name, InStr(ThisWorkbook.Name, ".") - 1)
Fich$ = "CodeVB " & Fich$ & ".txt": NoF = FreeFile
Open Fich$ For Output As #NoF
Print #NoF, ThisWorkbook.Name
Print #NoF, "Nombre de Composants  :"; NbrDeComponent
Print #NoF, "Nombre de Lignes Code :"; NbrDeLigGlobal
Print #NoF, "Nombre de Routines    : en fin de liste..."
NbrDeRoutGlobal = 0
For I = 1 To NbrDeComponent
 Set VBCodeMod = Wbk.VBProject.VBComponents(NomDeLaRout(I)).CodeModule
 Print #NoF, ""
 Print #NoF, "-- " & I & "'Composant -------------------- " & NomDeLaRout(I) & " ... " & NbrDeLigRout(I) & " Ligne(s)"
 NbrDeRout = 0
 With VBCodeMod
   Ligne = .CountOfDeclarationLines + 1
   Do Until Ligne >= .CountOfLines
     NbrDeRout = NbrDeRout + 1
     Z$ = .ProcOfLine(Ligne, vbext_pk_Proc): Print #NoF, NbrDeRout & ") " & Z$
     Ligne = Ligne + .ProcCountLines(.ProcOfLine(Ligne, vbext_pk_Proc), vbext_pk_Proc)
   Loop
 End With
 NbrDeRoutGlobal = NbrDeRoutGlobal + NbrDeRout
Next
Print #NoF, ""
Print #NoF, "Nombre de Routines Global :"; NbrDeRoutGlobal
Close #NoF
MsgBox "Fichier " & Fich$ & vbLf & "Save " & CurDir
End Sub

celui-ci idem plus compacte

Code:
Public Sub SaveCodeMacroThisWorkbookDansFichTXT2() 'uniquement pour voir les lignes avec les noms
Dim VBCodeMod As CodeModule, Wbk As Workbook
Dim NbrDeRout As Integer, NbrDeRoutGlobal As Integer, NbrDeLigGlobal As Integer
Dim SwapValAlpha As String, SwapValNum As Integer
Set Wbk = ThisWorkbook
NbrDeComponent = Wbk.VBProject.VBComponents.Count
ReDim NomDeLaRout(1 To NbrDeComponent) As String, NbrDeLigRout(1 To NbrDeComponent) As Integer
For I = 1 To Wbk.VBProject.VBComponents.Count
 NomDeLaRout(I) = Wbk.VBProject.VBComponents(I).Name
 NbrDeLigRout(I) = Wbk.VBProject.VBComponents(I).CodeModule.CountOfLines
 NbrDeLigGlobal = NbrDeLigGlobal + NbrDeLigRout(I)
Next
X = NbrDeComponent / 2 ' tri
Do While X
 For A = 1 To NbrDeComponent - X
  If NomDeLaRout(A) > NomDeLaRout(A + X) Then
     SwapValAlpha = NomDeLaRout(A): NomDeLaRout(A) = NomDeLaRout(A + X): NomDeLaRout(A + X) = SwapValAlpha
     SwapValNum = NbrDeLigRout(A): NbrDeLigRout(A) = NbrDeLigRout(A + X): NbrDeLigRout(A + X) = SwapValNum
     For B = A - X To 1 Step -X
      If NomDeLaRout(B + X) >= NomDeLaRout(B) Then Exit For
      SwapValAlpha = NomDeLaRout(B): NomDeLaRout(B) = NomDeLaRout(B + X): NomDeLaRout(B + X) = SwapValAlpha
      SwapValNum = NbrDeLigRout(B): NbrDeLigRout(B) = NbrDeLigRout(B + X): NbrDeLigRout(B + X) = SwapValNum
     Next
  End If
 Next: X = X / 2
Loop
'save
Fich$ = Left(ThisWorkbook.Name, InStr(ThisWorkbook.Name, ".") - 1)
Fich$ = "CodeVB " & Fich$ & ".txt": NoF = FreeFile
Open Fich$ For Output As #NoF
For I = 1 To NbrDeComponent
 Set VBCodeMod = Wbk.VBProject.VBComponents(NomDeLaRout(I)).CodeModule
 With VBCodeMod
   Ligne = .CountOfDeclarationLines + 1
   Do Until Ligne >= .CountOfLines
     Z$ = .ProcOfLine(Ligne, vbext_pk_Proc): Print #NoF, Left(Z$ & Space(45), 45) & " * "; NomDeLaRout(I)
     Ligne = Ligne + .ProcCountLines(.ProcOfLine(Ligne, vbext_pk_Proc), vbext_pk_Proc)
   Loop
 End With
Next
Close #NoF
MsgBox "Fichier " & Fich$ & vbLf & "Save " & CurDir
End Sub
 
Re : Organisation des projets VBA

Bonsoir,

Je ne crois pas qu'il existe des règles bien précises.

Perso, je renomme les modules par rapport à leur fonctionnalité et range les macros dans les modules adéquats.

Ex : Requête SQL, Traitement Fichier, Déclarations variables et constantes, Mise en Page, Graphes, reconnaissance_utilisateurs et j'ai une ou 2 bibliothéques couteau suisse. BiblioOutils contient les procédures et fonctions passe partout, BiblioFenetre pour le traitement des fenêtres via les api windows ....

Nota : Plus l'on mets de commentaires et plus il est facile de maintenir tous ces modules .

Ensuite un module général permettra d'écrire le squelette de ton application.

Encore un petit conseil : Ecrire le moins de code possible dans les userforms et les onglets, n'y gérer que les événementiels et faire appel à des procédures ou fonctions dans un module standard .

et si tu ne le fait déjà, en entête de chaque module toujours écrire : Option Explicit, ceci oblige à déclarer les variables et évite bien des désagréments.

Voilà ce que l'expérience de quelque années de pratique de vba dans Access, Excel , et autre m'a permis de tirer comme règles.

J'espère que tous ces points pourront d'aider à t'organiser.
 
Re : Organisation des projets VBA

re

le deuxième Sub je l'utilise personnellement comme suit
après svg, je load le fichier qui s'ouvre avec bloc note,
je copi tout et je place tout dans un classeur excel
celui-ci disposant d'un bouton qui active une macro
qui sépare toutes les lignes à l'endroit "*" que j'ai mis pour cela
puis recopi tout dans la feuil2
et j'ai Feuil1 triée sur Colonne A (Subs Functions ...)
et j'ai Feuil2 triée sur colonne B (Feuils Modules ...)

ci-joint ce classeur, simple car pour mon utilisation perso !
 

Pièces jointes

Re : Organisation des projets VBA

Bonjour à tous

Ayant un peu d'expérience dans ce domaine, comme dit précédemment, le plus simple est de donner à chaque module un nom explicite en y regroupant les macros, fonctions et variables public dont le module a besoin.

Idem pour les procédures (les macros sub ..), penser à ce que le noms soit facilement identifiables. Si on fait des macros sur de TCDs par exemple, commencer toutes les procédures par TCD.

Sinon, avec mon pense-bête, on peut facilement retrouver ses codes que l'on y aura stocké ou trouvé sur le net 🙂.
 
Dernière édition:
Re : Organisation des projets VBA

J'allais oublier une notion qui à cours dans certains milieux professionnels de la programmation, c'est l'organisation en "couches" de logiciel. On commence cette démarche sans le savoir en écrivant des Sub destinées à être utilisées comme services généraux dans plusieurs autres Sub qui s'en trouvent ainsi allégées. Dédier des modules entier à un certain niveau de couche peut apporter de l'organisation, en même temps que l'occasion de documenter en tête chaque module d'un exposé de sa vocation.
Cordialement.
 
Dernière édition:
Re : Organisation des projets VBA

Merci à tous,

je vais essayer de faire mon miel de toutes ces réponses.
Je vois que le sujet est commun à tous mais que - malheureusement - il n'y a pas de solution "définitive".

Actuellement, j'avais tendance à ranger le code à l'intérieur de modules assurant une même fonction (du type : toutes les requètes SQL dans un même module) ou un même sous-projet du développement, mais je suis dépassé par les empilements de code.

Je pense que je vais m'orienter vers "un composite" des différentes solutions:
- 1 code par module
- 3 lettres initiales fonction de la nature du code (type SQL)
-1 nom explicite
- des modules de "1ère couche" qui ont juste une fonction d'organisation et de lancement des différentes parties du programme

Bien à vous,

Christian
 
Re : Organisation des projets VBA

Bonjour
Juste une précision qui me semble importante: On peut en effet être très vite dépassé par une organisation en couche si les éléments qui les composent sont trop nombreux du fait qu'ils n'ont pas été écrit d'une façon suffisamment paramétrable pour pouvoir être réutilisés dans de nombreux contextes de chaque niveau supérieur qui les emploie.
Autre information: Il y une chose en VBA qui a tendance à introduire d'office une organisation en couche: ce sont les modules de classe.
Cordialement.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…