Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Général VBA

Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.

Réponse
 
Outils de la discussion
Vieux 10/09/2008, 08h49   #1 (permalink)
Invité régulier
 
Date d'inscription: mai 2007
Messages: 10
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
rom1_am est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/09/2008, 23h08   #2 (permalink)
Modérateur
 
Avatar de AlainTech
 
Date d'inscription: mai 2005
Localisation: Entre Liège et Bruxelles, suivant l'heure.
Âge: 54
Messages: 2 922
Envoyer un message via Skype™ à AlainTech
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...).
__________________
Si on vous donne une info qui marche, DITES-LE!!!!
Si vous trouvez seul, AUSSI, votre solution peut servir à d'autres!
N'oubliez pas de cliquer sur quand vous avez obtenu la réponse à votre question.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/09/2008, 10h14   #3 (permalink)
Invité régulier
 
Date d'inscription: mai 2007
Messages: 10
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 :
 
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 :
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
rom1_am est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 31/10/2008, 22h46   #4 (permalink)
Membre émérite
 
Avatar de =JBO=
 
Date d'inscription: février 2005
Localisation: France - Drôme
Messages: 942
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 :
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".
_
__________________
Les bons réflexes VB/VBA: __ Option Explicit ___ Toujours compiler le code avant de tester ! (dans l'EDI, menu Débogage, commande Compiler)
=JBO= est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 11h05   #5 (permalink)
Invité régulier
 
Date d'inscription: mai 2007
Messages: 10
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
rom1_am est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/11/2008, 20h25   #6 (permalink)
Membre émérite
 
Avatar de =JBO=
 
Date d'inscription: février 2005
Localisation: France - Drôme
Messages: 942
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 :
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.
_
__________________
Les bons réflexes VB/VBA: __ Option Explicit ___ Toujours compiler le code avant de tester ! (dans l'EDI, menu Débogage, commande Compiler)

Dernière modification par =JBO= ; 18/11/2008 à 22h11
=JBO= est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 19/11/2008, 07h52   #7 (permalink)
Invité régulier
 
Date d'inscription: mai 2007
Messages: 10
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 :
Public P_typ_ParamPlsAcroteres() As ParametresAcrotere  'Tableau de variables de type ParametresAcrotere
Puis pour réinitialiser le tableau:
Code :
 
Erase P_typ_ParamPlsAcroteres 
 
Merci
rom1_am est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Général VBA

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide