2010-07-30 6 views
4

Je suis toujours en train d'apprendre VBA et je n'arrive pas à comprendre pourquoi j'ai tellement de problèmes avec un objet Collections.Erreurs lors de l'ajout d'éléments à une collection VBA/VB6

J'ai une fonction qui ajoute des objets personnalisés (j'ai créé une classe très simple pour stocker des données) qui fait la sorte typique de "lire des données, créer des représentations d'objets, les coller dans Collections".

Si j'essaie d'ajouter une "clé" à l'appel bag.add, j'obtiens un message "Erreur de compilation .Attendu: =".

Si je n'ai pas l'air d'avoir travaillé alors quand j'ai lancé le programme, il est écrit "Compile Error, argument non optionnel" et met en surbrillance la ligne "getRevColumns = bag".

Je ne peux pas pour la vie de moi comprendre ce qui se passe! Je soupçonne quelque chose de mal avec la façon dont j'ai initialisé mon sac ?! PS: columnMap est le nom de ma classe personnalisée.

Function getRevColumns() As Collection 

Dim rng As Range 
Dim i As Integer 
Dim bag As Collection 
Dim opManCol As Integer, siebelCol As Integer 
Dim opManColName As String, siebelColName As String 
Dim itm As columnMap 

Set bag = New Collection 
Set rng = shSiebelMap.UsedRange.Columns(5) 

i = 1 
For i = 1 To rng.Rows.count 

    If StrComp(UCase(rng.Cells(i).value), "Y") = 0 Then 

     opManCol = rng.Rows(i).OffSet(0, -2).value 
     opManColName = rng.Rows(i).OffSet(0, -4) 
     siebelCol = rng.Rows(i).OffSet(0, -1).value 
     siebelColName = rng.Rows(i).OffSet(0, -3) 

     Set itm = New columnMap 
     itm.opManColName = opManColName 
     itm.opManColNumber = opManCol 
     itm.siebelColName = siebelColName 
     itm.siebelColNumber = siebelCol 

     'WHY DOESN'T IT WORK!'' 
     bag.Add (itm) 

     'MsgBox "opMan Col: " & opManColName & " : " & opManCol & ". Siebel Col: " & siebelColName & " : " & siebelCol' 

    End If 

Next i 

getRevColumns = bag 

End Function 
+0

Est-il possible que vous posiez également la classe "columnMap"? – hol

Répondre

10

Essayez de supprimer les parens autour itm dans le module complémentaire:

bag.Add itm 

ou

bag.Add itm, key 

Cela fait un moment que j'ai dû travailler avec VBA/VB6, mais je crois que l'inclusion des parens le fait passer par valeur plutôt que par référence. Je peux me tromper.

+2

Un mot: Bizzare! Merci à un million de compagnons. Je reçois toujours des erreurs mais maintenant c'est autre chose. – holografix

+0

Ce comportement a également été abordé dans la question 'Fonctionnalités masquées de VBA' sur StackOverflow. http://stackoverflow.com/questions/1070863/hidden-features-of-vba#1070942 – marg

3

le sac est un objet. Règle n ° 1 pour utiliser des objets Set

Set getRevColumns = bag 
+0

Oui, vous étiez vraiment là! Bizarre VBA bizarre ... Où est le mot clé de retour ?! – holografix

+1

Il n'y a pas d'instruction de retour explicite. La valeur de retour (ou l'objet comme dans votre cas) doit correspondre au nom de la fonction. – renick

+0

Oui, je l'ai eu après 20 minutes de me gratter la tête et 10 autres de googling! – holografix

0

Vous devez dire

set getRevColumns = bag 

aussi je suppose que vous avez un problème sur le module complémentaire. Je ne sais pas pourquoi il en est, mais il fonctionne sur

bag.add itm 

J'ai essayé tout cela d'une manière simple ici est mon code de travail

Sub myroutine() 

    Dim bag As Collection 
    Dim itm As clsSimple 

    Set bag = getTheCollection() 

    Set itm = bag.Item(1) 
    MsgBox (itm.someObjectValue) 

    Set itm = bag.Item(2) 
    MsgBox (itm.someObjectValue) 


End Sub 

Function getTheCollection() As Collection 

     Dim bag As Collection 
     Dim itm As clsSimple 

     Set bag = New Collection 

     Set itm = New clsSimple 
     itm.someObjectValue = "value 1" 
     bag.Add itm 

     Set itm = New clsSimple 
     itm.someObjectValue = "value 2" 
     bag.Add itm 

     Set getTheCollection = bag 

End Function 

La classe est très simple:

Public someObjectValue As String 

J'espère que ça aide

+0

Il fait vraiment mate! Je ne comprends pas pourquoi je ne suis pas censé utiliser() autour de cette méthode d'ajout ... mais de toute façon tant que cela fonctionne. – holografix

+0

Oui, c'est fou, mais comme Vincent l'a mentionné auparavant, il semble y avoir une certaine logique derrière la façon dont le paramètre est passé (par valeur ou par référence). Je l'ai googlé pendant un moment mais je n'ai rien trouvé. VBA est en quelque sorte vieux VB6 et n'était pas parfait. – hol

-1

J'ai eu un problème similaire avec une collection.

I Dim'd, mais ne l'avait pas défini avec New ou initialisé.

Fondamentalement, j'avait

Dim collection1 As Collection 
... 
collection1.Add item  'no compile error just empty 

j'ajouté ce qui suit avant d'ajouter

Set collection1 = New Collection 
Call collection1.init 

alors cela a fonctionné comme un charme ... Je l'avais aussi déplacé l'instruction Dim du Sub au sommet du module pour en faire une variable de classe