Global
est un mot-clé obsolète; la seule différence entre Global
et Public
est que vous ne pouvez pas utiliser Global
dans un module de classe. Préférez Public
pour la cohérence.
Utilisez le modificateur d'accès peu connu Friend
pour rendre un membre accessible partout à l'intérieur du projet dans lequel il est déclaré, mais seulement à l'intérieur de ce projet.
L'inconvénient est qu'il n'est utilisable que dans un module de classe, et seulement pour les procédures - vous ne pouvez pas créer un Friend Const
.
Une solution de contournement pourrait consister à tirer parti de l'attribut de classe caché VB_PredeclaredId
et le définir sur True
- créez un nouveau fichier texte dans le Bloc-notes, avec ce contenu:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "StaticClass1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Enregistrez le fichier avec une extension .cls
, puis importez-le dans votre projet.
Ensuite, vous pouvez le renommer en quelque chose de plus significatif, et exposer un membre Friend Property Get
:
Friend Property Get R() As Single
R = 8.314
End Property
Et maintenant, vous pouvez utiliser cette valeur, mais seulement à l'intérieur du projet qui contient cette classe. Grâce à l'attribut PredeclaredId
, vous n'avez pas besoin de créer une instance New
:
Debug.Print StaticClass1.R ' 8.314
Malheureusement (?) l'attribut VB_GlobalNamespace
n'a aucun effet dans les classes utilisateur VBA, donc l'objet qualifiant (l'instance de classe pré-déclarée a le même nom que le module de classe lui-même - c'est exactement ainsi que UserForm1.Show
peut fonctionner) est requis.
Attention : il peut être tentant de stocker l'état d'instance (par exemple des variables de niveau de module privé) sur une instance par défaut (surtout dans les formulaires), mais cela devrait être évité autant que possible. Si vous avez besoin de stocker l'état, envisagez de travailler avec une instance New
de la classe à la place. Les instances par défaut avec état sont plus sujettes aux erreurs, notamment parce que la durée de vie de l'objet est gérée par le runtime VBA, et non par le code utilisateur. Si l'instance par défaut est recyclée/recréée, tout état précédemment détenu est réinitialisé à ce que sont les valeurs par défaut au moment de la conception.
Notez que les modules de classe sont privés par défaut, ce qui les rend déjà invisibles pour les autres projets de référence. Vous pouvez changer la propriété Instancing de la classe pour la rendre PublicNotCreatable
, ce qui changera la valeur de son attribut VB_Exposed
en True
:
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Les classes publiques peuvent être accédées depuis l'extérieur du projet, mais ne peuvent pas être créées directement avec le mot-clé New
(changer la valeur de l'attribut VB_Creatable
n'a aucun effet en VBA). Avec une classe publique/exposée, les projets de référence pourront invoquer les membres Public
, mais pas les Friend
:
Public Property Get UseMeAnywhere() As Long
UseMeAnywhere = 42
Friend Property Get YouOnlySeeMeInThisProject() As Long
YouOnlySeeMeInThisProject = 42