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 :

Liste chaînée personnalisée : erreur 28 [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Par défaut Liste chaînée personnalisée : erreur 28
    Bonjour à tous,

    J'essaie de me lancer dans l'écriture de classes personnalisées sur VBA Excel. Désolé pour le manque de vocabulaire sur le sujet. J'ai besoin de créer une liste chaînée personnalisée qui va contenir des noeuds d'une classe personnalisée également.

    Je vous présente un exemple minimaliste de mon problème. Voici les deux classes (une pour la liste chaînée et une pour les noeuds). Je ne souhaite pas de curseur dans la classe "Chaine" (variante "xCourant" par exemple) et je souhaite utiliser une méthode "initialise" dans la classe "Chaine" qui va initialiser une longue chaine de noeuds grâce à une boucle.

    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
    'Classe Chaine
    Option Base 1
     
    '---------------------------------------------Variables------------------------------------------------------
    Private xPremier As Noeud
     
    '--------------------------------------------Propriétés------------------------------------------------------
    Property Get Premier() As Noeud
        Set Premier = xPremier
    End Property
    Property Let Premier(newPremier As Noeud)
        Set xPremier = newPremier
    End Property
     
    '----------------------------------------------Méthodes-------------------------------------------------------
    Sub initialise()
        'Initialisation de liste
        Dim tmp As New Noeud
        tmp.Valeur = 1
        Set xPremier = tmp
        Dim i As Integer
        For i = 2 To 5 'valid
            tmp.Suivant = New Noeud
            tmp.Suivant.Valeur = i
            Set tmp = tmp.Suivant
        Next i
     
        'Parcours de liste (pour vérification ici)
        Set tmp = xPremier
        Do While Not tmp Is Nothing 'doit s'arrêter lorsque les 5 noeuds sont parcourus
            MsgBox "Valeur: " & tmp.Valeur
            Set tmp = tmp.Suivant
        Loop
    End Sub
    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
    'Classe Noeud
    Option Base 1
     
    '---------------------------------------------Variables------------------------------------------------------
    Private xValeur As Integer
    Private xSuivant As Noeud
     
    '--------------------------------------------Propriété------------------------------------------------------
    Property Get Valeur() As Integer
        Valeur = xValeur
    End Property
    Property Let Valeur(newValeur As Integer)
        xValeur = newValeur
    End Property
     
    Property Get Suivant() As Noeud
        Set Suivant = xSuivant
    End Property
    Property Let Suivant(newSuivant As Noeud)
        Set xSuivant = newSuivant
    End Property
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Macro à exécuter
    Sub main()
        Dim chaine1 As New chaine
        chaine1.initialise
    End Sub
    Le code que je vous présente lance une boucle infini. Je comprends que le problème vient de l'utilisation d'une unique variable temporelle (instance de classe "Noeud") qui créer une chaîne d'un seul maillon qui se mord la queue.

    Jusqu'ici je m'en suis toujours sorti avec les questions posées par d'autres utilisateurs mais là je sèche complétement.

    Merci d'avance pour votre aide.

    EDIT: Correction de la propriété "Valeur" (merci à Philippe)

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    tu peux t'aider de ce lien:
    https://support.microsoft.com/en-us/kb/166394
    Cordialement,

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Par défaut Très bonne trouvaille tout de même
    Bonjour,

    Merci pour le lien. Je suis rassurer de voir que ma solution était déjà très proche. Par contre j'ai toujours le même problème.

    Je remarque qu'au lieu de définir une propriété sur la variante private "xSuivant", le lien que tu m'as donné préfère lire et écrire directement sur "xSuivant" (variante public). J'ai fait la modification et la adaptation qui s'imposaient mais le problèem reste le même. La MsgBox me renvoie "Valeur: 0" alors qu'à chaque fois qu'un noeud nommé "tmp" est recréé, il reçoit tout de suite une valeur différente de 0.. Etrange.

    Merci tout de même pour ce lien qui m'aidera sûrement plus tard.

    Cordialement.

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Je crois que dans ta classe Noeud, il y a une petite erreur
    quand tu affectes une valeur.
    Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Property Let Valeur(newValeur As Integer)
        'xValeur = Valeur
        xValeur = newValeur
    End Property

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Par défaut
    Ah oui je suis allé un peu vite pour créer mon exemple minimaliste.

    Je suis content. Je me rends compte que mes nœuds sont parcourus. Mais après le cinquième nœud, la boucle continue sans s’arrêter et affiche "Valeur: 0"

    Le problème semble venir des instructions de la forme "Set noeud2 = noeud1.xSuivant" qui déclare un nœud non vide alors que noeud1.xSuivant l'est.

    Merci encore.
    William

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Par défaut
    J'ai fini par trouver une solution qui me convient en terme de visibilité, avec :
    - une boucle d'écriture qui commence sur le premier nœud et non le deuxième
    - une boucle de lecture avec une condition de fin de boucle intuitive, qui ne génère pas d'erreur quand la liste est vide

    Le défaut c'est qu'on crée en fin de liste un nœud fictif qui n'est pas destiné à être parcouru en lecture.

    Pour information, la version corrigée :
    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
    'Classe Chaine
    Option Base 1
     
    '---------------------------------------------Variables------------------------------------------------------
    Public xPremier As Noeud
     
    '----------------------------------------------Méthodes-------------------------------------------------------
    Sub initialise()
        'Initialisation de liste
        Dim tmp As New Noeud
        Set xPremier = tmp
        Dim i As Integer
        For i = 1 To 5 'valid
            tmp.Valeur = i
            Set tmp.xSuivant = New Noeud
            Set tmp = tmp.xSuivant
        Next i
     
        'Parcours de liste (pour vérification ici: un modèle de parcours de liste)
        Set tmp = xPremier
        While Not tmp.xSuivant Is Nothing
            MsgBox "Valeur: " & tmp.Valeur
            Set tmp = tmp.xSuivant
        Wend
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'Classe Noeud
    Option Base 1
     
    '---------------------------------------------Variables------------------------------------------------------
    Private xValeur As Integer
    Public xSuivant As Noeud
     
    '--------------------------------------------Propriété------------------------------------------------------
    Property Get Valeur() As Integer
        Valeur = xValeur
    End Property
    Property Let Valeur(newValeur As Integer)
        xValeur = newValeur
    End Property
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub main()
        Dim chaine1 As New chaine
        chaine1.initialise
    End Sub
    Merci encore à Philippe pour son aide.

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

Discussions similaires

  1. Utilisation de variable PHP dans une fonction JavaScript
    Par microJaP dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/05/2009, 23h52
  2. Utilisation de variables SQL dans une requête
    Par charliend dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 24/03/2009, 17h54
  3. Utiliser des variables applications dans une classe
    Par soso78 dans le forum VB.NET
    Réponses: 1
    Dernier message: 13/10/2008, 22h21
  4. Réponses: 21
    Dernier message: 21/08/2008, 23h30
  5. Utilisation de variable Builder dans une requete SQL
    Par _ben_ dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/06/2007, 11h36

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