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

Messages postés
2
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
7 février 2010
- - Dernière réponse : 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
77
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 111 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
266
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 111 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
266
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 111 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
2
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
7 février 2010
0
Merci
Merci Jacques, ta réponse me montre les limites de cette méthode. Finalement je vais devoir choisir une voie plus simple.
Commenter la réponse de cs_MBruno

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.