Erreur : Initialize Type Array
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...
Code:
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 |
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é.
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,
Code:
1 2 3 4
| If (UBound(aList) > 0) Then
ReDim Preserve aList(UBound(aList) + 1)
End If
aList(UBound(aList)) = var |
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...
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,