Question

Quelle est la meilleure façon de gérer les types définis par l'utilisateur communs entre les modules VBA?

I utilisent les mêmes types définis par l'utilisateur dans différents modules. Par exemple, je dois souvent représenter (x, y) des points, donc je finis par avoir ce Type dans différents modules:

Type XYpointType
    x As Double
    y As Double
End Type

I transmettre des arguments de type XYpointType vers et à partir des sous-marins et autres fonctions dans différents modules.

Cependant, je soupçonne que c'est une mauvaise façon de gérer les types définis par l'utilisateur. Le code de définition de Type exactement le même finit dans de nombreux modules différents.

Sinon, je pourrais avoir cette déclaration Type dans un seul module central « types », et tous les autres modules ont besoin de ce type particulier doivent se référer au module types. L'inconvénient est que chaque module perd sa « modularité » en ce sens qu'elle doit être accompagnée byt du module « types » partout où il va.

Toutes les suggestions?

Était-ce utile?

La solution

Ce qui est intéressant, parce que je ne savais pas que vous pourriez avoir deux modules deux déclarant un type public avec le même nom. Maintenant que je sais, je suis horrifié.

Alors d'abord, Eric Towers est exact que vous voulez mettre votre déclaration de type dans un seul module. D'autres modules qui utilisent ce type dépendra de ce module étant disponible, mais c'est juste quelque chose qui vient avec la modularisation. La nécessité de gérer les dépendances entre modules est commune à tous le développement de logiciels. Il est regrettable que dans un seul projet VBA (comme le genre que vous pouvez trouver dans un seul classeur Excel) la seule option pour la gestion des dépendances du module est manuel. (Dans VBA, « modules » sont vraiment « fichiers de code source ». D'autres langues / environnements ont différents systèmes d'emballage de niveau supérieur.)

Maintenant, pour la partie horrifiant. Si vous faites les types de déclaration des avec le même nom dans différents modules, vous définissez vous-même des problèmes. Considérons deux modules VBA:

'Module1

Public Type typ
    x As String
End Type

Public Sub useTyp()
    Dim t As typ
    t.x = 42

    Debug.Print t.x + t.x
End Sub

et

'Module2

Public Type typ
    x As Long
End Type

Public Sub useTyp()
    Dim t As typ
    t.x = 42

    Debug.Print t.x + t.x
End Sub

dans le même projet, votre code « compilation » (au moins dans Excel VBA). Mais les deux sous-marins « useTyp » donnent une sortie différente. Pire encore, si vous supprimez l'une des déclarations de type d'un des modules, vous avez soudainement changé le comportement de la routine « useTyp » dans le même module! Ce genre d'ambiguïté est jamais souhaitable.

Qu'est-ce qui se passe est que VBA crée vraiment deux types différents, « Module1.typ », et « Module2.typ ». Lorsque vous êtes dans le même module et ne sont pas admissibles le nom du type, VBA trouve silencieusement le type « droit » et l'utilise.

Je suis un peu surpris d'apprendre que vous passez des instances d'une « XYpointType » aux modules qui ont une autre déclaration « XYpointType ». Il est pas si important, mais pourriez-vous poster le code? Je suis intéressé par les choses nitpicky comme ça ...

Autres conseils

Utilisez votre deuxième méthode. Le point est de faire un blob Types réutilisables. Pour être réutilisable, il doit être séparé. Alors, oui, chaque module qui utilise ces types doit faire référence à ce blob. Mais peut dire la même chose sur les modules appelant les uns aux autres, les formulaires exigeant des modules qu'ils appellent, et c.

Vous pouvez également créer une classe pour vos XYPoints. Cela vous permettra d'avoir des fonctions personnalisées et des méthodes si vous avez besoin d'aller dans cette voie. Les types sont très limités par rapport aux classes.

Voici une bonne ressource pour vous aider à démarrer: http://www.cpearson.com /excel/Classes.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top