2013-06-05 4 views
0

J'ai commencé à apprendre VBA pour mon travail à la fin de l'été dernier, et je peux dire avec fierté que c'est la première fois que je ne peux pas pour trouver la réponse sur Google. J'ai commencé à m'instruire sur les cours cette semaine, et je suis tombé sur une situation où j'aimerais pouvoir identifier une «propriété indexée» pour ma classe.Création d'une propriété Container dans une classe VBA qui renvoie des éléments indexés (Excel VBA 2003)

Puisque c'est probablement pas ici l'explication la plus claire, est un exemple hypothétique:

La classe que j'ai créé pour ma sandwicherie super génial (clsSASS) contient des propriétés pour les calories, le poids en grammes, le prix, et Ingrédients. Les trois premiers sont des variables avec des énoncés let et get très simples. I.E .:

Public pCal As Integer 

Public Property Get Calories() As Integer 
    Calories= pCal 
End Property 

Public Property Let Calories(Value As Integer) 
    pCal = Value 
End Property 

Les ingrédients sont toutefois conçus pour contenir, dans l'ordre d'entrée, la liste des ingrédients. Mon instinct initial était de faire quelque chose comme ceci:

Public pIngd As Collection 

Public Property Get Ingredients(Value As Integer) As Collection 
    Ingredients = pIngd(Value) 
End Property 

Public Property Set Ingredients(Object As Collection) 
    Set pIngd = Object 
End Property 

Donc, si Bacon était le premier ingrédient dans la liste (et soyons honnête, il serait toujours), quelque chose comme clsNewSandwich.Ingredients (1) reviendriez la chaîne 'Bacon'.

Le problème est survenu lorsque j'ai ajouté une propriété de conteneur à une classe et que je n'ai pas pu déterminer comment identifier les éléments individuels dans le conteneur. Il se peut donc que ce soit une simple question de syntaxe qui n'a rien à voir avec les classes.

Merci beaucoup!

* modifié pour plus de clarté/continuité

+0

Il est un peu déroutant au nom votre propriété Let/Get avec des noms différents ('Calories' vs.' RowStart'). De toute façon, votre propriété 'Ingredients' est définie comme renvoyant une collection, mais vous ne renvoyez qu'un seul élément de la collection' pIngd'. Sauf si 'pIngd' est en fait une collection de collections, vous devez corriger le type de retour de' Ingrédients' –

+0

Merci pour votre aide! J'ai modifié la question un peu pour plus de clarté. J'avais copié sur mon code actuel et l'ai édité à la hâte pour l'exemple. Juste pour m'assurer que je comprends, pour la propriété Get, je devrais obtenir la variable ou le type d'objet que je voudrais retourner (ce qui dans ce cas serait une chaîne). Propriété publique Obtient des composants (valeur en tant qu'entier) sous forme de chaîne – user2456814

Répondre

3

OK - Je vais retirer mon avis sur toujours nommer louer/set et obtenir les mêmes, depuis dans ce cas vous ne pouvez pas, puisque la « entrée » et « sortie » les types ne sont pas les mêmes. Ainsi, dans l'exemple ci-dessous, j'ai appelé la propriété qui retourne un seul ingrédient comme Ingredient

classe « clsSASS »:

Dim pIngd As Collection 

Property Set Ingredients(c As Collection) 
    Set pIngd = c 
End Property 

Property Get Ingredient(v As Integer) As String 
    Ingredient = pIngd(v) 
End Property 

Module normal:

Sub Tester() 
Dim c As New Collection 
Dim s As New clsSASS 

    c.Add "bacon" 
    c.Add "lettuce" 
    c.Add "tomato" 

    Set s.Ingredients = c 

    Debug.Print s.Ingredient(1) 'bacon 
    Debug.Print s.Ingredient(2) 'lettuce 
    Debug.Print s.Ingredient(3) 'tomato 

End Sub 
+0

Cela l'a corrigé. Merci beaucoup! – user2456814

Questions connexes