带复合键的VBA字典

带复合键的VBA字典,vba,dictionary,tuples,Vba,Dictionary,Tuples,VBA中是否有类似于Python的允许使用元组作为键的结构?我希望在一个关联数组中存储一个大的值矩阵,并通过两个维度中的键名进行索引 编辑: 下面是一个简单数据表的示例: +--------+--------+--------+--------+--------+ | | City 1 | City 2 | City 3 | City 4 | +--------+--------+--------+--------+--------+ | City 1 | 0 | 7

VBA中是否有类似于Python的允许使用元组作为键的结构?我希望在一个关联数组中存储一个大的值矩阵,并通过两个维度中的键名进行索引

编辑:

下面是一个简单数据表的示例:

+--------+--------+--------+--------+--------+ | | City 1 | City 2 | City 3 | City 4 | +--------+--------+--------+--------+--------+ | City 1 | 0 | 7 | 8 | 6 | | City 2 | | 0 | 1 | 6 | | City 3 | | | 0 | 5 | | City 4 | | | | 0 | +--------+--------+--------+--------+--------+ 我将通过如下方式访问城市1和城市2之间的距离:

Distance("City 1", "City 2")

如果您使用的是Excel,我建议您使用一个函数,在任何单元格中,您都可以通过一个简单的fornula(例如
=Distance(“ct1”、“ct2”)
)找到您的值:

其功能是:

Public Function Distance(RowCity As String, ColCity As String) As String
    Dim RowNo As Long, ColNo As Long
    RowNo = 0: ColNo = 0

    On Error Resume Next
    With ActiveSheet
        RowNo = .Columns("A").Find(What:=RowCity).Row
        ColNo = .Rows(1).Find(What:=ColCity).Column

        If RowNo <> 0 And ColNo <> 0 Then
            Distance = Trim(.Cells(RowNo, ColNo).Value & " ")
        Else
            Distance = "#N/A"
        End If
    End With
End Function

AFAIK,否。特定
的每个
项都可以是数组,但不能是键本身。或者我误解了你的问题?不,你没有。实际上,我只需要一个long或double,但是我想要一个复合键。我知道我可以使用二维数组和整数索引,但我希望使用字符串。基本上,我有一个巨大的城市之间的距离矩阵,我想存储在一个数组状的结构。因此,我希望能够访问,比如说,距离(“西雅图”、“芝加哥”)。我现在很困惑你能举例说明吗?你需要输入字典的数据?进入
,作为
。请参见编辑。关键点是城市对,项目是距离。那么十字路口包含的距离正确吗?谢谢你的回复!实际上,我不想在工作表中使用它。我主要关心的是这里的读取速度,因为在我的脚本编写过程中,这个值矩阵将被访问数百万次。@AustinWismer我不知道你的矩阵在哪里,也不知道你是如何填写的,但正如我所说的:如果你将矩阵存储在Excel表格中,它可以给你一个非常好的速度;)。基本上,我有一个存储在工作表中的值矩阵。为了加快访问速度,我想从电子表格中读取此矩阵,并将其存储为数组。由于在整个脚本执行过程中,该矩阵的值将被访问数百万次,因此每次从数组中读取这些值比从电子表格中读取要快得多。我的问题是是否有办法将它们存储在关联数组中,其中每个值(项)都可以有由多个值组成的键(例如元组)。@AustinWismer我找到了一种可以在VBA中使用的字典类型;)。我熟悉脚本字典,但我不相信它允许复合键,是吗?我最终使用了一个字典,但我将每个城市的两个字符串连接成了一个键。
Public Function Distance(RowCity As String, ColCity As String) As String
    Dim RowNo As Long, ColNo As Long
    RowNo = 0: ColNo = 0

    On Error Resume Next
    With ActiveSheet
        RowNo = .Columns("A").Find(What:=RowCity).Row
        ColNo = .Rows(1).Find(What:=ColCity).Column

        If RowNo <> 0 And ColNo <> 0 Then
            Distance = Trim(.Cells(RowNo, ColNo).Value & " ")
        Else
            Distance = "#N/A"
        End If
    End With
End Function
Dim dict As Object
Dim key As Variant

Set dict = CreateObject("Scripting.Dictionary")

dict.Add "City 1", "City 2"

For Each key In dict.Keys
    If key = condiction Then
        'use dict.Item(key)
    End If
Next key