2011-12-30 85 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方法返回的內容),所以唯一的解決方案是編寫自己的庫。