gpt4 book ai didi

vba - 迭代自定义字典对象

转载 作者:行者123 更新时间:2023-12-04 20:17:56 24 4
gpt4 key购买 nike

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

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

我想做的就是能够写:

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

我在看 at this但不能让它工作......

这里是类的总结:
个人电脑类
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

类 Hook
 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 = path(i, 1)

Next i

Set 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

Next hook

最佳答案

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

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

关于vba - 迭代自定义字典对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17171157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com