2016-06-15 210 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我看,更聪明的做法! –