2011-12-30 126 views
3

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

PS:我不能使用字典的Hashtable,因为我需要ContainsKey和ContainsValue,还能够通过键或值检索项目。

编辑:我当前的代码(我所追求的是,​​以取代“对于我”循环,所以我不需要钥匙是数字我已经知道)

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对,一些关键字与别人冲突,是散列表rules_any /是/否包含的关键字,冲突,如果所检查的一个是关键字= YES/NO /东西,并设置validcsc为0(也就是无效的关键字组合)。


兰特是唯一的数字阵列 - 麻烦的是,如果有一个以上的冲突关键字,那么我没有任何数字,可设置为关键,我稍后会知道并使用它来遍历

+0

你能否发表你的当前代码。 – brettdj 2011-12-30 09:36:52

+0

用我的代码更新了OP – Destabilizator 2011-12-30 09:49:02

+0

我最终编写了自己的库,因为VBA无法处理DictionaryEntry类型(散列表元素)或ICollection类型(这就是.Keys方法返回的结果)。 – Destabilizator 2012-01-06 07:32:18

回答

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 

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

+0

请注意,您必须在VBA项目中添加对mscorlib.dll的引用(浏览mscorlib.tlb)。 – omegastripes 2016-04-12 19:49:25

1

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