2

最近在 Python 中学习了一些面向对象的知识,我正在尝试在 VBA 中做同样的事情。

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

我想做的就是能够写:

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

我在看这个,但不能让它工作......

这里的类摘要: 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

这是发生错误的代码的和平(对象不支持此属性或方法):

For i = 2 To UBound(path, 1)

tName = 路径(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

下一个钩子

4

1 回答 1

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(因为它将默认为键。

于 2013-06-18T19:37:52.270 回答