迭代自定义字典对象

时间:2013-06-18 14:11:48

标签: vba loops object excel-vba dictionary

最近在Python中学到了一些面向对象,我试图在VBA中做同样的事情。

我设法构造一个包含子对象字典的父对象(PC):hooks。 Hooks也是一个带有子项字典的对象:rows。

我想做的就是能写:

for each hook in PC
    for each row in hook
        sheets("X").cells(i,1) = contract.price
    next row
next hook

我正在寻找at this,但无法让它发挥作用......

这里的课程摘要: PC类

Option Explicit

Public pPC As Object
Private pName As String
Private pInclude As Boolean

Private Sub Class_Initialize()
    Set pPC = CreateObject("Scripting.Dictionary")
End Sub

Private Sub Class_Terminate()
    Set pPC = Nothing
End Sub

Public Property Get hook(HookName As String) As CHook:
     Set hook = pPC(HookName)
End Property

Public Sub Add(hook As CHook):
    If Not pPC.exists(hook.Name) Then pPC.Add hook.Name, hook
End Sub

Public Property Get Include(HookName As String) As Boolean:
    pInclude = pPC.exists(HookName)
    Include = pInclude
End Property

Public Property Let Name(pcname As String):
    pName = pcname
End Property

Public Property Get Name() As String:
    Name = pName
End Property

班级挂钩

 Option Explicit

 Public pHook As Object
 Private pName As String
 Private pLTFlatPrice As Double
 Private pLTBasisPrice As Double
 Private pLTDate As Date

 Private Sub Class_Initialize()
    Set pHook = CreateObject("Scripting.Dictionary")
    pLTDate = Sheets("Control").Cells(2, 2)
 End Sub

 Private Sub Class_Terminate()
    Set pHook = Nothing
 End Sub

 Public Sub AddRow(Row As CRow)
    If Not pHook.exists(Row.ContractLot) Then pHook.Add Row.ContractLot, Row
    If Row.TradeDate < pLTDate Then
        pLTDate = Row.TradeDate
        If IsNumeric(Row.FlatMV) And Row.FlatMV <> 0 Then pLTFlatPrice = Row.FlatMV
        If IsNumeric(Row.BasisMV) Then pLTBasisPrice = Row.BasisMV
    End If
 End Sub

 Public Property Get Row(ContractLot As String) As CRow:
    Set Row = pHook.Item(ContractLot)
 End Property

 Public Property Let Name(HookName As String):
    pName = HookName
 End Property

 Public Property Get Name() As String:
    Name = pName
 End Property

 Public Property Get LTFlatPrice() As Double:
    LTFlatPrice = pLTFlatPrice
 End Property

 Public Property Get LTBasisPrice() As Double:
    LTBasisPrice = pLTBasisPrice
 End Property

 Public Property Get LTDate() As Double:
    LTDate = pLTDate
 End Property

以下是发生错误的代码的和平(Object不支持此属性或方法):

  

对于i = 2到UBound(路径,1)

     

tName = path(i,1)

     

接下来我

     

设置PC = SArray.PC(tName)

   For Each hook In PC

       For Each row In hook

            With Sheets("COB")

               .Cells(ii, 2) = row.PC

               .Cells(ii, 3) = row.hook

               .Cells(ii, 4) = row.Period

            End With

       ii = ii + 1

       Next row
     

下一个钩子

1 个答案:

答案 0 :(得分:2)

您可以遍历字典的键或项目:

Sub Tester()

Dim d As New Scripting.Dictionary
Dim k

    d.Add "one", 1
    d.Add "two", 2
    d.Add "three", 3

    For Each k In d.Keys
        Debug.Print k
    Next

    For Each k In d.Items
        Debug.Print k
    Next

End Sub 

因此,您可以将字典公开为对象的属性并对其进行迭代。它确实意味着您需要指定.Items(因为它将默认为键。