2013-10-27 103 views
3

阿霍伊HOY,按名稱獲取VBA集合項目

我試圖通過引用它做的東西到自定義對象的自定義集合在VBA Excel中的name屬性。我發誓它之前(或至少沒有發生錯誤),現在它的工作。當我嘗試使用字符串嘗試Get時,出現invalid call or argument錯誤。提前致謝,甚至閱讀此,任何幫助表示讚賞。 < \編輯>

這裏的集合:

Option Explicit 

Private DRAFields As New Collection 

Sub Add(Name As String, Optional colNbr As Long, Optional Exists As Boolean) 
    Dim fld As New DRAFld 
    fld.colNbr = colNbr 
    fld.Name = Name 
    fld.Exists = Exists 

    DRAFields.Add fld 
End Sub 

Property Get Item(NameOrNumber As Variant) 
    Set Item = DRAFields(NameOrNumber) '<------- Error here 
End Property 

館藏有通過傳遞名稱的陣列中的一個函數添加的項目,並沒有問題,返回集合。我可以通過使用密鑰進行迭代。以防萬一Debug.Print myFlds.Item("Customer").colNbr

和對象類:

Option Explicit 

Private clmNbrPvt  As Long 
Private namePvt   As String 
Private existsPvt  As Boolean 

Public Property Get colNbr() As Long 
    colNbr = clmNbrPvt 
End Property 
Public Property Let colNbr(lngParam As Long) 
    clmNbrPvt = lngParam 
End Property 


Public Property Get Name() As String 
    Name = namePvt 
End Property 

Public Property Let Name(strParam As String) 
    namePvt = strParam 
End Property 


Public Property Get Exists() As Boolean 
    Exists = existsPvt 
End Property 
Public Property Let Exists(booParam As Boolean) 
    existsPvt = booParam 
End Property 

爲什麼不說功能太:但是如果讓這樣的錯誤發生

Function validateAndBuildDRAFields(ByRef arrReqFields() As String, _ 
    inputSheet As Worksheet, _ 
    Optional VBAModule As String) As clsDRAFields 

Dim lEndCol  As Long: lEndCol = Standard.zGetLastColumn(inputSheet, 1) 
Dim i   As Long 
Dim x   As Long 
Dim intExit  As Long 
Dim myDRAFields As New clsDRAFields 

    Set validateAndBuildDRAFields = myDRAFields 

    'Builds myDRAFields items from arrReqFields 
    For i = LBound(arrReqFields) To UBound(arrReqFields) 
     myDRAFields.Add arrReqFields(i) 
    Next i 

    'checks if required fields exist on input sheet 
    'if found then sets column number and exists = true 
    For i = 1 To myDRAFields.Count 
     For x = 1 To lEndCol 
      If inputSheet.Cells(1, x) = myDRAFields.Item(i).Name Then 
       myDRAFields.Item(i).colNbr = x 
       myDRAFields.Item(i).Exists = True 
       intExit = intExit + 1 
       Exit For 
      End If 
     Next x 
     If intExit = UBound(arrReqFields) + 1 Then Exit For 
    Next i 

    ' tells user if there are any missing fields and ends if true 
    If (Not intExit = UBound(arrReqFields) + 1) Or _ 
     intExit = 0 Then 
     For i = 1 To myDRAFields.Count 
      If myDRAFields.Item(i).Exists = False Then 
       Call Standard.TheEndWithError("I couldn't find the " & myDRAFields.Item(i).Name & _ 
        " column in your file. Please add " & myDRAFields.Item(i).Name & _ 
        " to your DRA Layout.", False, VBAModule) 
      End If 
     Next i 
     Set myDRAFields = Nothing 
     Standard.TheEnd 
    End If 
End Function 

回答

7

通過訪問集合項目的鍵,當您將項目添加到集合時,您必須提供一個鍵。關鍵是可選的。當您使用字符串訪問集合項目時,Item方法假定您希望匹配密鑰。當你使用一個整數時,它假定你想要位置索引。

所以,在你的Add方法將該行更改爲

DRAFields.Add fld, fld.Name 

,你就可以通過他們的名稱屬性來訪問項目。

+0

哇,這是我在查找如何使用集合時錯過的重要一點。非常感謝! – Bippy