Copie de Type vers Range

Bonjour à tous

j'ai un petit pb d'efficacité. Je cherche à copier facilement une structure de type Type vers des plages d'une feuille Excel.

Je sais que si l'array est déclaré en tant que Variant cela fonctionne bien

'Utilisation d'un array dynamique type Variant. Ca fonctionne
Sub testArray()
    Dim monABC() As Variant
    Dim nL, nC As Integer
    nL = 5
    nC = 3
    ReDim monABC(nL, nC)

    Dim i, j As Integer
    For i = 0 To nL - 1
        For j = 0 To nC - 1
            monABC(i, j) = Rnd()
            monABC(i, j) = Rnd()
            monABC(i, j) = Rnd()
        Next j
    Next i
    Range(Cells(1, 1), Cells(nL, nC)).Value = monABC
End Sub

Maintenant, moi j'aimerais bien nommer les lignes via une structure (Type) afin de me faciliter l'utilisation

Type TABC
    a As Integer
    b As Integer
    c As Integer
End Type
'Utilisation d'un type utilisateur
Sub testArray()
    Dim monABC() As TABC
    Dim n As Integer
    n = 5
    ReDim monABC(n)
    Dim i As Integer
    For i = 0 To (n - 1)
        monABC(i).a = Rnd()
        monABC(i).b = Rnd()
        monABC(i).c = Rnd()
    Next i
'ne fonctionne bien sur pas
'    Range(Cells(1, 1), Cells(nL, nC)).Value = monABC
'Retraduire monABC en variant ?
End Sub

Cela ne fonctionne bien sur pas. Quelle est la meilleure méthode alors pour retraduire mon Type en Variant pour pouvoir facilement le copier sur une feuille Excel ?

Pour info, le Type pourrait contenir une vingtaine d'informations et le array plusieurs milliers de colonnes.

Merci pour vos idées

Je joins un exemple super simple.

Jeb

7test.xlsm (13.36 Ko)

Bonjour,

Non, un tableau de type utilisateur ne te permet pas de transférer directement les valeurs de ses propriétés dans un Range, il te faut soit boucler sur le tableau et récupérer les différentes valeurs dans les cellules voulues soit utiliser un tableau intermédiaire et ensuite transférer directement ce tableau dans le Range :

Type TABC

    a As Integer
    b As Integer
    c As Integer

End Type

'Utilisation d'un type utilisateur
Sub testArray()

    Dim monABC() As TABC
    Dim Tbl()
    Dim n As Integer
    Dim i As Integer

    n = 5

    ReDim monABC(1 To n)

    For i = 1 To (n)

        monABC(i).a = Rnd()
        monABC(i).b = Rnd()
        monABC(i).c = Rnd()

    Next i

    'comme ça :
    For i = 1 To UBound(monABC)

        Cells(i, 1).Value = monABC(i).a
        Cells(i, 2).Value = monABC(i).b
        Cells(i, 3).Value = monABC(i).c

    Next i

    '-----------------------------------
    'ou comme ça :
    For i = 1 To UBound(monABC)

        ReDim Preserve Tbl(1 To 3, 1 To i)
        Tbl(1, i) = monABC(i).a
        Tbl(2, i) = monABC(i).b
        Tbl(3, i) = monABC(i).c

    Next i

    Range(Cells(1, 1), Cells(UBound(Tbl, 1), UBound(Tbl, 2))).Value = Tbl

End Sub

Merci beaucoup Theze

c'est bien le type de solution que j'imaginais, mais je me disais qu'elle devait être assez chronophage et qu'il y avait p'tet des astuces que je ne connaissais pas.

Je laisse encore qq temps le post ouvert, pour éventuellement d'autres solutions.

A bientot

Jeb

Re,

Dans ce cas, un module de classe serait une possibilité, le tableau que la classe contient serait encapsulé.

Une piste, ajoutes un module de classe nommé Classe1 (nom donné par défaut) et coller ce code dans le module de classe :

Private Val_A
Private Val_B
Private Val_C
Private Tbl()

'le tableau en lecture...
Property Get Tableau() As Variant()
  Tableau = Tbl
End Property

'et en écriture
Property Let Tableau(ByRef Tableau() As Variant)
  Tbl = Tableau
End Property

Property Get A()
    A = Val_A
End Property

Property Let A(A)
    Val_A = A
End Property

Property Get B()
    B = Val_B
End Property

Property Let B(B)
    Val_B = B
End Property

Property Get C()
    C = Val_C
End Property

Property Let C(C)
    Val_C = C
End Property

ce code dans un module standard :

'Utilisation d'une classe
Sub TestClasse()

    Dim monABC As New Classe1
    Dim Tbl()
    Dim n As Integer
    Dim i As Integer

    n = 5

    ReDim Tbl(1 To n)

    For i = 1 To (n)

       Tbl(i) = Rnd()

    Next i

'    monABC.A = "première valeur !"
'    monABC.B = "seconde valeur !"
'    monABC.C = "troisième valeur !"

    monABC.Tableau() = Tbl()

    'en colonne
    Range(Cells(1, 1), Cells(UBound(Tbl, 1), 1)).Value = Application.Transpose(monABC.Tableau())

    'en ligne
    Range(Cells(1, 1), Cells(1, UBound(Tbl, 1))).Value = monABC.Tableau

End Sub

puis testes, tu auras les valeurs en ligne et colonne à partir de A1

Bonjour

je clos le post. J'avais également songé au passage vers un module de classe. Mais je trouvais cela fastidieux.

Merci pour ton aide

Amicalement

Jeb

Rechercher des sujets similaires à "copie type range"