2016-06-15 208 views
1

我有一個VBA字典具有下列數據:循環通過EXCEL VBA字典

ID  NAME  POSITION 
5008004 John Doe 00120096 
5008002 John Doe2 00117886 
5010010 John Doe3 00117886 

我有一個Excel文件與以下細胞:

POSITION SUPERVISOR_NAME 
00117886 John Doe 
00117886 John Doe2 
00117886 John Doe3 

當前的Excel VBA代碼遍歷字典按以下方式:

If SUPERVISOR_NAME <> "" Then 
    For Each myKey In superDictionary.Keys 
      If superDictionary(myKey) = SUPERVISOR_NAME Then 
       SUPERVISOR_NAME = myKey 
       Exit For 
      End If 
     Next 
End If 

導致將JOHN DOE名稱替換爲其關聯ID無論如何。

問題:我該如何去取代JOHN DOE名稱及其關聯的ID,但只有當EXCEL的POSITION和SUPERVISOR_NAME匹配字典或ELSE時纔會提交。

+0

這是我不清楚你是如何加載字典。關鍵是ID和物品名稱?將它反轉並使用[Exists](https://msdn.microsoft.com/zh-cn/library/office/gg251562.aspx)方法是否更有意義? – Jeeped

回答

2

你的意思是這樣嗎?

假設你的上司的名字都在B列第2行開始:

Dim r As Long 
Dim supervisorName As Range 

For Each supervisorName In Range("B2:B" & Cells.(Rows.Count, 2).End(xlUp).Row).Cells 
    If superDictionary.Exists(supervisorName.Value) Then 
     r = 2 '// First row with data in 
     For Each key In superDictionary.Keys 
      If superDictionary(key) = supervisorName.Value And supervisorName.Row = r Then 
       supervisorName.Value = key 
       Exit For 
      Else 
       r = r + 1 
      End If 
     Next 
    End If 
Next 
3

它似乎並不像你合理利用的Scripting.Dictionary對象的最強大的功能之一;這是它的快速檢索功能。您基本上想要執行帶有兩列條件的查找,因此請使用兩列作爲您的key和ID作爲Item

dictionary_lookup

Option Explicit 

Sub supervisorIDs() 
    Dim d As Variant, dict As Object 
    Dim v As Long, vVALs As Variant 

    Set dict = CreateObject("Scripting.Dictionary") 
    dict.comparemode = vbTextCompare 'default is vbbinarycompare 

    With Worksheets("Sheet4") 
     'get values from worksheet 
     vVALs = .Range(.Cells(2, 1), .Cells(Rows.Count, 3).End(xlUp)).Value2 
     'build dictionary 
     For v = LBound(vVALs, 1) To UBound(vVALs, 1) 
      'overwrite method - faster (no error control) 
      'writes name&position as key, ID as item 
      dict.Item(Join(Array(vVALs(v, 2), vVALs(v, 3)), ChrW(8203))) = vVALs(v, 1) 
     Next v 

     'loop through the second table 
     For v = 2 To .Cells(Rows.Count, 6).End(xlUp).Row 
      d = Join(Array(.Cells(v, 6).Value2, .Cells(v, 5).Value2), ChrW(8203)) 
      If dict.exists(d) Then _ 
       .Cells(v, 7) = dict.Item(d) 
     Next v 
    End With 
End Sub 

dictionary_lookup_results

+1

我想OP只想從字典中替換單元格值,如果管理員名稱出現在表中與ID出現在字典中相同的位置。我可能是完全錯誤的,但... –

+0

不,聽起來不錯。爲了演示目的,我選擇將ID放入新列中。如果OP想要覆蓋,那麼他/她可以將7更改爲6. – Jeeped

+0

Aaaah我看,更聰明的做法! –