Obtenir le nombre d'éléments d'un Type (définit par le programmeur)

francois1979 - 7 sept. 2012 à 20:42
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 8 sept. 2012 à 20:42
Bonjour,

je fais un programmation VBA sous excel.

J'ai créé un type de données :

Type tChgAgence
iMoisChg As Integer
sNouvAgence As String
sAncAgence As String
End Type

Au début de mon code, je déclare ainsi ma variable :
Dim vaChgAgence(1 To 11) As tChgAgence '11 changements au maximum

J'aimerais savoir s'il y a une commande qui me permettrait de renvoyer le nombre d'éléments dans ce type.

Par exemple, ça pourrait être TypeElement(vaChgAgence) et qui me renverrait 3 (car j'ai 3 éléments soit iMoisChg, sNouvAgence et sAncAgence.

Ça me permettrait d'avoir un code plus fonctionnel puisque si j'ajoute des éléments par la suite à ce type, le code serait automatiquement correct.

Merci,


François

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 sept. 2012 à 21:24
Bonjour,
on ne peut, à ma connaissance, ajouter des éléments à une structure.
Mais si tu penses le contraire, tu m'ontéresses. Montre donc comment.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Bonjour,

la structure (Type dans VBA) est défini par moi-même. Je peux donc facilement augmenter le nombre d'éléments dans le type.


François
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 sept. 2012 à 21:38
Montre comment (j'ai soif de le savoir) ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 sept. 2012 à 21:55
Silence ? Pourquoi ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
8 sept. 2012 à 00:06
Je crois que ce que ucfoutu demandait, c'était une façon de voir/modifier ça pendant l'exécution...
Perso, je ne crois pas qu'on puisse le faire, mais je n'ai jamais vraiment creusé la question
jusqu'à désassembler un bout de programme VB6 qui utilisait des Types pour en voir le fonctionnement.

Je ne vois pas trop pourquoi tu voudrais que ton programme s'adapte à la taille de la structure, vu qu'à
chaque fois que tu modifies un élément, tu ne te bases jamais sur son adresse en mémoire...

J'ai une fois eu besoin de stocker plusieurs propriétés, mais là tu dois utiliser une classe
(Dictionary, par exemple, qui associe une chaine de caractères à une instance d'objet, une chaine...)
C'est bien sûr un peu plus lent (et cet objet en particulier ajoute une dépendance à ton exécutable final (MS Scripting Runtime)

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Mon point n'est pas de changer le "type" dans mon programme. C'est pour les modifications futures.

Pour le moment, tChgAgence contient 3 informations. Mais, je m'attends à ce que dans 2 mois, il en contienne 5, puis 10 dans 6 mois.

Mon but est de montrer tous les éléments de tChgAgence dans le fichier excel un à la suite de l'autre.

Alors, si je sais combien d'éléments est contenus dans tChgAgence (3 pour le moment), je pourrais faire :

For i = 1 to NombreElement(tChgAgence)
iCol = (i - 1) * NombreElement(tChgAgence) + 1
cells(18, iCol)= tChgAgence(j).iMoisChg
next i

Ça m'éviterait à revoir le For à chaque fois que j'ajoute des éléments.

J'ai contourné ce problème en déclarant une Constante global :

Global Const INBELEMENTAGENCE = 3

Donc, mon for ressemble à ceci pour le moment :
For i = 1 to INBELEMENTAGENCE

Ce qui est quand même bien. Mais si je pouvais éviter la "Global Const", j'aimerais bien ça.

Merci,


François
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 sept. 2012 à 07:49
Parsonne-moi, mais ce que tu affirmes et le code montré sont totalement incompréhensibles ===>>

- d'où sort j ?
- l'expression :
tChgAgence(j).iMoisChg
n'a de sens que si tchgagence est un tableau dynamique de structures et non une structure !

De quoi parles-tu donc ?
Je commence à deviner que tu t'es fort mal exprimé et que tu as créé un tableau dynamique à une dimension par une expression du genre :
dim tChgAgence(3) as ChgAgence ' ou ChgAgence est, elle une structure dont l'un des éléments porte le nom iMoisChg 

Et que ce que tu cherches en fait, n'est pas le "nombre d'éléments de la structure", mais le nombres de lignes ("dimension", donc) de ton tableau dynamique, après, par exemple, l'avoir redimensionné !
La structure n'a alors plus rien à voir, dans cette "affaire". ===>>
La dimension (donc le nombre de lignes/articles) d'un tableau dynamique toto à une dimension s'obtient ainsi :
xxxx = Ubound(toto)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Bon, je suis désolé de toute la confusion, je me suis très mal exprimé.

Voici tout mon code qui est fonctionnel :


Global Const INBELEMENTAGENCE = 3 
Type tChgAgence 
iMoisChg As Integer 
sNouvAgence As String 
sAncAgence As String 
End Type 

Dim vaChgAgence(1 To 11) As tChgAgence '11 changements au maximum 
dim i, j as integer

For i = 1 to Ubound(tChgAgence)
For j = 1 to INBELEMENTAGENCE 		'Affichage du résultat dans excel. Je 
iCol = (j - 1) * INBELEMENTAGENCE + 1 
cells(i, iCol)= vaChgAgence(i).iMoisChg 
next j
next i


Ce code affiche les résultats contenu dans vaChgAgence. Les 11 agences (tel que définit au départ) sont affichées sur 11 lignes alors que les renseignements de chacune d'entre elle sont affichés sur 3 colonnes (INBELEMENTAGENCE).

Puisque dans le futur je pourrais ajouter des éléments au type "tChgAgence", j'aurais aimé éviter une constante globale (appelé INBELEMENTAGENCE) et la remplacer par une expression qui me donne le nombre d'éléments (je ne sais pas trop comment l'exprimé) du type tChgAgence.

Y-a-t-il une solution?

Un gros merci pour ton aide.


François
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 sept. 2012 à 14:45
Je te répète donc ce que je t'ai exposé au départ : on ne peut modifier ce que tu veux modifier (le nombre de membres d'une structure).
On ne peut non plus compter le nombre de ses membres.
Tu es de surcroît dans une confusion plus que totale. Cette ligne :

Ubound(tChgAgence)

n'a absolument aucune cohérence. tChgAgence est yune structuree et non un tableau dynamique (ce qu'est tont tableau vaChgAgence)

Je te laisse jusqu'à ce que tu aies des idées moins confuses.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Salut ucfoutu,

j'avoue que tu as repéré des erreurs. Mon programme est plus gros et il fonctionne. J'ai juste tenté de le simplifier pour exposer mon point, mais je l'ai mal fait visiblement.

On aurait dû lire Ubound(vaChgAgence). c'est une erreur typographique de ma part.

Mais bon, tu as répondu à mon point : on ne peut pas compter le nombre de membres d'un type. J'avais cherché sans trouver de réponse. La constante globale fera donc le travail.


François
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 sept. 2012 à 18:24
Mon programme est plus gros et il fonctionne

et :
La constante globale fera donc le travail

Si tu en es satisfait, ma foi ...

Je ne vais même pas te parler alors de comment tu fais pour connaître les membres (leurs noms, pas seulement leur nombre) pour (nécessairement) les utiliser comme tu fais sur cette ligne de code :
cells(i, iCol)= vaChgAgence(i).iMoisChg


Mais bon ... Bon week-end.
___________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Je ne comprends pas bien ce que tu veux dire.

Dans mon code, on peut voir :
Cells(i, lColValeur).Value = vaChgAgence(j).iMoisChg


J'aurais dû montrer exactement mon code en partant et non pas réinscrire le tout.


François
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 sept. 2012 à 20:42
Ouiais... montre donc ce "miracle" !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Rejoignez-nous