Précédent   Forum des professionnels en informatique > 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.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/09/2008, 08h49   #1
Invité régulier
 
Inscription : mai 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 17
Points : 5
Points : 5
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 00
Vieux 10/09/2008, 23h08   #2
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 677
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 677
Points : 7 600
Points : 7 600
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...).
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 10h14   #3
Invité régulier
 
Inscription : mai 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 17
Points : 5
Points : 5
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 :
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 :
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
rom1_am est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2008, 22h46   #4
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
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 :
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".
_
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2008, 11h05   #5
Invité régulier
 
Inscription : mai 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 17
Points : 5
Points : 5
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 00
Vieux 18/11/2008, 20h25   #6
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
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 :
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.
_
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 07h52   #7
Invité régulier
 
Inscription : mai 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 17
Points : 5
Points : 5
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 :
1
2
 
Erase P_typ_ParamPlsAcroteres
Merci
rom1_am est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h23.


 
 
 
 
Partenaires

Hébergement Web