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 Discussion :

Réinitialiser une variable de type personnalisé


Sujet :

VBA

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Réinitialiser une variable de type personnalisé
    Bonjour,

    Malgrès pas mal de recherches, je n'ai pas trouvé de réponses à mon problème.

    J'ai une variable publique de type personnalisé.
    J'aimerais pouvoir la réinitialiser car je dois l'utiliser plusieurs fois et je n'arrive pas à utiliser les instructions 'redim' ou 'dim ... as new (type)' ou 'set...=nothing'. J'ai à chaque fois un message d'erreur.

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par rom1_am Voir le message
    J'ai à chaque fois un message d'erreur.
    Ce serait trop de le donner, ce message?
    Accessoirement avec la ligne de code qui le provoque.
    Et, tant qu'on y est, tout le code qui concerne cette variable (déclaration...).

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Mon code ressemble à ça:
    Dans un premier module de déclaration de variables, je déclare mon type et une variable de ce type avec la portée publique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Type ListeParametres   'Type
     param1 as integer
     param2 as boolean
     ....
    End Type
     
    Public typ_ParametresMur As ListeParametres   'Variable
    Ensuite, j'utilise cette variable dans une procèdure d'un autre module. Ayant à l'utiliser plusieurs fois, je voulais la réinitialiser au début de la procèdure afin d'effacer les valeurs de chaque paramètres.

    J'ai essayé les instructions suivantes au début de ma procèdure:
    • Redim typ_ParametresMur As ListeParametres : "Erreur de syntaxe"
    • typ_ParametresMur = Empty : "Seuls les types publics définis par l'utilisateur dans les modules objet publics peuvent être utilisés comme paramètres ou types renvoyés pour les procédures publiques des modules de classe ou comme champs des types publics définis par l'utilisateur"
    • Dim typ_ParametresMur As ListeParametres : pas de message d'erreur mais cela n'efface pas les valeurs des paramètres lorsque je relance plusieurs fois la procèdure.
    • Erase typ_ParametresMur : "Tableau Attendu"
    • Set typ_ParametresMur = Nothing : "Objet requis"


    Pour l'instant, j'ai contourné le problème en utilisant la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With typ_ParametresMur
    .param1=empty
    .param2=empty
    ....
    end with
    Mais je pense qu'il y a surement une solution plus simple pour réinitialiser rapidement tous les éléments de la variable.

    Merci pour votre aide

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par rom1_am Voir le message
    Ensuite, j'utilise cette variable dans une procèdure d'un autre module. Ayant à l'utiliser plusieurs fois, je voulais la réinitialiser au début de la procédure afin d'effacer les valeurs de chaque paramètres.
    Ce serait plus simple de définir la variable directement dans cette procédure du module. De cette façon, la variable serait réinitialisée à chaque fois que la procédure s'exécute... non ???

    Mais pour répondre à ta question, il n'y a pas de façon "simple" de réinitialiser une variable de type défini par l'utilisateur.

    Une méthode simple et "brutale" consiste à créer une nouvelle variable du type, donc initialisée "à vide", et à la recopier sur la variable à réinitialiser grâce à l'instruction LSet du VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim typ_Empty As ListeParametres
     
    LSet typ_ParametresMur = typ_Empty
    Mais ce n'est pas sans risque: cela peut être assez délicat, selon les types de données des éléments (membres) du type défini par utilisateur.

    Il n'y a pas de souci tant qu'il ne s'agit que de types simples (numérique, booléen) ou de types "incorporés" (chaîne de caractères dimensionnée, tableau dimensionné et de type simple).

    En revanche, pour des références sur des objets, des chaînes de caractères dynamiques, des tableaux dynamiques... je me méfierai des problèmes du genre "fuite de mémoire".
    _

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour ta réponse JBO.

    Je vais essayer ta méthode, c'est vrai que ça peut-être bien dans certains cas, mais j'ai aussi des types personnalisés ou des classes contenant à la fois des objets, entités autocad, tableaux dynamiques...

    Pour la déclaration de ma variable, dans certains cas précis, je suis contraint d'avoir des variables publiques. (C'est vrai que pour d'autres variables du type personnalisé, je préfére les déclarations à l'intérieur des procèdures)

    Sinon, pour contourner le problème, j'ai fait une fonction "Réinitialiser" dans laquelle je réinitialise chaque variable une à une.
    J'ai fait la même chose pour mes classes en faisant une fonction de réinitialisation à l'intérieur de ma classe.

    Merci

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut LSet est notre ami !!! ;-)
    Bonjour,
    Citation Envoyé par rom1_am Voir le message
    Merci beaucoup pour ta réponse JBO.

    Je vais essayer ta méthode, c'est vrai que ça peut-être bien dans certains cas, mais j'ai aussi des types personnalisés ou des classes contenant à la fois des objets, entités autocad, tableaux dynamiques...
    Depuis notre échange, je suis allé un peu plus loin pour vérifier le fonctionnement de la solution que je te proposais, plus particulièrement en ce qui concerne la réinitialisation des membres "dynamiques" d'un type personnalisé (référence à un objet, tableau dynamique)...
    Citation Envoyé par =JBO= Voir le message
    Une méthode simple et "brutale" consiste à créer une nouvelle variable du type, donc initialisée "à vide", et à la recopier sur la variable à réinitialiser grâce à l'instruction LSet du VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim typ_Empty As ListeParametres
     
    LSet typ_ParametresMur = typ_Empty
    Mais ce n'est pas sans risque: cela peut être assez délicat, selon les types de données des éléments (membres) du type défini par utilisateur.

    Il n'y a pas de souci tant qu'il ne s'agit que de types simples (numérique, booléen) ou de types "incorporés" (chaîne de caractères dimensionnée, tableau dimensionné et de type simple).

    En revanche, pour des références sur des objets, des chaînes de caractères dynamiques, des tableaux dynamiques... je me méfierai des problèmes du genre "fuite de mémoire".
    Et j'ai eu la bonne surprise de constater que l'instruction LSet fonctionne proprement puisqu'elle peut désallouer un tableau dynamique et, au besoin, libérer les objets qui ne seraient plus référencés (appel de la procédure Class_Terminate).

    Donc la réinitialisation d'une variable de type personnalisé par LSet effectue des Set ... = Nothing sur les membres de type objet.

    Maintenant, je ne vois qu'un bémol: il faut faire attention à utiliser l'instruction LSet avec de même type personnalisé. Mais ce n'est pas un vrai problème.

    Au-delà de ta question initiale, je trouve que ce comportement est assez remarquable et peut être pratique.
    Dorénavant, quand l'occasion se présentera, je réfléchirais à son utilisation.

    P.S. Si c'est résolu, alors dis le en éditant ton premier message au bas duquel tu trouveras le bouton Résolu, merci.
    _

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci JBO.

    En effet, le LSET fonctionne bien (alors qu'un de mes types personnalisés contient des variables classiques, des objets et aussi des tableaux de variables de type personnalisé à l'intérieur du 1er type)

    Egalement, juste pour info, j'utilise la fonction 'Erase' dans certaines parties de mon code lorsque j'utilise un tableaux dynamiques de type personnalisé (cela permet de réinitialiser correctement le tableau, par contre, lorsqu'il s'agit d'une variable simple de type personnalisé, le vba génére l'erreur 'tableau attendu').
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public P_typ_ParamPlsAcroteres() As ParametresAcrotere  'Tableau de variables de type ParametresAcrotere
    Puis pour réinitialiser le tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erase P_typ_ParamPlsAcroteres
    Merci

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

Discussions similaires

  1. [C++/CLI] Libérer une variable du type cli::array
    Par ekinox17 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 25/01/2006, 09h16
  2. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  3. Réponses: 3
    Dernier message: 28/07/2005, 21h30
  4. affecter une variable de type stringstream
    Par sorari dans le forum SL & STL
    Réponses: 3
    Dernier message: 24/03/2005, 11h14
  5. Ajouter a une variable de type string, un entier
    Par Little-Freud dans le forum SL & STL
    Réponses: 12
    Dernier message: 05/03/2005, 19h33

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