Voici comment je m'y prendrais pour renvoyer assez simplement un des champs d'un type perso.
La boucle ne se fait pas sur la plage de données, mais sur le tableau de Data lui-même, ce qui est quasi immédiat.
Le défaut de cette méthode c'est que la fonction ArrayData doit être adaptée à chaque fois en fonction du type de données qu'on a créé, donc si tu veux injecter des données venant de plusieurs types persos différents, tu dois créer autant de fonctions ArrayData adaptées à chaque type.
Note que si ton Type contenait, disons, plus de 10 champs, tu pourrais ne préciser dans le Enum associé que les champs à injecter dans la feuille, ça éviterait ainsi une longue série de Case dans la fonction ArrayData, et ça permettrait aussi de clarifier les intentions de ton programme.
Option Explicit
'Ti http://veriti.free.fr
Type TypeData
Jour As Integer
Valeur As Single
Total As Long
End Type
Enum eItemData
Jour
Valeur
Total
End Enum
'si tu mets simplements Data(100) tu as 101 valeurs
'ou alors il faut écrire Data(99) ou Data(0 to 99) ou Data(1 to 100)
'personnellement je précise toujours l'indice inférieur, comme ça il
'n'y a jamais d'ambigüité
Dim Data(1 To 100) As TypeData
Function ArrayData(Datas() As TypeData, Item As eItemData)
Dim Bcle&
ReDim Tabl(LBound(Datas) To UBound(Datas), 1 To 1)
For Bcle = LBound(Datas) To UBound(Datas)
Select Case Item
Case Jour
Tabl(Bcle, 1) = Datas(Bcle).Jour
Case Valeur
Tabl(Bcle, 1) = Datas(Bcle).Valeur
Case Total
Tabl(Bcle, 1) = Datas(Bcle).Total
End Select
Next Bcle
ArrayData = Tabl
End Function
Sub Test()
Dim Bcle%, NbVal%
'génération des valeurs de test
For Bcle = LBound(Data) To UBound(Data)
Data(Bcle).Jour = Int(Rnd * 30 + 1)
Data(Bcle).Valeur = Rnd * 1000
Data(Bcle).Total = Int(Rnd * 1000 + 1)
Next Bcle
Feuil1.Cells.Clear
NbVal = UBound(Data) - LBound(Data) + 1
With Feuil1
'copie en horizontal
.Range("A1").Resize(1, NbVal).Value = WorksheetFunction.Transpose(ArrayData(Data, Jour))
'et en vertical
.Range("B1").Resize(NbVal, 1).Value = ArrayData(Data, Valeur)
.Range("C1").Resize(NbVal, 1).Value = ArrayData(Data, Total)
End With
End Sub