[Déplacé VB6 --> VBA] Transférer un tableau défini avec l'instruction type vers

Résolu
cs_MBruno Messages postés 2 Date d'inscription mercredi 20 décembre 2006 Statut Membre Dernière intervention 7 février 2010 - 6 févr. 2010 à 23:32
cs_MBruno Messages postés 2 Date d'inscription mercredi 20 décembre 2006 Statut Membre Dernière intervention 7 février 2010 - 7 févr. 2010 à 12:14
Bonsoir,
J'utilise VBA excel afin de retraiter des données d'un fichier vers un autre fichier.
J'ai un problème d'utilisation des types de données définies par l'utilisateur : dans un module, je déclare un tableau avec un type de données que j'ai définies avec l'instruction type.
Une fois que mon tableau est alimenté, je voudrais pouvoir le transférer en une seule fois vers une feuille excel. Avec la méthode que j'ai utilisée, VBA me renvoie le message d'erreur :
"Seuls les types définis par l'utilisateur et qui sont définis dans les modules d'objet public peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive."
Ce message semble indiquer qu'il faut que j'utilise un module de classe...

Ce transfert est-il possible et comment ?

Par avance merci pour votre aide,

Bruno.

    
Option Explicit
Option Base 1
 
Type voiture
    Couleur As String
    Cylindree As Long
    anneeAchat As Date
End Type
 
Sub Test()
 
    Dim Tableau(2) As Voiture
    
    'Remplissage de 1ere ligne Tableau
    Tableau(1).Couleur = "Rouge"
    Tableau(1).Cylindree = 2000
    Tableau(1).anneeAchat = #4/21/2004#
 
    'Remplissage de 2nde ligne Tableau
    Tableau(2).Couleur = "vert"
    Tableau(2).anneeAchat = 2000
    Tableau(2).Cylindree = #5/13/2001#
    
With Sheets("Feuil1")
 .Range(.Cells(1, 1), .Cells(2, 3)).Value = Tableau
End With
 
End Sub

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 févr. 2010 à 03:48
Salut
Non, à ma connaissance, ce n'est pas possible (même avec un tableau simple non issu d'une structure (type)).
Ca l'aurait été avec des données contenues dans un RecordSet grace à la commande Range().CopyFromRecordset mais non applicable à un tableau.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
7 févr. 2010 à 09:20
Bonjour,

J('ignore (et ne veux pas le savoir) pour quelle raison tu te compliques ainsi la vie ... ... mais c'est to n affaire !
Voilà un exempole de ce que tu peux faire, si tu tiens à utiliser une structure :

Option Explicit
Dim tableau() As String
Private Type bebelles
   lacouleur As String
   lacylindree As String
   lanneeachat As String
End Type
 
Private Sub CommandButton1_Click()
   ReDim tableau(1 To 4, 1 To 3)
   Dim toto As bebelles, nb As Integer
   nb = 1
   With toto
     .lacouleur = "rouge"
     .lacylindree = "2000"
     .lanneeachat = "01/01/2000"
   End With
   remplir toto, tableau, nb
   With toto
     .lacouleur = "vert"
     .lacylindree = "2004"
     .lanneeachat = "01/01/2004"
   End With
    remplir toto, tableau, nb
    With toto
     .lacouleur = "bleu"
     .lacylindree = "2003"
     .lanneeachat = "01/01/2003"
   End With
   remplir toto, tableau, nb
   With toto
     .lacouleur = "gris"
     .lacylindree = "2001"
     .lanneeachat = "01/01/2001"
   End With
   remplir toto, tableau, nb
  With Sheets("Feuil2")
   .Range(.Cells(1, 1), .Cells(4, 3)).Value = tableau
  End With
End Sub

Private Sub remplir(toto As bebelles, ByRef tableau, nb As Integer)
  tableau(nb, 1) = toto.lacouleur
  tableau(nb, 2) = toto.lacylindree
  tableau(nb, 3) = toto.lanneeachat
  nb = nb + 1
End Sub


Tu remarqueras que j'ai utilisé nb ... A toi de t'en débarrasser en te servant comme il convient de redim Préserve et de Lbound

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
7 févr. 2010 à 12:08
Allez, va...
Je m'ennuie et devine que tu vas te mélanger les pinceaux avec un Rdim Preserve...
Pourquoi ? parce que l'on ne peut à son aide qu'augmenter la dernière dimension (or, c'est la première, que tu veux augmenter !).
Comment, alors ? ===>> en construisant le tableau "à l'envers" (inversion de ses lignes et colonnes).
Oui, mais, alors, quid de la présentation du Range ?
Ben...
on va le "remettre à l'endroit grâce à la fonction Transpose, et puis c'est tout...
Et dxans la foulée, on va déterminer l'adresse de la plage d'accueil, par rapport à la cellule de départ :
On sait où çà commence (en cells(1,1) , le nombre de colonnes (3 par définition) .
Reste à déterminer le n° de la dernière ligne ? Ben, c'est précisément UBound(tableau, 2)
On y va ? ===>>
Option Explicit
Dim tableau() As String
Private Type bebelles
   lacouleur As String
   lacylindree As String
   lanneeachat As String
End Type
 
Private Sub CommandButton1_Click()
   ReDim tableau(1 To 3, 0 To 0)
   Dim toto As bebelles
   'nb = 1
   With toto
     .lacouleur = "rouge"
     .lacylindree = "2000"
     .lanneeachat = "01/01/2000"
   End With
   remplir toto, tableau
   With toto
     .lacouleur = "vert"
     .lacylindree = "2004"
     .lanneeachat = "01/01/2004"
   End With
    remplir toto, tableau
    With toto
     .lacouleur = "bleu"
     .lacylindree = "2003"
     .lanneeachat = "01/01/2003"
   End With
   remplir toto, tableau
   With toto
     .lacouleur = "gris"
     .lacylindree = "2001"
     .lanneeachat = "01/01/2001"
   End With
   remplir toto, tableau
    With toto
     .lacouleur = "caca d'oie"
     .lacylindree = "peu"
     .lanneeachat = "01/01/1951"
   End With
   remplir toto, tableau
  With Sheets("Feuil12")
    .Range(.Cells(1, 1), .Cells(UBound(tableau, 2), 3)).Value = Application.Transpose(tableau)
  End With
End Sub

Private Sub remplir(toto As bebelles, ByRef tableau)
  Dim nb As Integer
  nb = UBound(tableau, 2) + 1
  ReDim Preserve tableau(1 To 3, 1 To nb)
  tableau(1, nb) = toto.lacouleur
  tableau(2, nb) = toto.lacylindree
  tableau(3, nb) = toto.lanneeachat
End Sub


Reste que tout cela (comme dit plus haut) est bien cher payer pour bien peu (que tu ferais mieux de traiter différemment que par l'utilisation d'une structure, surtout si petite )
Bon app !
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
3
cs_MBruno Messages postés 2 Date d'inscription mercredi 20 décembre 2006 Statut Membre Dernière intervention 7 février 2010
7 févr. 2010 à 12:14
Merci Jacques, ta réponse me montre les limites de cette méthode. Finalement je vais devoir choisir une voie plus simple.
0
Rejoignez-nous