Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
VBA动态填充嵌套数据结构_Vba_Dictionary_Multidimensional Array_Collections_Nested - Fatal编程技术网

VBA动态填充嵌套数据结构

VBA动态填充嵌套数据结构,vba,dictionary,multidimensional-array,collections,nested,Vba,Dictionary,Multidimensional Array,Collections,Nested,我有几个SQL表,其中一些是链接的,我想查询一次并存储在单个变量中。我不能提前预测数据的长度,所以我需要一个动态的数据结构 我正在查询的示例数据: 表1 NameA Red Green Blue 表2 NameA NameB Red A Red B Red C Blue D Blue E Green F 表3 NameA NameC Red One Blue Two Blue Three Blue Four Blue

我有几个SQL表,其中一些是链接的,我想查询一次并存储在单个变量中。我不能提前预测数据的长度,所以我需要一个动态的数据结构

我正在查询的示例数据:

表1

NameA
Red
Green
Blue
表2

NameA   NameB
Red     A
Red     B
Red     C
Blue    D
Blue    E
Green   F
表3

NameA   NameC
Red     One
Blue    Two
Blue    Three
Blue    Four
Blue    Five
Green   Six
Green   Seven
我需要能够根据NameA值过滤和访问NameB和NameC。我更喜欢嵌套字典结构,在这里我可以进行如下查询:

Table1("0") 'will equal "Red"
Table2("Red")("0") 'will equal "A"
Table2("Blue")("1") 'will equal "E"
Table3("Green")("1") 'will equal "Seven"
'note: point here is data structure, not order of results
我曾尝试使用VBA的嵌套字典,但无法回避“深度复制”功能的不足。我写的一个算法:

With SqlQueryResult
    i = 0
    Do Until .EOF
        Call Table1.Add(CStr(i), .Fields(0).Value)
        i = i + 1
        .MoveNext
    Loop
End With

For Each key In Table1.Keys
    SqlQueryResult = GetResultsFromQuery(SELECT NameB WHERE NameA = Table1(key))
    With SqlQueryResult
        i = 0
        Do Until .EOF
            Call TempDict.Add(CStr(i), .Fields(0).Value)
            i = i + 1
            .MoveNext
        Loop
    End With

    Set Table2(Table1(key)) = TempDict
    TempDict.RemoveAll
Next key
不幸的是,将一个Dict分配给另一个Dict只会设置一个引用,实际上不会复制数据——当我删除TempDict时,表2中的嵌套数据也会被删除

我也不能在嵌套结构中为每个“分支”创建新的字典,因为我需要这些数据在模块级范围中可用,因此需要在程序执行之前在模块顶部定义这些数据

我已经研究过多维动态数组——它们不能像字典一样分配给父结构。我也无法预测每个表的大小,例如表1的大小可能为5/20/100/etc,表2中红色可能为2/5/100/etc,蓝色可能为1/20/etc。Redim仅适用于阵列中的单个维度

我也简要地看了一下这些收藏品,我不确定它们是否可行


我对类没有太多的经验,我宁愿避免一个非常复杂的过程——我希望它能够很容易地将链接和未链接的数据(即链接到表1的数据,如表2和表3,而不是与任何其他表无关的独立数据)添加到我将来需要的程序中。(我的“easy”基准是python中的熊猫数据帧)

一个简单的包装类,用于编写实现克隆方法的脚本字典。这应该可以很好地处理基本数据类型

Option Explicit

Private Type State

    Dict                               As scripting.Dictionary

End Type



Private s                              As State

Private Sub Class_Initialize()

    Set s.Dict = New scripting.Dictionary

End Sub


Public Function Clone()

    Dim myClone As scripting.Dictionary
    Set myClone = New scripting.Dictionary

    Dim myKey As Variant
    For Each myKey In s.Dict

        myClone.Add myKey, s.Dict.Item(myKey)

    Next

    Set Clone = myClone

End Function


Public Property Get Item(ByVal Key As Variant) As Variant
    Item = s.Dict.Item(Key)
End Property

Public Property Set Item(ByVal Key As Variant, ByVal Value As Variant)
    s.Dict.Item(Key) = Value
End Property


Public Sub Add(ByVal Key As Variant, ByVal Item As Variant)
    s.Dict.Add Key, Item
End Sub
你现在可以说

Set Table2.Item(Table1.Item(key)) = TempDict.Clone

我想到了一个字典,它将表A中的键和CSV数组作为项,如Red=“A,One”。然后,您可以像拆分(红色)(0)或拆分(红色)(1)那样处理每个项目。这个想法对您有用吗?为实现克隆方法的脚本字典创建包装器类是一项非常简单的任务。即使并没有包装器类,您仍然可以提取键和值的数组并使用它们。@Variatus在本例中实际可以工作,是的,它很好而且简单。然而,我也不确定将来是否需要加入3+嵌套级别,而不是现在的2,我认为这种方法无法适应。我不得不用谷歌搜索一下如何使用它,然后由于出现了一些错误,又被困了几分钟(“字典”)在克隆函数中拼写错误)。嵌套的字典看起来像我需要的那样保存着数据-非常感谢。很抱歉错卖了。我的手指-大脑界面显示出它的年龄。。。。