2013-07-06 94 views
0

我試圖通過使用.item()訪問集合中的數據。我正在嘗試的是收集收集功能fncPopCcyLst中的數據,並通過.item(1)來訪問cbSortCcy以獲取行號。這是一個測試,看看我是否可以將多個數據存儲在我的收藏中,並通過.item()訪問它們。但是,我得到一個VBA運行時錯誤'5'。有人會親切地指導我做錯了什麼嗎?謝謝。從集合VBA訪問數據

以下是我的代碼。

類模塊:clsSngGenUtl

Private prpSngStrVal As String 
Private prpSngRowNum As Long 
Private prpSngClmNum As Long 

'++ Define properties 
'== String row number 
Public Property Get SngStrVal() As String 
    SngStrVal = prpSngStrVal 
End Property 
Public Property Let SngStrVal(ByRef varStrVal As String) 
    prpSngStrVal = varStrVal 
End Property 

'++ Define properties 
'== Scalar row number 
Public Property Get SngRowNum() As Long 
    SngRowNum = prpSngRowNum 
End Property 
Public Property Let SngRowNum(ByVal varRowNum As Long) 
    prpSngRowNum = varRowNum 
End Property 

'++ Define properties 
'== Single column number 
Public Property Get SngClmNum() As Long 
    SngClmNum = prpSngClmNum 
End Property 
Public Property Let SngClmNum(ByRef varClmNum As Long) 
    prpSngClmNum = varClmNum 
End Property 

'++ Define functions 
'== function get row number 
Public Function fncGetRowNum(ByRef varWbName As Workbook, ByVal varWsName As String, ByRef varSttClm As Long) As Long 

    On Error GoTo Exception 

    prpSngRowNum = 0 
    prpSngRowNum = varWbName.Sheets(Trim(varWsName)).Cells(Rows.Count, varSttClm).End(xlUp).Row 

    fncGetRowNum = prpSngRowNum 

ExitHere: 
    Exit Function 

Exception: 
    Resume ExitHere 

End Function 

'== function get column number 
Public Function fncGetClmNum(ByRef varWbName As Workbook, ByVal varWsName As String, ByRef varSttRow As Long) As Long 

    On Error GoTo Exception 

    prpSngClmNum = 0 
    prpSngClmNum = varWbName.Sheets(Trim(varWsName)).Cells(varSttRow, Columns.Count).End(xlToLeft).Column 

    fncGetClmNum = prpSngClmNum 

ExitHere: 
    Exit Function 

Exception: 
    Resume ExitHere 

End Function` 

下面是我的集合類:clsColCcySrt

'++ Declare variables 
    Private prpColCcySrt As Collection 

    '++ Define properties 
    Public Property Get ColCcySrt() As Collection 
     Set ColCcySrt = prpColCcySrt 
    End Property 
    Public Property Set ColCcySrt(varColCcy As Collection) 
     Set prpColCcySrt = varColCcy 
    End Property 

    Public Function fncGetCcyRow(ByRef varStrVal As String) As Long 

     On Error GoTo Exception 

     Dim clsSngGen As clsSngGenUtl 
     Dim varRowNum As Long 

     varRowNum = 0 
     For Each clsSngGen In Me.ColCcySrt 
      varRowNum = clsSngGen.SngRowNum() 
     Next clsSngGen 

     '== Return value 
     fncGetCcyRow = varRowNum 

    ExitHere: 
     Exit Function 

    Exception: 
     If fncGetCcyRow = 0 Then 
      MsgBox "Exception: Value is <" & fncGetCcyRow & ">." 
     End If 
     Resume ExitHere 

    End Function 
` 

「常規」 模塊來填充數組:fncPopFxLst

` 

    Public Function fncPopCcyLst(ByRef varWbName As String, ByRef varWsName As String, ByRef varCcyTyp As String) As Collection 

     Dim clnColCcy As Collection 
     Dim clsArrGen As clsArrGenUtl 
     Dim clsSngGen As clsSngGenUtl 
     Dim varWbName As Workbook 

     Set clnColCcy = New Collection 

     '== Start collecting items 
     Set clsSngGen = New clsSngGenUtl 
     Set varWbName = ThisWorkbook 
     clsSngGen.SngStrVal = "Reuters" 
     clsSngGen.SngRowNum = clsSngGen.fncGetRowNum(varWbName, varWsName, 1) 
     clnColCcy.Add clsSngGen 

     Set fncPopCcyLst = clnColCcy 

    End Function 
` 

最後,子程序`

Private Sub cbSortCcy() 

     Dim clsColCcy As clsColCcySrt 

     Dim varDirPth As String 
     Dim varCcySrc As String 
     Dim varWsStrg As String 
     Dim varWbStrg As String 

     varDirPth = tbDirectoryName & "\" & tbFileName 
     varCcySrc = "Currency" 
     varWsStrg = "List" 
     varWbStrg = varDirPth 

     Set clsColCcy = New clsColCcySrt 
     Set clsColCcy.ColCcySrt = fncPopCcyLst(varWbStrg, varWsStrg, varCcySrc) 

     'Debug.Princ clsColCcy.fncGetCcyRow("Reuters") 
     Debug.Print clsColCcy.ColCcySrt.Item(1) 

    End Sub 
` 

回答

0

VBA運行時錯誤 '5' 是:

「無效的過程調用或參數」

在你clsColCcySrt類,你有一句臺詞:

varRowNum = clsSngGen.SngRowNum() 

這將是正確的,如果SngRowNumfunction而不是property 。刪除括號()以致電property

+0

謝謝你的回覆和更正。刪除括號後,效果很好。當我使用.item(1)訪問數據時,我仍然很好奇,而不是在子程序cbSortCcy()中使用fncGetCcyRow函數,我得到一個運行時錯誤'438'?爲什麼我無法使用.item(1)訪問?謝謝。 – AnonymousJ

+0

自從我完成了VBA之後已經有一段時間了(所以我可能會錯),但是我認爲'Debug.Print'需要一個值,而不是一個對象,因爲'.Item'的類型是'clsSngGenUtl'我看到你訪問'.Item'的唯一地方是在'Debug.Print'行),請嘗試訪問'clsSngGenUtl'的屬性來代替:'Debug.Print clsColCcy.ColCcySrt.Item(1).SngStrVal' – pete

+0

謝謝非常。你提供的解釋糾正了這個問題。 – AnonymousJ