当我在VBA中使用字典时,我遇到了一个问题。我想使用字典和do-while循环的原因是因为我有不同长度的变量,我想循环遍历它们。首先,我想给dic钥匙和物品。我在每个循环中跳过一个字段的原因是,每个系列都有一个带日期的字段和一个带价格的字段。如果可能的话,我想捕获与同一字典中价格相匹配的日期。
Sub opg1(dicSPX As Object)
Dim i As Integer, m As Integer
Dim varColLeng As Variant
Set dicSPX = CreateObject("Scripting.Dictionary")
m = 10
Sheets("Data").Activate
ReDim intCol(1 To nCol)
'opretter dictionary
ReDim n(1 To m)
Do While n <> ""
For i = 1 To mn
' redim preserve IntColLen
dicSPX.Add Cells(1, 2 + ((i - 1) * 2)).Value, Range(Cells(9, 2 + ((i - 1) * 2)), Cells(n, 2 + ((i - 1) * 2))).Value
Next i
Loop
End Sub
,那么我想对dic中的所有键执行一个过程。我想计算不同时间序列的收益。然而,当我调用dic时,子Returns()得到一个错误(编译错误:变量未定义)。我不熟悉字典,我可能遗漏了一个小细节。
Sub Returns()
Call opg1(dicSPX)
Dim dicSPX As New Scripting.Dictionary
Dim varKey As Variant, varArr As Variant
For Each varKey In dicSPX
varArr = dicSPX(varKey)
For i = LBound(varArr, 1) To UBound(varArr, 1)
For j = LBound(varArr, 2) To UBound(varArr, 2)
' varReturns(i,j) = compute the return here
Next
Next
Next
有什么建议吗?我希望问题是清楚的。
谢谢
应该清楚哪个变量不是由抛出错误后突出显示的行定义的。我一眼就看出您没有定义i
或j
:
Sub Returns()
Dim dicSPX As New Scripting.Dictionary
opg1(dicSPX)
Dim varKey As Variant
For Each varKey In dicSPX
Dim varArr As Variant
varArr = dicSPX(varKey)
Dim i As Long
For i = LBound(varArr, 1) To UBound(varArr, 1)
Dim j As Long
For j = LBound(varArr, 2) To UBound(varArr, 2)
varReturns(i,j) = compute the return here
Next
Next
Next
End Sub
在使用每个变量之前,应该每次一行地显式定义它们。这样,声明总是在用法的附近,这样你就可以在同一个页面上看到它。
您还应该使opg1
成为一个返回字典的函数。这样可以澄清你的意图。通过引用传递变量会使读者更难理解程序是如何工作的。