无法在VBA中迭代Hashtable(Excel)

时间:2011-12-30 09:20:07

标签: vba hashtable

我正在使用Hashtable(引用了mscorlib.dll)。我用数据填充它,我可以得到任何项目(只要我将请求类型转换为与哈希表中存储的完全相同的类型),。CONTinsValue / Key - 一切正常。但我不能通过For Each循环遍历它。 我已经尝试了我可以在互联网上找到的所有方法(对于每个元素......,其中元素是DictionaryEntry,通过GetEnumerator),但没有一个工作 - 我可以通过枚举器滚动表,但我无法到达密钥也没有迭代器定位的值。我究竟做错了什么? 我通过设置数字键并迭代这些数字暂时解决了它,但它不起作用,因为最后会有两次相同的数字......

P.S。:我不能使用Dictionary而不是Hashtable,因为我需要ContainsKey和ContainsValue,并且能够通过键或值检索项目。

编辑:我当前的代码(我要找的是替换“For i”循环,所以我不需要键就可以成为我已经知道的数字)

For i = 1 To UBound(rands)
        chopped_yes = Split(ThisWorkbook.Worksheets(1).Range("Z" & rands(i)))
        chopped_no = Split(ThisWorkbook.Worksheets(1).Range("AA" & rands(i)))
        chopped_any = Split(ThisWorkbook.Worksheets(1).Range("AB" & rands(i)))
        For Each part In chopped_yes
            If rules_yes.ContainsValue(cscs.item(CLng(rands(i)))) Then
                validcsc = 0
                GoTo WriteIt
            End If
        Next part
        For Each part In chopped_no
            If rules_no.ContainsValue(cscs.item(CLng(rands(i)))) Then
                validcsc = 0
                GoTo WriteIt
            End If
        Next part
        For Each part In chopped_any
        pepa = cscs.item(CLng(rands(i)))
        chopped_pepa = Split(pepa, "=")
            If rules_any.ContainsValue(CStr(chopped_pepa(0))) Then
                validcsc = 0
                GoTo WriteIt
            End If
        Next part
    Next i

代码的作用:


cscs散列表包含关键字/ option_value对,某些关键字与其他关键字冲突,hashtables rules_any / yes / no包含冲突的关键字,如果选中的是关键字= YES / NO / SOMETHING并将validcsc设置为0(也称为无效组合)关键字)。


rands是唯一数字的数组 - 麻烦的是如果有多个冲突关键字,那么我没有任何数字可以设置为密钥,我稍后会知道并使用它来迭代

2 个答案:

答案 0 :(得分:5)

实际上有一种方法可以从VBA浏览.NET哈希表:

Dim hash As mscorlib.Hashtable
Set hash = New mscorlib.Hashtable

Call hash.Add("foo", "bar")
Call hash.Add(4, 8)

Dim keys As IEnumerable
Set keys = hash.keys

Dim key As Variant
For Each key In keys

    Dim value As Variant

    value = hash.Item(key)
Next

主要问题是将“Keys”属性的返回值“转换”为IEnumerable 之前在“for each”循环中使用它。 VBA无法从头开始处理多个接口继承:在调用函数/属性之前,必须强制转换为函数/属性所属的接口。

答案 1 :(得分:1)

VBA无法处理DictionaryEntry类型(哈希表的元素)或ICollection类型(这就是.Keys方法返回的内容),所以只有解决方案就是编写自己的库。