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 :

[VBA] Collection dans un module de classe


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de spaiku
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 209
    Par défaut [VBA] Collection dans un module de classe
    Bonjour,

    j'aimerais comprendre le phénomène suivant (sous VB6) :

    - J'ai un module de classe Commande qui possède une collection Proprietes qui permet de stocker les valeurs retournées par un SELECT, et contenues dans un recordset rs.

    - Je renseigne la collection Proprietes étape par étape dans la méthode Initialiser. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function Initialiser(p_NumCommande as Integer) as Boolean
    '...
    Proprietes.Add rs.fields("champ1"), "champ1"
    Proprietes.Add rs.fields("champ1"), "champ1"
    '...
    End Function
    - Puis au sein d'une autre fonction, j'exécute le code suivant, qui fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim toto as New Commande
    toto.Initialiser "n° de commande quelconque"
    debug.print toto.Proprietes(1).Name
    - Ensuite, j'ai voulu renseigner la collection Proprietes dynamiquement (plus élégant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For each fld in rs.Fields
          Proprietes.Add fld.Value, fld.Name
    Next fld
    - J'ai maintenant l'erreur d'exécution 424 (objet requis) sur le debug.print

    Pouquoi tant de haine ?

  2. #2
    Membre expérimenté Avatar de psykodumarteau
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 184
    Par défaut
    Bonjour,

    As-tu vérifier que ta boucle for each parcours bien les différents champs de ton recordset?

    Cordialement

  3. #3
    Membre expérimenté Avatar de spaiku
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 209
    Par défaut
    Bonjour,

    merci pour la réponse.

    Oui, la collection est correctement renseignée : le code suivant fonctionne pour récupérer la valeur de la propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print toto.Proprietes(1)
    Celui-ci fonctionne aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print toto.Proprietes("maProp")
    C'est donc spécifiquement l'accès à la clé de l'élément de collection qui pose problème

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    J'ai testé ton code. J'ai, évidemment, le même problème. En regardant les valeurs espions, je vois que lorsque l'on utilise rs!..., on passe un objet à la collection, alors que lorsque l'on utilise fld.value et fld.name, on passe une variable...

    Si pas de solution début d'après-midi, je chercherai une solution
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre expérimenté Avatar de psykodumarteau
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 184
    Par défaut
    Re,

    Avant de vérifier si ta collection marche bien, Vérifie que ton "for each fld in rs.fields" fonctionnement correctement. A mon avis le probleme ne vient pas la collection puisse que tu réussis à la renseigner manuellement.

    Pour tester ta boucle tu peu faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For each fld in rs.Fields
          MsgBox fld.Value & " / " & fld.Name
    Next fld
    As-tu bien déclarer Fld comme un field?

    Cordialement

  6. #6
    Membre expérimenté Avatar de spaiku
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 209
    Par défaut
    Merci pour vos réponses.

    - Psyko : la boucle qui parcourt le recordset fonctionne comme il faut. J'arrive à renseigner la valeurs des propriétés et à y accéder.

    - Pierre : je pense que vous avez mis le doigt sur le coeur du problème. Je suis en train de travailler sur une solution de contournement qui me semble du coup être la bonne : créer un autre module de classe Propriete qui me permettra d'ajouter des objets à la collection tout en conservant ma boucle For Each... Next. Ce qui me permettra notamment de pouvoir modifier la structure des tables sans avoir à toucher au code des modules.

    Merci encore à vous deux pour votre aide.

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

Discussions similaires

  1. [XL-2007] Création d'un comboxbox dans un module de classe
    Par JLP64 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/10/2011, 12h24
  2. [VBA] Connexion permanente dans un module de classe
    Par cocobingo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/01/2009, 13h54
  3. Setter dans un module de classe
    Par Mathusalem dans le forum Général VBA
    Réponses: 2
    Dernier message: 10/11/2008, 15h25
  4. erreur avec withevents dans un module de classe
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/12/2007, 04h32
  5. Accesseur de collection dans un module de classe
    Par in dans le forum Général VBA
    Réponses: 4
    Dernier message: 17/08/2007, 18h09

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