Fonction qui retourne une collection d'objets

Fonction qui retourne une collection d'objets - VB/VBA/VBS - Programmation

Marsh Posté le 05-07-2006 à 15:27:27    

Bonjour a tout le monde,
 
après de multiples recherches mais sans réelles réponses, je m'en remets a vous. Je voudrais savoir comment retourner une collection d'objets. Je m'explique :  
 
Mon type :  
 
Public Type myCompany
    nomCompany As String
    numCompany As String
End Type
 
Public Type TabCompany
    myCompanies() As myCompany
End Type  
 
 
Ensuite j ai une fonction ou je remplis mon tableau qui marche tres bien ! Mais impossible de retourner quelque chose. Ma fonction est déclaré comme tel:
Public Function RecValeurs() As Variant  
 
ou bien comme tel  
 
Public Function RecValeurs() As TabCompany  
 
J'instancie mes types crées plus haut et avec pour instruction de retour :  
 
RecValeurs() = TabCompany
 
 
Mais rien a faire dans les deux cas une erreur. Que faire ? Est-il impossible de retourner une collection d'objets ?  
 
Je vous remercie d'avance de votre réponse et A très bientôt je l'espere !

Reply

Marsh Posté le 05-07-2006 à 15:27:27   

Reply

Marsh Posté le 05-07-2006 à 15:44:37    

Si c'est ta fonction "RecValeurs" qui retourne une valeur vaut mieux mettre  
Tabcompany=RecValeurs()
Non ?

Reply

Marsh Posté le 05-07-2006 à 15:52:25    

Je ne pense pas  
 
c est la fonction qui est egale a la collection d'objets

Reply

Marsh Posté le 05-07-2006 à 15:54:56    

Et c'est quoi le message d'erreur ?

Reply

Marsh Posté le 05-07-2006 à 16:06:44    

Voila le code se sera plus sipmle pour comprendre ;)
 

Code :
  1. Option Explicit
  2. 'Creation d'un nouveau type
  3. 'Caractéristique d'une societé
  4. Public Type myCompany
  5.     nomCompany As String
  6.     numDsCompany As String
  7. End Type
  8. 'Caractéristique du tableau de societés sélectionnés
  9. Public Type TabCompany
  10.     myCompanies() As myCompany
  11. End Type
  12. Function RecSelection() As Variant
  13. 'Macro des companies sélectionnées et renvoie un tableau des companies selectionnés
  14. 'Tableau composé du nom de la societe et du numero de DataStream
  15. 'Variables locales
  16. 'Variables de la feuille
  17. Dim objxlWorkbook As Excel.Workbook
  18. Dim objxlSheetLis As Excel.Worksheet
  19. 'Variables du tableau
  20. Dim TabComp As TabCompany
  21. Dim MaCompany As myCompany
  22. Dim msg As String
  23. Dim nbCompany As Integer
  24. Dim inc As Integer 'indice d'incrementation
  25. 'Initialisation des feuilles excel
  26. Set objxlWorkbook = ActiveWorkbook
  27. Set objxlSheetLis = objxlWorkbook.Worksheets("Liste" )
  28. 'Initialisation de l'incrementation
  29. inc = 1
  30. nbCompany = 0
  31. 'Calcul du nombre de societés
  32. Do While (objxlSheetLis.Range("NameCompany" ).Offset(inc, 0) <> "" )
  33.     If (objxlSheetLis.Range("SelCompany" ).Offset(inc, 0).Value = "X" ) Then
  34.         nbCompany = nbCompany + 1
  35.     End If
  36.     inc = inc + 1
  37. Loop
  38. 'Redimension du tableau en fonction du nombre de company
  39. ReDim Preserve TabComp.myCompanies(nbCompany)
  40. 'Réinitilisation de l'indice d'incrementation
  41. inc = 1
  42. 'Enregistrement de mes societés selectionnés dans un tableau
  43. Do While (objxlSheetLis.Range("NameCompany" ).Offset(inc, 0) <> "" )
  44.     If (objxlSheetLis.Range("SelCompany" ).Offset(inc, 0) = "X" ) Then
  45.         MaCompany.nomCompany = objxlSheetLis.Range("NameCompany" ).Offset(inc, 0)
  46.         MaCompany.numDsCompany = objxlSheetLis.Range("DsCompany" ).Offset(inc, 0)
  47.         TabComp.myCompanies(inc) = MaCompany
  48.     End If
  49.     inc = inc + 1
  50. Loop
  51.    
  52. 'Renvoie le tableau des companies sélectionnés
  53. RecSelection() = TabComp.myCompanies   <<<==== ICI L'erreur !!!!
  54.    
  55. End Function


 
 
Voila, maintenant le message d'erreur qui est le suivant :
 
Only user-defined types defined in public object modules can ve coerced to or from a variant or passed to late-bound functions  
 
Merci d'avance de votre réponse ;)

Reply

Marsh Posté le 05-07-2006 à 16:27:25    

Le message, c'est que ton type doit être déclaré public dans un module.
 
Voir la doc, le chapitre concernant le passage de tableaux en paramètres.


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 06-07-2006 à 09:37:52    

JihemAir a écrit :

Le message, c'est que ton type doit être déclaré public dans un module.
 
Voir la doc, le chapitre concernant le passage de tableaux en paramètres.


 
Ce qui est le cas, non ? (cf le code)

Reply

Marsh Posté le 06-07-2006 à 09:59:31    

Je pense qu'avec les aménagements suivants cela devrait aller mieux (mais à vérifier)

Function RecSelection() As myCompany()
...
  RecSelection = TabComp.myCompanies


Pour exemple, voici une fonction qui fonctionne en VB6

Function test() As String()
    Dim s() As String
    ReDim s(5) As String
    test = s
End Function


edit: je sais pas si en vba ça marchera aussi bien


Message édité par tegu le 06-07-2006 à 10:00:57
Reply

Marsh Posté le 06-07-2006 à 10:13:49    

Merci beaucoup a vous, grave a vos conseils j'ai trouvé !!!

Reply

Marsh Posté le 06-07-2006 à 10:16:25    

Et la réponse est ?

Reply

Marsh Posté le 06-07-2006 à 10:16:25   

Reply

Marsh Posté le 06-07-2006 à 10:23:20    

Les seuls changements sont :  
 
 Function RecSelection() As TabCompany
 
et  
 
RecSelection = TabComp
 
Merci Mr tegu  
 


Message édité par clems7516 le 06-07-2006 à 10:25:01
Reply

Marsh Posté le 06-07-2006 à 10:31:24    

Et pourquoi tu lui fais pas retourner TabComp (type Tabcompany) à ta fonction recselection ?

Reply

Marsh Posté le 06-07-2006 à 10:35:07    

Oui c est ce que je fais
 
Message édité :D

Reply

Marsh Posté le 06-07-2006 à 11:00:52    

Alors en conservant le retour d'origine
Public Function RecSelection() As myCompany()
et
RecSelection = TabComp.myCompanies()
ca marche aussi !

Reply

Marsh Posté le 06-07-2006 à 12:32:59    

Tout a fait

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed