web-dev-qa-db-fra.com

Mettre le code Excel-VBA dans un module ou une feuille?

Qu'est-ce qu'une bonne pratique et une bonne hygiène du code? Mettre du code dans des modules ou des feuilles?

J'ai ce classeur Excel, avec des interfaces utilisateur dans chaque feuille. Chaque feuille du classeur effectue une partie différente d'une tâche globale. Dois-je placer le code correspondant à chaque feuille à l'intérieur des objets Feuille ou dans les modules? Regroupez-vous en un seul module ou en modules séparés?

J'utilise Excel 2003.

42

Certainement dans les modules.

  • Les feuilles peuvent être supprimées, copiées et déplacées avec des résultats surprenants.
  • Vous ne pouvez pas appeler le code dans la feuille "code-behind" à partir d'autres modules sans qualifier complètement la référence. Cela conduira au couplage de la feuille et du code dans d'autres modules/feuilles.
  • Les modules peuvent être exportés et importés dans d'autres classeurs et placés sous contrôle de version
  • Le code divisé logiquement en modules (accès aux données, utilitaires, formatage de feuille de calcul, etc.) peut être réutilisé en tant qu'unités et est plus facile à gérer si vos macros sont volumineuses.

Étant donné que l'outillage est si pauvre dans les systèmes primitifs tels que Excel VBA, les meilleures pratiques, l'hygiène obsessionnelle du code et le respect religieux des conventions sont importants, surtout si vous essayez de faire quelque chose de complexe à distance avec lui.

Cet article explique les utilisations prévues de différents types de conteneurs de code. Il ne précise pas pourquoi ces distinctions devraient être faites, mais je crois que la plupart des développeurs qui essaient de développer des applications sérieuses sur la plate-forme Excel les suivent.

Il existe également une liste de conventions de codage VBA que j'ai trouvées utiles, bien qu'elles ne soient pas directement liées à Excel VBA. Veuillez ignorer les conventions de dénomination folles qu'ils ont sur ce site, c'est tout hongrois fou .

49
jevakallio

D'après mon expérience, il est préférable de mettre autant de code que possible dans des modules bien nommés, et de ne mettre autant de code que nécessaire dans les objets de feuille de calcul réels.

Exemple: tout code qui utilise des événements de feuille de calcul comme Worksheet_SelectionChange ou Worksheet_Calculate.

10
Michael

Je suggérerais de séparer votre code en fonction de la fonctionnalité et du but spécifiques à chaque feuille ou module. De cette manière, vous mettriez uniquement le code relatif à l'interface utilisateur d'une feuille à l'intérieur du module de la feuille et vous ne mettriez que le code lié aux modules dans les modules respectifs. Utilisez également des modules distincts pour encapsuler le code partagé ou réutilisé entre plusieurs feuilles différentes.

Par exemple, disons que vous avez plusieurs feuilles chargées d'afficher les données d'une base de données d'une manière spéciale. Quels types de fonctionnalités avons-nous dans cette situation? Nous avons des fonctionnalités liées à chaque feuille spécifique, des tâches liées à l'obtention de données de la base de données et des tâches liées au remplissage d'une feuille avec des données. Dans ce cas, je pourrais commencer par un module pour l'accès aux données, un module pour remplir une feuille avec des données, et dans chaque feuille, j'aurais du code pour accéder au code dans ces modules.

Cela pourrait être présenté comme ceci.

Module: DataAccess:

Function GetData(strTableName As String, strCondition1 As String) As Recordset
    'Code Related to getting data from the database'
End Function

Module: PopulateSheet:

Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset)
    'Code to populate a worksheet '
End Function

Feuille: Code Sheet1:

Sub GetDataAndPopulate()
    'Sample Code'
     Dim rs As New Recordset
     Dim ws As Worksheet
     Dim strParam As String
     Set ws = ActiveSheet
     strParam = ws.Range("A1").Value

     Set rs = GetData("Orders",strParam)

     PopulateASheet ws, rs
End Sub

Sub Button1_Click()
    Call GetDataAndPopulate
End Sub
9
Ben McCormack