Instancier un objet commun à plusieurs subs

david84

XLDnaute Barbatruc
Bonsoir le forum,
j'ai plusieurs sub dans lesquelles j'instancie le même objet (une plage de valeurs).
Je voudrais savoir s'il existe un moyen de l'instancier une seule fois et qu'il puisse être utilisé dans plusieurs sub, sans avoir à l'instancier à chaque fois (un peu comme le fait de déclarer une variable en tête de procédure dans un module).
Pour l'instant, le seul moyen que j'ai trouvé est d'instancier l'objet dans une sub, puis d'y faire appel dans mes autres sub mais je pense qu'il y a mieux à faire :
Code:
Option Explicit
Dim Plg As Range
Sub test1()
Set Plg = Worksheets(1).[A1].CurrentRegion
End Sub

Sub test2() 'fonctionne
Call test1
MsgBox Plg.Address
Set Plg = Nothing
End Sub

Sub test3() 'ne fonctionne pas
MsgBox Plg.Address
Set Plg = Nothing
End Sub
Je me pose également la même question pour un objet utilisé dans des modules différents : pour la déclaration de la variable, l'utilisation de "Public" résout la question mais comment faire pour l'instanciation des objets déclarés ?
Là encore, l'appel d'une sub d'instanciation des objets fonctionne mais n'y a-t-il pas mieux à faire (cf. fichier modules 1 et 2) ?
Merci
 

Pièces jointes

  • InstancierObjetCommunAPLusieursModules.xls
    33 KB · Affichages: 62
  • InstancierObjetCommunAPLusieursModules.xls
    33 KB · Affichages: 65
  • InstancierObjetCommunAPLusieursModules.xls
    33 KB · Affichages: 66

Staple1600

XLDnaute Barbatruc
Re : Instancier un objet commun à plusieurs subs

Bonsoir

Voici ce que dit l'aide VBA
Portée et visibilité


La portée se réfère à la disponibilité d'une variable, d'une constante ou d'une procédure en vue d'une utilisation par une autre procédure. Il existe trois niveaux de portée : niveau de procédure, niveau de module privé et niveau de module public.
Vous choisissez la portée d'une variable lors de sa déclaration. Il convient de déclarer toutes les variables explicitement pour éviter les erreurs de conflit d'affectation de nom entre variables de différentes portées.
Définition d'une portée de niveau procédure

Une variable ou une constante définie dans une procédure n'est pas visible à l'extérieur de celle-ci. Seule la procédure contenant la déclaration de variable peut l'utiliser. Dans l'exemple suivant, la première procédure affiche un message contenant une chaîne. La deuxième procédure affiche un message vide puisque la variable strMsg est locale dans la première procédure.
Sub LocalVariable()
Dim strMsg As String
strMsg = "Cette variable ne peut pas être utilisée en dehors de " & "cette procédure."
MsgBox strMsg
End Sub

Sub OutsideScope()
MsgBox strMsg
End Sub
Définition d'une portée de niveau module privée

Vous pouvez définir des variables et constantes de niveau module dans la section Déclarations d'un module. Les variables de niveau module peuvent être publiques ou privées. Les variables publiques sont accessibles dans toutes les procédures de tous les modules d'un projet ; les variables privées sont disponibles uniquement dans les procédures de ce module. Par défaut, les variables déclarées avec l'instruction Dim dans la section Déclarations ont une portée privée. Vous pouvez toutefois faire précéder la variable du mot clé Private pour améliorer la lisibilité de votre code.
Dans l'exemple suivant, la variable de chaîne strMsg est accessible dans toutes les procédures définies dans le module. Lorsque la deuxième procédure est appelée, elle affiche le contenu de la variable de chaîne strMsg dans une boîte de dialogue.
' Ajoute ce qui suit dans la section Déclarations du module.
Private strMsg sAs String

Sub InitializePrivateVariable()
strMsg = "Cette variable ne peut pas être utilisée à l'extérieur " & " de ce module."
End Sub

Sub UsePrivateVariable()
MsgBox strMsg
End Sub
Note Les procédures publiques dans un module standard ou dans un module de classe sont accessibles dans n'importe quel projet référant. Pour limiter au projet en cours la portée de toutes les procédures d'un module, ajoutez une instruction Option Private Module dans la section Déclarations du module. Les variables et les procédures publiques seront toujours accessibles dans les autres procédures du projet en cours, mais pas dans les projets référants.
Définition d'une portée de niveau module publique

Si vous déclarez une variable de niveau module comme publique, elle est accessible dans toutes les procédures du projet. Dans l'exemple suivant, la variable de chaîne strMsg peut être utilisée par n'importe quelle procédure de n'importe quel module du projet.
' Inclut dans la section Déclarations du module.
Public strMsg As String
Toutes les procédures sont publiques par défaut, à l'exception des procédures d'événement. Lorsque Visual Basic crée une procédure d'événement, le mot clé Private est automatiquement inséré avant la déclaration de la procédure. Pour toutes les autres procédures, vous devez explicitement déclarer la procédure avec le mot clé Private si vous ne souhaitez pas la rendre publique.
À partir de projets référants, vous pouvez utiliser des procédures, des variables et des constantes publiques définies dans des modules standard ou des modules de classe. Cependant, vous devez d'abord définir une référence au projet dans lequel elles sont définies.
Les procédures, les variables et les constantes publiques définies dans des modules autres que des modules standard ou de classe, tels que des modules de feuilles ou des modules d'état, ne sont pas accessibles dans des projets référants, puisque ces modules sont privés dans leur projet de résidence.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Instancier un objet commun à plusieurs subs

Re
Merci JM pour ta réponse. Cependant, à moins de ne pas avoir tout saisi dans ta réponse ou de ne pas avoir été clair dans ma question, mon questionnement n'est pas à proprement parler sur la déclaration des variables (je n'en ai parlé que pour pour prendre cet exemple comme référence), mais sur l'instanciation des variables objet.

Quand j'utilise les mêmes variables dans différentes sub d'un même module, je n'ai besoin de la déclarer qu'une seule fois en tête de ce module.

Quand j'utilise les mêmes variables dans différentes sub de différents modules, je déclare ces variables en utilisant le terme Public devant le nom de la variable et celles-ci sont alors accessibles à l'ensemble des sub et fonction utilisant ces variables.

Ma question est :quand les objets utilisés dans plusieurs sub sont les mêmes, y-a-t-il un moyen de n'instancier les variables objet qu'une seule fois sans avoir à le faire dans chaque sub ?
Le moyen que j'ai trouvé est de les instancier dans une sub, puis d'appeler cette sub dans chacune de mes autres subs.
Cela fonctionne mais je me demandais s'il existait un autre moyen de procéder.
Désolé si la réponse à cette question se trouve dans ton message mais si c'est le cas, c'est que je ne l'ai pas comprise:confused:.
A+
 

CHALET53

XLDnaute Barbatruc
Re : Instancier un objet commun à plusieurs subs

Bonjour,

Sans être un spécialiste, la solution doit résider dans l'utilisation d'un module de classe

un essi
 

Pièces jointes

  • InstancierObjetCommunAPLusieursModules.xls
    42 KB · Affichages: 96
  • InstancierObjetCommunAPLusieursModules.xls
    42 KB · Affichages: 101
  • InstancierObjetCommunAPLusieursModules.xls
    42 KB · Affichages: 100

david84

XLDnaute Barbatruc
Re : Instancier un objet commun à plusieurs subs

Re
Bonjour Chalet53,
merci pour ta réponse. Je ne connais pas les modules de classe, c'est donc une occasion d'y regarder de plus près. J'étudie ta proposition et te fais un retour.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 609
Messages
2 090 202
Membres
104 451
dernier inscrit
scp9990