cs_MBruno
Messages postés2Date d'inscriptionmercredi 20 décembre 2006StatutMembreDernière intervention 7 février 2010
-
6 févr. 2010 à 23:32
cs_MBruno
Messages postés2Date d'inscriptionmercredi 20 décembre 2006StatutMembreDerniè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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018209 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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018209 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