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

Macros et VBA Excel Discussion :

Créer un module de classe


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut Créer un module de classe
    Bonjour,

    J´essaie de créer un nouveau type ou nouveau objet (je ne sais pas comment on dit) qui serait de la forme suivante. Ma nouvelle classe serait appelé FICHE et dans cette classe, il y aurait une propriété appelée séquence.

    <souligne>J´écris dans mon module de classe</souligne>:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Private Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Private Type FICHE
        Num As Integer
        Mot As Sequence
        Commentaire As String
     
    Private Sub Class_Initialize()
        FNum = 0
    End Sub
     
    Public Property Let Num(Valeur As Integer)
        FNum = Valeur
    End Property
     
    Private Property Let Mot(Valeur() As Sequence)
        FMot.Chaine = Valeur.Chaine
        FMot.Langue = Valeur.Langue
        FMot.Gram = Valeur.Gram
    End Property
     
    Public Property Let Commentaire(Valeur As String)
        FCommentaire = Valeur
    End Property
     
     
    Public Property Get Num() As Integer
        Num = FNum
    End Property
     
    Private Property Get Fra_mot() As Sequence
        Mot = F.mot
    End Property
     
    Public Property Get Commentaire() As String
        Commentaire = FCommentaire
    End Property
    --------------------------------------------------------------------------------------

    Lorsque dans un module principal, j´essaie de tester mon nouvel objet, j´obtiens un message d´erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test() 
     
    Dim element as New FICHE
     
                        element.Num = 1    'Fonctionne
                        element.Mot.Chaine  = "pomme" ' Me donne un message d´erreur disant qu´il est impossible de trouver la méthode ou la donnée membre
     
    End sub
    Je suis bloqué la dessus depusi toute la matinée. Je sais pas si quelau´un pourrait me donner un coup de main.

    Merci bien

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut
    Dans ton module de classe la property Mot est défini comme Private, donc non accessible a l'extereir de ton modul de class.
    De plus Ta property Mot demande comme paramètre un Object de type Sequence et dans ton code tu essais de lui transmettre une chaine de caractère.
    [Edit]Essai peut être quelque chose comme ça plutôt
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Private FNum As Integer
    Private FMot As Sequence
    Private FCommentaire As String
     
    Private Sub Class_Initialize()
        FNum = 0
    End Sub
     
    Public Property Let Num(Valeur As Integer)
        FNum = Valeur
    End Property
     
    Public Sub SetMot(Chaine As String, Langue As String, Gram As String)
        FMot.Chaine = Chaine
        FMot.Langue = Langue
        FMot.Gram = Gram
    End Sub
     
    Public Property Let Commentaire(Valeur As String)
        FCommentaire = Valeur
    End Property
     
     
    Public Property Get Num() As Integer
        Num = FNum
    End Property
     
    Public Property Get Commentaire() As String
        Commentaire = FCommentaire
    End Property
    Avec l'utilisation suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
     
    Dim element As New TFiche
     
    element.Num = 1    'Fonctionne
    element.SetMot "essai", "LangFr", "GramFr"
    End Sub
    Le module de Classe a été nommé TFiche, attention a tes déclaration de variable, tu utilise des variable déclaré nul part (FMot par exemple) mais c peut être dut a une simplification de ton code afin de le poster ici.

    Regarde également des tutoriels sur le sujet ça devrait t'aider, car je crois que tu te mélanges un peu les pinceaux entre Module et Module de Class, si tu veux créer un Objet Fiche (TFiche pour moi) ce doit être le nom de ton Modul de Class, inutile donc de créer un type Fiche dans ton Module de class.
    [/Edit]
    [Edit2]
    http://fauconnier.developpez.com/art...neral/classes/
    [/Edit]
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    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

    Le code que tu donnes pose problèmes. Je passe outre le problème des déclarations de variables privées au sein du module de classe, estimant que tu n'as pas donné le code de l'ensemble du module de classe, mais il est clair qu'en créant des classes, on a intérêt à forcer la déclaration explicite des variables (Option Explicit en première ligne du module de classe. Une bonne précaution étant de cocher l'option Déclaration des variables obligatoire dans les options du VBE).

    De plus, le bloc Type FICHE n'est pas fermé par un End Type => problème de compilation. L'entête du module de classe devrait être
    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
    17
    Option Explicit
     
    Private FNum As Integer
    Private FMot As Sequence
    Private FCommentaire As String
     
    Private Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Private Type FICHE
        Num As Integer
        Mot As Sequence
        Commentaire As String
    End Type
    La propriété Let Mot n'est pas correctement écrite, car Valeur est une variable objet => pas de ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Property Let Mot(Valeur As Sequence)
        FMot.Chaine = Valeur.Chaine
        FMot.Langue = Valeur.Langue
        FMot.Gram = Valeur.Gram
    End Property
    Mais de toutes façon, ces précautions ne changent rien, car tu ne peux pas utiliser une variable de type défini par l'utilisateur à l'intérieur d'un module objet.

    Si tu veux exposer ton objet Mot au code appelant, tu dois construire une classe de référence englobant deux classes, ta classe Fiche et une autre classe Mot. Tu créeras donc une classe Fiches, une classe Fiche et une classe Mot. Cette construction te permettra d'utiliser un objet de classe Mot comme propriété de la classe Fiche.
    "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...
    ---------------

  4. #4
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Merci beaucoup Qwazerty et Pierre pour vos réponses qui m´ont été d´une grande aide. Comme vous avez pu le voir je suis assez novice dans le domaine de la programation et mes écritures peuvent parfois sembler incohérentes.

    Merci Qwazerty, ton code fonctionne parfaitement. L´unique chose qui me dérange un peu et que je sois obligé de rentrer les trois sous propriétés "essai", "LangFr", "GramFr" de element.SetMot en même temps alors que j´aurais aimé pour voir entrer ces propriétés sous la forme element.SetMot.essai ou element.SetMot.GramFr indépendament les une des autres. En effet, j´obtiendrai les valeur de ces propriétés à des moments différent lors de l´exécution de ma procédure principale. Comment puis- je résoudre ce problème?

    Si j´ai bien compris ce que me dit Pierre, l´unique possibilité de pouvoir utiliser cette syntaxe (element.SetMot.essai) est donc de créer un module de classe Fiche, un module de classe Mot et un module de classe Fiches qui utiliserait les deux modules créés précédement. Est-ce donc l´unique possibilité?

    Merci beaucoup pour vos réponses et pour le tutoriel sur les modules de classe.

  5. #5
    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
    La classe Fiches n'est pas indispensable, en fait.

    Tu peux créer un type personnalisé comme tu l'as fait, mais à l'extérieur de ta classe Fiche

    Tu peux aussi créer ta classe Element avec juste les propriétés utiles, et utiliser une propriété de ta classe Fiche typée sur la classe Element.
    "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...
    ---------------

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Pierre,

    Premier point: "Tu peux créer un type personnalisé comme tu l'as fait, mais à l'extérieur de ta classe Fiche"

    Dans mon module de classe, j´ai donc mis pour la définition de la propriété mot:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Option Explicit
     
    Private FMot As Sequence
     
     Private Property Let Mot(Valeur As Sequence)
        FMot.Chaine = Valeur.Chaine
        FMot.Langue = Valeur.Langue
        FMot.Gram = Valeur.Gram
    End Property
     
     Private Property Get Mot As Sequence
        Valeur.Chaine = FMot.Chaine
        Valeur.Langue = FMot.Langue
        Valeur.Gram = Valeur.Gram
    End Property
     
    Et dans mon module principal, j´écris:
     
    Public Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Public Sub Tester()
     
    Dim mot1 As New Fiche
    mot1.Mot.Chaine = "bonjour"
    Debug.print mot1.Mot.Chaine
     
    End Sub

    Cependant a l´exécution j´obtiens le message d´erreur me disant que la méthode ou donné du membre n´est pas trouvée.

    Deuxième point: "Tu peux aussi créer ta classe Element avec juste les propriétés utiles, et utiliser une propriété de ta classe Fiche typée sur la classe Element. "

    Je ne comprend pas trop ce que ça signifie et comment le mettre en oeuvre.

    Troisième point: Qwazerty m´a envoyé un lien trés interessant sur les modules de classe. Où puis-je trouver Création et utilisation de classes personnalisées en VB 6.0 et VBA (partie 2).

    Je vous remercie.

  7. #7
    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
    Les propriétés de ta classe sont déclarées Private = > pas exposées au code gérant un objet de cette classe.

    Si tu utilises une variable avec un type perso, tu utiliseras ceci dans ta classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Private FMot As Sequence
     
    Public Property Let Mot(Valeur As Sequence)
        FMot = Valeur
    End Property
     
    Public Property Get Mot() As Sequence
        Mot = FMot
    End Property
    Et ceci dans un module standard
    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
    17
    18
    19
    20
    Option Explicit
     
    Public Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Public Sub Tester()
      Dim MaFiche As New Fiche
      Dim MonMot As Sequence
     
      With MonMot
        .Chaine = "Bonjour"
        .Langue = "Français"
      End With
     
      MaFiche.Mot = MonMot
      Debug.Print MaFiche.Mot.Chaine
    End Sub
    Tu pourras utiliser la même logique avec deux classes.


    La partie 2? ... hum... Je suis en train de l'écrire...
    "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...
    ---------------

  8. #8
    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
    Avec deux classes, tu pourras adresser directement les propriétés de la propriété Sequence d'un objet de la classe Fiche

    1. Ta classe Fiche
    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
    Option Explicit
     
    Private FMot As Sequence
     
    Public Property Let Mot(ByRef Valeur As Sequence)
        Set FMot = Valeur
    End Property
     
    Public Property Get Mot() As Sequence
        Set Mot = FMot
    End Property
     
    Private Sub Class_Initialize()
      Set FMot = New Sequence
    End Sub
    2. Ta classe Sequence
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Option Explicit
     
    Private mChaine As String
    Private mLangue As String
    Private mGram As String
     
    Public Property Get Chaine() As String
      Chaine = mChaine
    End Property
     
    Public Property Let Chaine(Chaine As String)
      mChaine = Chaine
    End Property
     
    Public Property Get Langue() As String
      Langue = mLangue
    End Property
     
    Public Property Let Langue(Langue As String)
      mLangue = Langue
    End Property
     
    Public Property Get Gram() As String
      Gram = mGram
    End Property
     
    Public Property Let Gram(Gram As String)
      mGram = Gram
    End Property
    Tu peux alors utiliser ceci dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub Tester()
      Dim MaFiche As New Fiche
     
      With MaFiche.Mot
        .Chaine = "Test"
        .Langue = "Français"
      End With
      Debug.Print MaFiche.Mot.Chaine
    End Sub
    Et si tu ne fais rien d'autre que de recevoir ou d'attribuer des valeurs aux propriétés d'un objet Sequence, tu peux alléger le code de cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Public Chaine As String
    Public Langue As String
    Public Gram As String
    Car passer par des propriétés n'est utile que si tu traites les valeurs au sein des propriétés.

    Tu pourras d'ailleurs alléger aussi celui dans la classe Fiche
    "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...
    ---------------

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    Le manuel de vb indique que l'instruction Type ne peut être utilisée qu'au sein d'un module standard. D'où l'erreur que tu as obtenu.
    Un type est un objet simple sans méthodes ni évènements, il peut être représenté par un module de classe.

  10. #10
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Tout d´abord merci a tous et à toi Pierre pour toutes ces infomations. J´ai finalement choisi de créer 2 classes car ainsi les choses sont plus facile a manipuler. Dès que le deuxième volume de "Création et utilisation de classes personnalisées en VB 6.0 et VBA", je le téléchargerai.

    J´ai cependant une dernière question. Car je veux désormais remplir un tableau (array) avec des éléments Fiche que j´ai nouvelement créé.

    J´écris donc la procédure suivante:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub test2()
     
    Dim Dictionnaire As String
    Dim dicoVB() As Variant
     
    Dictionnaire = "Dictionnaire"
     
    'Définit la taille du tableau
    ReDim dicoVB(2)
     
    Stocker_dico_array2 Dictionnaire, dicoVB()
     
     
    End Sub
     
    Sub Stocker_dico_array2(Dictionnaire As String, ParamArray dicoVB() As Variant)
     
    Dim element As New Fiche
    Dim compteur_ligne As Integer, compteur_mot As Integer
     
    ' On a reféfinit la taille du tableau avant l´entrée dans cette procédure
     
        For compteur_ligne = 1 To 2
     
                With dicoVB(compteur_ligne)
                    .Num = element.Num
                    .Mot.Langue = element.Mot.Langue
                    .Mot.Gram = element.Mot.Gram
                    .Mot.Chaine = element.Mot.Chaine
                End With
     
        Next compteur_ligne
     
    End Sub
    Cependant j´obtiens un message du type:
    Il s´est produit l´erreur '9' dans le temps d´exécution.
    Sous indice hors intervalle.

    Du coup je me demande si le problème ne vient pas du tableau que j´ai passé en argument de la procédure?

    Avez vous une idée? Merci bien

  11. #11
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    créer 2 modules de classe est un très bon choix selon moi.

    Ensuite vire le dim DicoVB. On choisit soit Dim (tableaux statiques) soit redim (tableaux dynamiques) pour déclarer une variable tableau mais pas les 2.

    Enfin Redim DicoVB(2) va totalement réinitialiser ton tableau (tu perds tout dedans). Si tu veux le redimensionner en conservant le contenu du précédent c'est Redim Preserve qu'il faut utiliser.

    Pour finir je ne vois pas en quoi DicoVB est un tableau dynamique, donc somme toute au lieu d'écrire Dim DicoVb() puis RedimDicoVB(2) choisis:

    Dim DicoVB(2).

    Autre erreur, l'indice bas des tableaux n'est pas 1 mais 0 sauf si tu précises en haut de ta feuille de module Option Base1.

    Donc Dim DicoVB(2) contient 2 valeurs qui sont DicoVB(0) et DicoVB(1).
    pour résoudre ce problème sans modifier ton code ajoute Option Base 1 en haut ou alors déclares ton tableau comme ceci:

    Dim DicoVB(1 to 2)

    Tchuss

  12. #12
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Benjîle,

    Effectivement j´avais oublié de préciser "Option Base 1" en début de mon code.

    J´ai écris le code dans ce forum de manière simplifiée pour cibler mon problème. Ici un tableau statique ferait l´affaire mais en réalité dans mon "vrai programme" j´aurai besoin d´un tableau dynamique de dimension inconnue dans lequel chaque fois j´effacerai le contenu pour en écrire un nouveau.
    J´ai cependant testé mon programme on utilisant un tableau statique et en apportant les corrections que tu m´a suggéré. Cependant je continue à avoir la même erreur. Ne pense tu pas qu´il peut y avoir un problème dans la déclaraton de paramètre Array qui est décalaré en Variant dans la procédure alors que les donnée mises dedans son de type Fiche. Cependant dans une procédure les tableaux ne peuvent être déclarés qu´en Variant... Je ne sais donc pas ou est mon erreur.

  13. #13
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut,
    je n'ai pas testé ton code, mais pourquoi tu ne fais pas plutot une function qui te retourne un variant, variant qui contiendra ton tableau

    Ton exemple a force de simplification est peu compréhensible j'en ai peur, car le paramètre Dictionnaire de type string sert a quoi ?
    Qu'est ce qui défini les entrées devant être incluse dans ton tableau dyn?
    Regarde également du coté des fonctions UBound et LBound, qui te permettent d'obtenir les borne haute et basse de ton tableau.

    A moins que ton code soit confidentiel ou vraiment trop long, il serait peut être préférable que tu nous mette un fichier sur lequel "gratter".

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #14
    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
    Perso, je préférerais gérer une collection d'objets qu'un tableau. C'est à mon avis plus dans la logique des choses.
    "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...
    ---------------

  15. #15
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Oui. En réalité, pour ne pas surcharger la page j´ai simplifier le code.

    Le paramètre string dictionnaire de la procédure Stocker_dico_array2(Dictionnaire As String, ParamArray dicoVB() est en réalité le nom d´un fichier texte dans le quel sont inscrit a chaque ligne un numero, un mot une langue (...). J´ai créé une procedure qui récupère chaque ligne de ce fichier texte dans un l´objet "élément" As Fiche créé précédement. Je pensais mettre chaque élément à la suite dans un tableau. Je réécris le code en y ajoutant quelques commentaires. Informez moi si il n´est toujours pas compréhensible.


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Option Base 1
     
    Sub test2()
     
    Dim Dictionnaire As String
    Dim dicoVB() As Variant
    Dim nombre_ligne_archive_txt As integer
     
    Dictionnaire = "Dictionnaire" 'Nom du fichier texte dans lequel il y a toutes les données
     
    'Définit la taille du tableau
    Fonction_calcul_nombre_ligne (Dictionnaire) ´fonction non décrite ici
    ReDim dicoVB(nombre_ligne_archive_txt)
     
    Stocker_dico_array2 Dictionnaire, dicoVB()
     
    End Sub
     
     
    Sub Stocker_dico_array2(Dictionnaire As String, ParamArray dicoVB() As Variant)
     
    Dim element As New Fiche
    Dim compteur_ligne As Integer, compteur_mot As Integer
     
    ' On a reféfinit la taille du tableau avant l´entrée dans cette procédure
     
        For compteur_ligne = 1 To Dim nombre_ligne_archive_txt
     
    ' La fonction suivante (de parametre une ligne as integer) recupere la ligne spécifié dans un objet élément as fiche
    element = Fonction_recupération_ligne_archive_txt (compteur_ligne) ' donne une fiche déclaré comme élément           
     
    With dicoVB(compteur_ligne)
                    .Num = element.Num
                    .Mot.Langue = element.Mot.Langue
                    .Mot.Gram = element.Mot.Gram
                    .Mot.Chaine = element.Mot.Chaine
                End With
     
    Next compteur_ligne
     
    End Sub

    Cependant Pierre me dit qu´il serait mieux de gérer une collection d´objet. Ceci me parait intéressant. De quoi s´agit t- il et comment le mettre en oeuvre? Je pense que cette solution doit être meilleur que la mienne. Peut être serait-il plus judicieux de travailler dans ce sens bien que par curiosité et désir d´apprendre j´aimerai bien aussi solutionner le problème du tableau et savoir d´ou vient mon erreur...

    Merci a tous.

  16. #16
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    on ne s'est pas compris.

    Tu ne NE DOIS PAS taper Dim DicoVB. Uniquement Redim DicoVB. Donc vire la ligne en trop. Pour les tableaux il faut choisir entre dim et redim.

    Essaie comme ça.

  17. #17
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut
    Cette histoire de reDim est un détail mais
    Dim DicoVB(5) as variant

    puis dans la suite du code si tu veux redimensionner ton tableau, tu utiliseras soit Redim (perte des données présentes dans le tableau) soit Redim Preserve (conservation des données).

    Par contre enlisant ton dernier poste, je me demande si tu ne devrais pas exposer ton problème complet, j'ai vu qu'un nouveau file était ouvert, nommé "Conception" et je pense qu'on est en plein dans cette philosophie.
    Tu parles d'un fichier texte que tu souhaites "convertir" en tableau / Objet, mais quel est le but final? As tu des traitements a faire? ou vas tu juste mettre les donnée dans une feuille Excel?

    Pour ton histoire de procédure Stocker_Dico_Array2 as tu reflechi a la possibilité de retourner un Variant contenant ton tableau plutôt que de passer ce variant en paramètre?

    Pour l'utilisation d'une Collection, je dis ++, ca semble être la meilleur solution a ton problème.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  18. #18
    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
    Comme mes petits copains, je me pose la question de la finalité de ton code...

    Explique ce que tu souhaites réaliser et pourquoi tu veux passer par des classes perso
    "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...
    ---------------

  19. #19
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Ok. Je vais donc reprendre le problème depuis le début.

    Je cherche à faire un outil de traduction français – espagnol. Ainsi j´ai créé un nouveau type appelé « Fiche » qui contient parmi autre un numéro, le mot en français, le mot en espagnol, des information sur la grammaire du mot. Toutes ses informations sont dans un tableau Excel : première colonne du tableau le numéro, 2eme colonne le type du mot, 3eme colonne le mot en français…
    J´ai crée une procédure EcrireFichierTexte() qui place toutes ces informations dans un fichier texte. Chaque ligne du fichier texte correspond à une ligne du fichier origine excel.
    J´ai crée une procédure Recupérer_information(Dictionnaire As String, element As Fiche, ligne As Integer, num_tot_colonnes As Integer) qui permet de récupérer ligne par ligne toute l´information stockée dans le fichier texte et la mettre sous forme d´un objet Fiche.
    Maintenant je souhaite pouvoir stocker toutes les fiches créées dans un tableau ou une collection. Je vous joins mon document excel un peu brouillon peut-être car j´ai fait pas mal de tests.

    Merci

    Etape du processus:

    - L´utilisateur rentre ses données (mots ...) dans une feuille excel.
    - Le programme importe ces données dans un fichier texte
    - Le programme importe une para une les lignes du fichier texte pour les placer dans un objet Fiche.
    - Toutes les fiches sont placées dans un tableau ou une collection afin de pouvoir les utiliser plus tard.

    J´espère que cést plus clair.
    Fichiers attachés Fichiers attachés

  20. #20
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Je joins ma feuille Excel.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. créer un module de classe pour gérer un textbox
    Par Cybernard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/06/2010, 18h48
  2. Réponses: 4
    Dernier message: 31/03/2006, 15h16
  3. Réponses: 8
    Dernier message: 22/02/2006, 15h09
  4. [HTML/PHP]Créer un module de news
    Par Link14 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 10/02/2006, 21h39
  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