Bonjour,
En vbscript, j'ai l'habitude de faire des fonctions qui retournent des tableaux pour utiliser les résultats dans un for/each. Ici en vba, je veux faire la même chose. Mais impossible d'initialiser le tableau... Pour le dire en bon Vba, je veux utiliser un tableau dynamique, comme avec le dernier exemple du tuto sur les variables vba par silkyroad, sauf que ce dernier est statique. Je reçois des erreurs, quelque soit le moyen pour essayer de contourner.
A l'aiiiiiiiiiiiiiiiiiiiiiide...
Avec un commentaire sur "aList = Array()", l'erreur vient de Ubound() qui ne retourne pas -1 car aList est déclaré mais pas encore initialisé.
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 Public Type Handle nHandle As Long ... End Type Function getAllHandle() Dim var As Handle Dim aList() As Handle aList = Array() ' <---- Erreur 13: incompatibilité de type 'une boucle... var.nHandle = 123 ReDim Preserve aList(UBound(aList) + 1) aList(UBound(aList)) = var 'fin boucle getAllHandle() = aList End Function Sub Main() For each oHandle in getAllHandle() Debug.Print oHandle.nHandle & ", ..." Next End Sub
Si je remplace "aList = Array(var)", pour qu'il connaisse mes intentions, erreur "seuls les types définis par l'utilisateur et sont définis dans les modules d'objets peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive"... C'est pourtant bien ce que j'ai fait en créant mon Type en haut de mon module.
En remplaçant "Dim aList() As Handle" par "Dim aList As Variant", l'initialisation du tableau passe, mais c'est l'affectation "aList(UBound(aList)) = var" qui plante par une erreur de compilation : "seuls les types définis par l'utilisateur et sont définis dans les modules d'objets peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive". J'ai aussi essayé de forcer par un casting, mais j'y arrive pas non plus...
J'ai encore essayé de contourner ça en trichant :
-en déclarant "Dim aList(0) As Handle" (comme ca init du tableau automatique à la déclaration);
-en commentant "aList = Array()" (car du coup plus besoin, l'init est faite);
-et en intégrant mon affectation dans une condition, pas de redim si position 0,
et bien ici, le compilateur me fait une erreur pour le "Redim Preserve aList" alors qu'il est dans le if, avec pour message "Tableau déjà dimensionné". Il n'essaie même pas d'aller jusque là le gars! Il râle avant... Alors que ca marcherait si bien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 If (UBound(aList) > 0) Then ReDim Preserve aList(UBound(aList) + 1) End If aList(UBound(aList)) = var
La belle affaire ! Je suis vraiment à sec d'idées là...
Alors que c'est si simple en vbs (hors excel), pas de sensiblerie du compilateur, il y va...
Une vraie princesse ce pseudo-compilo!
Voili voilou, donc si un de vous avait déjà joué avec ce genre de choses, je serais bien content de savoir comment y arriver.
Merciiiii,
Partager