IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Variables publiques ou module de classe


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut Variables publiques ou module de classe
    Bonjour,

    Au détour de plusieurs discussions, il apparaît que certains n'utilisent pas de variables publiques, mais plutôt un module de classe.

    J'ai fait pas mal de recherche, mais je n'ai pas trouvé de discussions relatant les avantages / désavantages de telle ou telle solution. J'espère ne pas les avoir manquées. Si tel était le cas, merci de me "glisser" le(s) lien(s).

    Autrement, je serais vraiment intéressé à avoir des avis sur la question.

    Merci d'avance.

    Domi2

  2. #2
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bjr,

    Je donne mon avis, me frapper pas :

    Pour les classes je vois rapidement deux avantages :
    1 - On dispose d'une procédure Class_Initialize et d'une procédure Class_Terminate (pour libérer d'éventuels objets publiques)
    2 - On peut libérer la mémoire lorsqu'on n'a plus besoin des variables

    Exemple un peu exagéré pour la question de la mémoire :
    Je veux passer un tableau de un million d'entrées d'un formulaire à un autre (ah bon c'est beaucoup?)

    Si je choisi la solution de variable publique :
    - Je déclare un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public MonTableau(1 To 1000000) As String
    - Je rempli le tableau dans le premier formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim lcpt As Long
    For lcpt = 1 To 1000000
        MonTableau(lcpt) = Str(lcpt)
    Next
    - et ensuite je peux ouvrir le deuxième formulaire et utiliser mon tableau

    ==> bilan de l'opération : 38Mo de mémoire qui ne seront pas libérés avant la fermeture de l'application


    Si je choisi la solution d'une classe :
    - Je crée une classe, nommée Classe1, dans laquelle je défini mon tableau et les méthodes et propriétés dont j'ai besoin pour le remplir et le lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Option Explicit
     
    Private MonTableau() As String
     
    Public Sub RedimTab(pTaille As Long)
    ReDim MonTableau(1 To pTaille) As String
    End Sub
     
    Property Get Valeur(pIndex As Long) As String
    Valeur = MonTableau(pIndex)
    End Property
     
    Property Let Valeur(pIndex As Long, pValeur As String)
    MonTableau(pIndex) = pValeur
    End Property
    - Je déclare mon instance de classe en publique quand même...
    - Dans mon premier formulaire je crée mon objet de classe
    - Et je rempli mon tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cl.RedimTab (1000000)
    Dim lcpt As Long
    For lcpt = 1 To 1000000
        cl.Valeur(lcpt) = Str(lcpt)
    Next
    - J'ouvre ensuite mon deuxième formulaire, je me sers des données du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox cl.Valeur(56213)
    - Et à la fin, lorsque je n'ai plus besoin des données (au pire à la fermeture du deuxième formulaire) je libère l'instance de classe, et donc la mémoire utilisée par toute les variables qu'elle contient.
    ==> bilan de l'opération : Les 38Mo de mémoire sont libérés après utilisation

    Pour un cas simple avec une ou deux variables, la méthode "variable publique" ne m'effraye pas plus que ça....

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    ben vrai c'est bien utile tout ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim montab() As Variant
     
    Sub litab(ByRef x As Variant)
    ' à ce stade j'ai combien de mémoire affectée ?
    MsgBox (UBound(x))
    End Sub
     
    Function essai()
    ReDim montab(1000000)
    litab (montab)
    End Function
    ' et à ce stade ?

  4. #4
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Bonjour Arkham,

    Et merci de ton intérêt.

    En fait, j'utilise entre 5 et 15 variables publiques (ordre de grandeur), essentiellement des variables de type String, qui on surtout rapport avec l'environnement des applications (chemin de certains répertoires / dossiers, configuration de certaines options, etc...).

    Je pourrais donc tout aussi bien me servir d'une table "Paramètres" et récupérer les informations dont j'ai besoin en temps utile (j'ai encore une appli qui fonctionne sur ce principe).

    La seul gros défaut que je vois à l'utilisation de variables publiques, c'est évidemment une erreur non gérée, les variables étant perdues. Cela nécessite donc une gestion d'erreur "béton".

    Mais autant que j'aie pu lire, je n'ai vu nul part que l'utilisation d'un module de classe permettait de pallier à cet inconvénient.

    Domi2

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    L'avantage du module de classe sur la variable globale c'est que tu as un peu plus de contrôle sur les manip qui sont faites sur ta variable.

    Je dis un peu car comme tu n'as pas de constructeur paramétré pratiquement n'importe quel programme peu modifier ta variable mais c'est en théorie plus propre.

    Personnelement pour des variables d'environement j'utilise des variables globales. Ces variables n'étant généralement écrites qu'une seule fois et lues plein de fois il y a peu de risque qu'elles soients modifiées par erreur.

    Par contre je fuis comme la peste les variables globales pour le passage de d'informations entre module ! Ces variables ont généralement une vie plus mouvementée et un bon contrôle est le bienvenu.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Bonjour,

    Et merci pour vos réponses...

    Au détour d'une discussion, mout1234 a dit :

    Pour ma part, je mets ce genre de truc dans une classe représentant l'appli...
    Je vais donc essayer de faire un module de classe... Et je reviendrais si j'ai des questions plus précises ou si je bute sur un problème particulier.

    Domi2

  7. #7
    seb92400
    Invité(e)
    Par défaut
    Hello,

    Merci Domi2 d'avoir créé cette discussion... Ca rejoint un petit peu celle que j'ai créée ici

    Je m'aperçois fnalement qu'il y a beaucoup de questions sur les modules de classes avec access...

    Je vais continuer de chercher, essayer de trouver de la doc afin de rendre tout ceci plus clair encore...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] Module de classe et évènement
    Par Caroline1 dans le forum Access
    Réponses: 9
    Dernier message: 20/03/2013, 23h23
  2. [Module de classe] Fonction non liée à l'instance?
    Par Caroline1 dans le forum Access
    Réponses: 6
    Dernier message: 07/04/2006, 20h13
  3. Réponses: 4
    Dernier message: 31/03/2006, 15h16
  4. Réponses: 8
    Dernier message: 22/02/2006, 15h09
  5. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo