【问题标题】:Using Dictionary Object in Excel VBA在 Excel VBA 中使用字典对象
【发布时间】:2011-10-13 15:08:47
【问题描述】:

我正在努力使我的 Dictionary 对象能够返回所选参考编号的经济详细信息。

例如我有以下参考编号和相应的值,但是,不确定我是否可以使用 Dictionary object 来实现这一点,另外,建议将不胜感激。

Ref No  Amount Price   Year
IB1232  1000   1.23    2011
IB1231  1000   3.23    2011
IB1233  1000   3.43    2011
IB1234  1000   3.43    2011

我以为可以通过形成Key和Value来实现参考以及它们对应的细节,但是没能实现..

【问题讨论】:

  • Ref No、Amount、Price 和 Year 是否是单独的列(如 A:D)?你想取回什么数据?这可能是您可以使用 VLookup 的情况(例如,如果您有一个参考编号,并且您想在数据表中查找它并返回金额)。
  • 对于 VBA 中的字典结构本身,请参阅this SO 文章。

标签: excel vba


【解决方案1】:

我不知道您在 VBA 中指的是什么字典,因为具有上述功能的数据结构在 VBA 中称为Collection(但也许您编写了自己的字典,在这种情况下我们需要代码以便能够帮助您)。

如果我的示例正确,您希望通过密钥“IB1232”访问例如 {1000,1.23,2011}。您可以通过创建这样的集合来轻松做到这一点:

Dim coll as new Collection
Dim data as new Collection

data.Add 1000
data.Add 1.23
data.Add 2011

coll.Add data, "IB1232"

要访问您的数据,只需通过密钥获取所需的记录(集合)

Debug.Print coll.Item("IB1232")(1) 'Prints 1000
Debug.Print coll.Item("IB1232")(2) 'Prints 1.23
Debug.Print coll.Item("IB1232")(3) 'Prints 2010

您还可以对数据使用 Variants 数组

【讨论】:

  • 您好,非常感谢您的快速响应 - 是的,我指的是 VBA 中的 Dictionary 对象 - 我不能通过 Excel / VBA 使用 Dict 对象来实现您的示例。
【解决方案2】:

@das_weezul

脚本库中的 VBA 中有一个 Dictionary 对象(您需要添加该引用才能使用它)。 Dictionary 有一些额外的功能,例如在尝试访问密钥之前检查密钥是否存在的能力。

@Sky 科布

是的,您可以使用 Dictionary 完成上述所有任务。语法将相同,只是您应该为添加到其中的每个项目提供一个密钥。

【讨论】:

  • 与Collection 的合作非常成功 - 工作得非常好并且得到了加速的结果。
【解决方案3】:

如前所述,您需要启用引用才能获取 Dictionary 对象,但它绝对存在。添加参考:Tools > References > [x] Microsoft Scripting Runtime

Public Sub test_dict()
    Dim td As Object
    Set td = New Dictionary

    td("IB1232") = "1000   1.23    2011"
    td("IB1233") = "1000   3.43    2011"

    'Another way to do it, may be around for legacy support
    td.Item("IB1234") = "1000   3.43    2011"

    'What you probably want... a key:value dictionary where the value is a collection
    Set td("IB1231") = New Collection
    td("IB1231").add 1000
    td("IB1231").add 3.23
    td("IB1231").add 2011


    'Get value by key
    Debug.Print td("IB1234")

    'Get a collection's value.... it's 1-indexed
    Debug.Print td("IB1231")(1)

    'Test if a key exists
    Debug.Print td.exists("IB12345")

    'See how many items there are
    Debug.Print td.Count()

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2012-06-01
    相关资源
    最近更新 更多