Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从字典返回自定义类对象的数组_Arrays_Vba_Dictionary - Fatal编程技术网

Arrays 从字典返回自定义类对象的数组

Arrays 从字典返回自定义类对象的数组,arrays,vba,dictionary,Arrays,Vba,Dictionary,我有一个超级简单的类,叫做元组: Private vals(1) As Integer ----- Public Property Get x() x = vals(0) End Property ----- Public Property Get y() y = vals(1) End Property ----- Public Sub SetVals(x As Integer, y As Integer) vals(0) = x vals(1) = y End Sub 我有一个

我有一个超级简单的类,叫做元组:

Private vals(1) As Integer
-----
Public Property Get x()

x = vals(0)

End Property
-----
Public Property Get y()

y = vals(1)

End Property
-----
Public Sub SetVals(x As Integer, y As Integer)

vals(0) = x
vals(1) = y

End Sub
我有一个字典,里面填充了这些元组的数组:

for x = whatever to whatever
   Set t = New Tuple
   t.SetVals somevalue, someothervalue
   ReDim Preserve tupleArray(x)
   Set tupleArray(x) = t
next x
theDictionary.Add someKey, tupleArray
我想稍后从字典中检索数组,但我正在努力。这是我试过的

Sub DoStuffWithDictionary(dict as object, index as Integer)

Dim tupleArray() as Tuple

' Error: "Property let procedure not defined and property get procedure did not return an object"
tupleArray = dict.Items(index)

' Error: can't assign to array
Set tupleArray = dict.Items(index)

' Error: same as above
Dim tupleArray as Object

' Error: same as above
Dim tupleArray as Variant

End Sub

在字典键上循环-它们都打印出来-好的,我只是无法访问数组。

您应该能够使用该键访问项目:

Dim tupleArray As Variant
tupleArray = dict("someKey")

请参见下面的示例:

在每次字典键迭代中,还需要循环内部数组

元组类:

Private vals(1) As Long

Public Property Get X() As Long
    X = vals(0)
End Property

Public Property Get Y() As Long
    Y = vals(1)
End Property


Public Sub SetVals(ByVal X As Long, ByVal Y As Long)
    vals(0) = X
    vals(1) = Y
End Sub
Sub TestTuple()

    Dim d As Scripting.Dictionary
    Dim t As Tuple
    Dim arr() As Variant
    Dim i As Long, ii As Long

    Set d = New Scripting.Dictionary

    For i = 1 To 3
        For ii = 0 To 3
            Set t = New Tuple
                t.SetVals i + ii + 10, i + ii + 20
            ReDim Preserve arr(ii)
            Set arr(ii) = t
        Next ii
        d.Add CStr(i), arr
        Erase arr
    Next i

    Dim Key As Variant
    For Each Key In d.Keys
        For i = 0 To UBound(d(Key))
            Debug.Print "X: " & d(Key)(i).X, "Y: " & d(Key)(i).Y
        Next i
        Debug.Print ""
    Next
End Sub
测试:

Private vals(1) As Long

Public Property Get X() As Long
    X = vals(0)
End Property

Public Property Get Y() As Long
    Y = vals(1)
End Property


Public Sub SetVals(ByVal X As Long, ByVal Y As Long)
    vals(0) = X
    vals(1) = Y
End Sub
Sub TestTuple()

    Dim d As Scripting.Dictionary
    Dim t As Tuple
    Dim arr() As Variant
    Dim i As Long, ii As Long

    Set d = New Scripting.Dictionary

    For i = 1 To 3
        For ii = 0 To 3
            Set t = New Tuple
                t.SetVals i + ii + 10, i + ii + 20
            ReDim Preserve arr(ii)
            Set arr(ii) = t
        Next ii
        d.Add CStr(i), arr
        Erase arr
    Next i

    Dim Key As Variant
    For Each Key In d.Keys
        For i = 0 To UBound(d(Key))
            Debug.Print "X: " & d(Key)(i).X, "Y: " & d(Key)(i).Y
        Next i
        Debug.Print ""
    Next
End Sub
输出:

X: 11         Y: 21
X: 12         Y: 22
X: 13         Y: 23
X: 14         Y: 24

X: 12         Y: 22
X: 13         Y: 23
X: 14         Y: 24
X: 15         Y: 25

X: 13         Y: 23
X: 14         Y: 24
X: 15         Y: 25
X: 16         Y: 26
编辑:

Private vals(1) As Long

Public Property Get X() As Long
    X = vals(0)
End Property

Public Property Get Y() As Long
    Y = vals(1)
End Property


Public Sub SetVals(ByVal X As Long, ByVal Y As Long)
    vals(0) = X
    vals(1) = Y
End Sub
Sub TestTuple()

    Dim d As Scripting.Dictionary
    Dim t As Tuple
    Dim arr() As Variant
    Dim i As Long, ii As Long

    Set d = New Scripting.Dictionary

    For i = 1 To 3
        For ii = 0 To 3
            Set t = New Tuple
                t.SetVals i + ii + 10, i + ii + 20
            ReDim Preserve arr(ii)
            Set arr(ii) = t
        Next ii
        d.Add CStr(i), arr
        Erase arr
    Next i

    Dim Key As Variant
    For Each Key In d.Keys
        For i = 0 To UBound(d(Key))
            Debug.Print "X: " & d(Key)(i).X, "Y: " & d(Key)(i).Y
        Next i
        Debug.Print ""
    Next
End Sub
如果愿意,可以将数组声明为元组。见下文:

Sub Test2()

    Dim arr() As Tuple
    Dim t As Tuple
    Dim i As Long

    For i = 0 To 4
        Set t = New Tuple
            t.SetVals i + 10, i + 20
            ReDim Preserve arr(i)
        Set arr(i) = t
    Next i

    For i = 0 To UBound(arr)
        Debug.Print arr(i).X, arr(i).Y
    Next
End Sub

 '10            20 
 '11            21 
 '12            22 
 '13            23 
 '14            24 

谢谢,回答得好。你能解释为什么tupleArray应该是一个变体而不是类吗?另外,我猜没有办法将字典中的数组重新分配到字典之外的新数组?请参见编辑。如果愿意,可以将数组声明为元组,也可以获得intellisense。对于数组,我只是习惯了变量类型。:)