gpt4 book ai didi

excel - 在 VBA 中使用 .NET HashTable 返回类型

转载 作者:行者123 更新时间:2023-12-04 19:55:50 25 4
gpt4 key购买 nike

我在 VB.NET 中创建了一个 .NET 库,其中有一个函数返回 HashTable 的对象。

我一直在寻找如何在 Excel VBA 中访问 HashTable 对象中的元素,但找不到解决方案。我是 VBA 的新手,所以请原谅。我已经搜索过,但找不到出路。

例如,经过这样的事情,我不知道如何访问数据。

   Dim hashData As Object
Set hashData = obj.getHashData

请帮忙

最佳答案

Dim hashData As Object
Set hashData = obj.getHashData

如果 getHashData 返回一个 HashTable,那么 hashData 就是一个后期绑定(bind)的 HashTable,您可以调用它的 members ,包括它的Item property :

Dim value As Variant
value = hashData.Item("key")

您不会对针对 Object 的后期绑定(bind)成员调用进行编译时验证,因此您需要特别注意拼写错误,因为 Option Explicit 不能在涉及后期绑定(bind)时拯救你。请参阅上面链接的 HashTable 文档,了解您可以调用哪些成员。

添加对 mscorlib.tlb 的引用(您将在 C:\Windows\Microsoft.NET\Framework\v4.0.30319 下找到它,或引用等效项来自 \Framework64 如果您的 Excel 是 64 位的 - 库的位数需要与主机应用程序的位数相匹配)通常允许早期绑定(bind),但是虽然这个库是 COM 可见的,但它的目的是从托管 (.net) 代码中使用,因此您从接口(interface)访问这些对象 - 具体类型不直接公开任何成员:

object browser showing no members for Hashtable class

知道 Hashtable 实现了 IDictionary 接口(interface),我们可以使用早期绑定(bind)并获得编译时验证和 IntelliSense 如果我们声明 hashData As IDictionary:

Dim hashData As mscorlib.IDictionary
Set hashData = New mscorlib.Hashtable
hashData.Add "foo", 42
Debug.Print hashData.Item("foo") 'prints 42

请注意,Item 属性作为默认成员公开:

members of IDictionary

这意味着您可以隐式调用 Item 成员,就像您对任何标准 VBA 集合对象所做的那样:

Dim hashData As mscorlib.IDictionary
Set hashData = New mscorlib.Hashtable
hashData.Add "foo", 42
Debug.Print hashData("foo") 'prints 42

早期绑定(bind)代码更容易编写,尤其是当您不熟悉所涉及的类型时。但是,如果项目引用 64 位框架并且您的宏需要在 32 位 Excel 上运行,您将希望坚持后期绑定(bind)以避免绑定(bind)问题。

另请注意,由于枚举器在 VBA 中的工作方式与它们在 .NET 中的工作方式不同,因此使用 For Each 循环迭代 Hashtable 对象是行不通的; KeysValues 集合是实现 ICollection 接口(interface)的对象,因此对它们进行迭代也很重要:For Each 循环将不起作用,虽然您可以设置 For i = 0 To hashData.Keys.Count - 1,但您无法获取索引 i 处的项目 来自 ICollection

但我们知道 ICollection 继承了 IEnumerable,并且 IEnumerable 确实For Each< 一起工作,因此我们可以Keys 集合转换为IEnumerable,并像这样迭代所有键和值:

Dim hashData As mscorlib.IDictionary
Set hashData = obj.getHashData

Dim hashKeys As mscorlib.IEnumerable
Set hashKeys = hashData.Keys

Dim k As Variant
For Each k In hashKeys
Debug.Print k, hashData(k) 'outputs the key and its associated value
Next

问题是您不能使用后期绑定(bind)代码或不引用 mscorlib.tlb 将其转换IEnumerable,并且后期绑定(bind)以某种方式看不到 GetEnumerator 成员,因此这会引发错误 438:

Dim hashKeys As Object
Set hashKeys = hashData.Keys

Dim k As Variant
For Each k In hashKeys ' error 438, hashKeys isn't exposing the enumerator
Debug.Print k, hashData(k)
Next

结论:如果您需要 VBA 代码在 32 位和 64 位主机上运行,​​您将不得不跳过各种步骤才能使后期绑定(bind)代码正常工作。如果您在 64 位主机上,我建议尽早使用 64 位框架,并为 32 位主机分发引用 32 位框架的宏的单独副本。分发有点麻烦,但比让后期绑定(bind)代码工作要轻松一些。

关于excel - 在 VBA 中使用 .NET HashTable 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com