首页 > 解决方案 > 如何在 VBA Excel 中创建多列字典并从中获取数据

问题描述

我想将以下结构的字典表加载到数组(字典?UDT 类?),说“dictCompany”,CompanyName 是唯一键。

CompanyName | PersonName | PersonPhone
ABC Ltd     | Nick       | +12345
XYZ Co      | Alice      | +78901

然后我需要按 CompanyName 查找条目并引用其他列,如 dictCompany.PersonName 或 dictCompany.PersonPhone,类似于以下伪代码:

Dim i as Long
Dim dictIndex as Long
 
For i = 0 To UBound(dictCompany)
    If dictCompany(i).CompanyName = "ABC Ltd" Then
        dictIndex = i
    End If
Next i

debug.print dictCompany(dictIndex).PersonName 'should get "Nick"
debug.print dictCompany(dictIndex).PersonPhone 'should get "+12345"

我不知道要使用什么技术 - 数组、字典、UDT 类或 VBA 具有的任何技术,所以我会很感激带有关键字的定向答案以进行进一步搜索。

标签: excelvbadictionary

解决方案


创建一个名为的类clsPerson,并在您的类中放置以下内容:

Public PersonName as String, PersonPhone as String, CompanyName as String

然后在加载字典的模块中使用:

Option Explicit
Public Sub Demo()
    Dim dictCompany As Object
    Dim Emp As clsPerson
    Dim i As Long

    Set dictCompany = CreateObject("Scripting.Dictionary")

    ' Load Data into Dictionary
    For i = 2 To 3
        Set Emp = New clsPerson

        Emp.CompanyName = Range("A" & i).Value2
        Emp.PersonName = Range("B" & i).Value2
        Emp.PersonPhone = Range("C" & i).Value2
        
        If dictCompany.Exists(i) Then
            Set dictCompany(i) = Emp
        Else
            dictCompany.Add i, Emp
        End If
    Next i

    ' Read back
    For i = 2 To 3
        If dictCompany(i).CompanyName = "ABC Ltd" Then
            Debug.Print dictCompany(i).PersonName 'should get "Nick"
            Debug.Print dictCompany(i).PersonPhone 'should get "+12345"
            Exit For
        End If
    Next i

End Sub

您也可以对此进行扩展以使用公司名称作为您的密钥或使用集合而不是字典


推荐阅读