Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2155|回复: 9

[已解决]VBA字典求解!

[复制链接]
发表于 2013-5-8 21:48 | 显示全部楼层 |阅读模式
问题如表,求高手指点!深表感谢!
最佳答案
2013-5-8 22:24
对于实际应用中如果列数不一致,做下判断。
  1. Sub test()
  2. '---------------------------------------------------------------------------------------
  3. ' Procedure : test
  4. ' Author    : hwc2ycy
  5. ' Date      : 2013/5/8
  6. ' Purpose   : 把每行数据转化为字符串作为KEY,以数组形式做为ITEM值存入字典,实现查找相同行
  7. '---------------------------------------------------------------------------------------
  8. '
  9.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  10.     Dim key1
  11.     arrA = Range("a2:f6")
  12.     arrB = Range("h2:m5")
  13.    
  14.     If UBound(arrA, 2) <> UBound(arrB, 2) Then MsgBox "数据列数不一致", vbCritical: Exit Sub
  15.    
  16.     Dim objDicA As Object, objDicB As Object
  17.     Set objDicA = CreateObject("scripting.dictionary")
  18.     Set objDicB = CreateObject("scripting.dictionary")
  19.     For i = LBound(arrA) To UBound(arrA)
  20.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  21.         strTemp = Join(arrTemp, "#")
  22.         objDicA(strTemp) = arrTemp
  23.     Next

  24.     For i = LBound(arrB) To UBound(arrB)
  25.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  26.         strTemp = Join(arrTemp, "#")
  27.         objDicB(strTemp) = arrTemp
  28.     Next

  29.     i = Cells(Rows.Count, "o").End(xlUp).Row
  30.     If i > 1 Then Range("o2:t" & i).ClearContents

  31.     Application.ScreenUpdating = False
  32.     For Each key1 In objDicA.Keys
  33.         If objDicB.exists(key1) Then
  34.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, UBound(arrA, 2)) = objDicA(key1)
  35.         End If
  36.     Next
  37.     Set objDicA = Nothing
  38.     Set objDicB = Nothing
  39.     Application.ScreenUpdating = True
  40.     MsgBox "查找完成"
  41. End Sub

  42. Sub test2()
  43. '---------------------------------------------------------------------------------------
  44. ' Procedure : test2
  45. ' Author    : hwc2ycy
  46. ' Date      : 2013/5/8
  47. ' Purpose   :把每行数据转化为字符串作为KEY,把数组所在行做为ITEM值存入字典,实现查找相同行
  48. '---------------------------------------------------------------------------------------
  49. '
  50.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  51.     Dim key1
  52.    
  53.     arrA = Range("a2:f6")
  54.     arrB = Range("h2:m5")
  55.     If UBound(arrA, 2) <> UBound(arrB, 2) Then MsgBox "数据列数不一致", vbCritical: Exit Sub
  56.    
  57.     Dim objDicA As Object, objDicB As Object
  58.     Set objDicA = CreateObject("scripting.dictionary")
  59.     Set objDicB = CreateObject("scripting.dictionary")
  60.     For i = LBound(arrA) To UBound(arrA)
  61.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  62.         strTemp = Join(arrTemp, "#")
  63.         objDicA(strTemp) = i
  64.     Next

  65.     For i = LBound(arrB) To UBound(arrB)
  66.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  67.         strTemp = Join(arrTemp, "#")
  68.         objDicB(strTemp) = i
  69.     Next

  70.     i = Cells(Rows.Count, "o").End(xlUp).Row
  71.     If i > 1 Then Range("o2:t" & i).ClearContents

  72.     Application.ScreenUpdating = False
  73.     For Each key1 In objDicA.Keys
  74.         If objDicB.exists(key1) Then
  75.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, UBound(arrA, 2)) = WorksheetFunction.Index(arrA, objDicA(key1), 0)
  76.         End If
  77.     Next
  78.     Set objDicA = Nothing
  79.     Set objDicB = Nothing
  80.     Application.ScreenUpdating = True
  81.     MsgBox "查找完成"
  82. End Sub
复制代码

新建 Microsoft Office Excel 工作表.rar

3.68 KB, 下载次数: 7

发表于 2013-5-8 22:00 | 显示全部楼层
回复

使用道具 举报

发表于 2013-5-8 22:13 | 显示全部楼层
  1. Sub test()
  2.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  3.     Dim key1
  4.     arrA = Range("a2:f6")
  5.     arrB = Range("h2:m5")
  6.    
  7.     Dim objDicA As Object, objDicB As Object
  8.     Set objDicA = CreateObject("scripting.dictionary")
  9.     Set objDicB = CreateObject("scripting.dictionary")
  10.     For i = LBound(arrA) To UBound(arrA)
  11.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  12.         strTemp = Join(arrTemp, "#")
  13.         objDicA(strTemp) = arrTemp
  14.     Next

  15.     For i = LBound(arrB) To UBound(arrB)
  16.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  17.         strTemp = Join(arrTemp, "#")
  18.         objDicB(strTemp) = arrTemp
  19.     Next
  20.    
  21.     i = Cells(Rows.Count, "o").End(xlUp).Row
  22.     If i > 1 Then Range("o2:t" & i).ClearContents
  23.    
  24.     Application.ScreenUpdating = False
  25.     For Each key1 In objDicA.Keys
  26.         If objDicB.exists(key1) Then
  27.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, 6) = objDicA(key1)
  28.         End If
  29.     Next
  30.     Set objDicA = Nothing
  31.     Set objDicB = Nothing
  32.     Application.ScreenUpdating = True
  33.     MsgBox "查找完成"
  34. End Sub
复制代码
回复

使用道具 举报

发表于 2013-5-8 22:19 | 显示全部楼层
  1. Sub test()
  2. '---------------------------------------------------------------------------------------
  3. ' Procedure : test
  4. ' Author    : hwc2ycy
  5. ' Date      : 2013/5/8
  6. ' Purpose   : 把每行数据转化为字符串作为KEY,以数组形式做为ITEM值存入字典,实现查找相同行
  7. '---------------------------------------------------------------------------------------
  8. '
  9.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  10.     Dim key1
  11.     arrA = Range("a2:f6")
  12.     arrB = Range("h2:m5")

  13.     Dim objDicA As Object, objDicB As Object
  14.     Set objDicA = CreateObject("scripting.dictionary")
  15.     Set objDicB = CreateObject("scripting.dictionary")
  16.     For i = LBound(arrA) To UBound(arrA)
  17.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  18.         strTemp = Join(arrTemp, "#")
  19.         objDicA(strTemp) = arrTemp
  20.     Next

  21.     For i = LBound(arrB) To UBound(arrB)
  22.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  23.         strTemp = Join(arrTemp, "#")
  24.         objDicB(strTemp) = arrTemp
  25.     Next

  26.     i = Cells(Rows.Count, "o").End(xlUp).Row
  27.     If i > 1 Then Range("o2:t" & i).ClearContents

  28.     Application.ScreenUpdating = False
  29.     For Each key1 In objDicA.Keys
  30.         If objDicB.exists(key1) Then
  31.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, 6) = objDicA(key1)
  32.         End If
  33.     Next
  34.     Set objDicA = Nothing
  35.     Set objDicB = Nothing
  36.     Application.ScreenUpdating = True
  37.     MsgBox "查找完成"
  38. End Sub

  39. Sub test2()
  40. '---------------------------------------------------------------------------------------
  41. ' Procedure : test2
  42. ' Author    : hwc2ycy
  43. ' Date      : 2013/5/8
  44. ' Purpose   :把每行数据转化为字符串作为KEY,把数组所在行做为ITEM值存入字典,实现查找相同行
  45. '---------------------------------------------------------------------------------------
  46. '
  47.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  48.     Dim key1
  49.     arrA = Range("a2:f6")
  50.     arrB = Range("h2:m5")

  51.     Dim objDicA As Object, objDicB As Object
  52.     Set objDicA = CreateObject("scripting.dictionary")
  53.     Set objDicB = CreateObject("scripting.dictionary")
  54.     For i = LBound(arrA) To UBound(arrA)
  55.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  56.         strTemp = Join(arrTemp, "#")
  57.         objDicA(strTemp) = i
  58.     Next

  59.     For i = LBound(arrB) To UBound(arrB)
  60.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  61.         strTemp = Join(arrTemp, "#")
  62.         objDicB(strTemp) = i
  63.     Next

  64.     i = Cells(Rows.Count, "o").End(xlUp).Row
  65.     If i > 1 Then Range("o2:t" & i).ClearContents

  66.     Application.ScreenUpdating = False
  67.     For Each key1 In objDicA.Keys
  68.         If objDicB.exists(key1) Then
  69.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, 6) = WorksheetFunction.Index(arrA, objDicA(key1), 0)
  70.         End If
  71.     Next
  72.     Set objDicA = Nothing
  73.     Set objDicB = Nothing
  74.     Application.ScreenUpdating = True
  75.     MsgBox "查找完成"
  76. End Sub
复制代码
回复

使用道具 举报

发表于 2013-5-8 22:20 | 显示全部楼层
查找相同行.rar (12.31 KB, 下载次数: 9)
回复

使用道具 举报

发表于 2013-5-8 22:21 | 显示全部楼层
Resize(, 6)可以改为resize(,ubound(arra,2))
回复

使用道具 举报

发表于 2013-5-8 22:24 | 显示全部楼层    本楼为最佳答案   
对于实际应用中如果列数不一致,做下判断。
  1. Sub test()
  2. '---------------------------------------------------------------------------------------
  3. ' Procedure : test
  4. ' Author    : hwc2ycy
  5. ' Date      : 2013/5/8
  6. ' Purpose   : 把每行数据转化为字符串作为KEY,以数组形式做为ITEM值存入字典,实现查找相同行
  7. '---------------------------------------------------------------------------------------
  8. '
  9.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  10.     Dim key1
  11.     arrA = Range("a2:f6")
  12.     arrB = Range("h2:m5")
  13.    
  14.     If UBound(arrA, 2) <> UBound(arrB, 2) Then MsgBox "数据列数不一致", vbCritical: Exit Sub
  15.    
  16.     Dim objDicA As Object, objDicB As Object
  17.     Set objDicA = CreateObject("scripting.dictionary")
  18.     Set objDicB = CreateObject("scripting.dictionary")
  19.     For i = LBound(arrA) To UBound(arrA)
  20.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  21.         strTemp = Join(arrTemp, "#")
  22.         objDicA(strTemp) = arrTemp
  23.     Next

  24.     For i = LBound(arrB) To UBound(arrB)
  25.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  26.         strTemp = Join(arrTemp, "#")
  27.         objDicB(strTemp) = arrTemp
  28.     Next

  29.     i = Cells(Rows.Count, "o").End(xlUp).Row
  30.     If i > 1 Then Range("o2:t" & i).ClearContents

  31.     Application.ScreenUpdating = False
  32.     For Each key1 In objDicA.Keys
  33.         If objDicB.exists(key1) Then
  34.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, UBound(arrA, 2)) = objDicA(key1)
  35.         End If
  36.     Next
  37.     Set objDicA = Nothing
  38.     Set objDicB = Nothing
  39.     Application.ScreenUpdating = True
  40.     MsgBox "查找完成"
  41. End Sub

  42. Sub test2()
  43. '---------------------------------------------------------------------------------------
  44. ' Procedure : test2
  45. ' Author    : hwc2ycy
  46. ' Date      : 2013/5/8
  47. ' Purpose   :把每行数据转化为字符串作为KEY,把数组所在行做为ITEM值存入字典,实现查找相同行
  48. '---------------------------------------------------------------------------------------
  49. '
  50.     Dim arrA, arrB, arrTemp, i As Long, strTemp$
  51.     Dim key1
  52.    
  53.     arrA = Range("a2:f6")
  54.     arrB = Range("h2:m5")
  55.     If UBound(arrA, 2) <> UBound(arrB, 2) Then MsgBox "数据列数不一致", vbCritical: Exit Sub
  56.    
  57.     Dim objDicA As Object, objDicB As Object
  58.     Set objDicA = CreateObject("scripting.dictionary")
  59.     Set objDicB = CreateObject("scripting.dictionary")
  60.     For i = LBound(arrA) To UBound(arrA)
  61.         arrTemp = WorksheetFunction.Index(arrA, i, 0)
  62.         strTemp = Join(arrTemp, "#")
  63.         objDicA(strTemp) = i
  64.     Next

  65.     For i = LBound(arrB) To UBound(arrB)
  66.         arrTemp = WorksheetFunction.Index(arrB, i, 0)
  67.         strTemp = Join(arrTemp, "#")
  68.         objDicB(strTemp) = i
  69.     Next

  70.     i = Cells(Rows.Count, "o").End(xlUp).Row
  71.     If i > 1 Then Range("o2:t" & i).ClearContents

  72.     Application.ScreenUpdating = False
  73.     For Each key1 In objDicA.Keys
  74.         If objDicB.exists(key1) Then
  75.             Cells(Rows.Count, "o").End(xlUp).Offset(1).Resize(, UBound(arrA, 2)) = WorksheetFunction.Index(arrA, objDicA(key1), 0)
  76.         End If
  77.     Next
  78.     Set objDicA = Nothing
  79.     Set objDicB = Nothing
  80.     Application.ScreenUpdating = True
  81.     MsgBox "查找完成"
  82. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-5-9 08:37 | 显示全部楼层
感谢hwc2ycy 班管用数组和字典方式的解答,非常感谢!

在实际应用中列数是一样的,只是行数有多有少,几万行是有的。

如果要改是否可将arrA = Range("a2:f20000")  arrB = Range("h2:m20000")  


   
回复

使用道具 举报

发表于 2013-5-9 09:49 | 显示全部楼层
可以。
回复

使用道具 举报

发表于 2013-5-9 09:50 | 显示全部楼层
区域是灵活的,输出益你也可以根据自己的需求改。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-8 10:57 , Processed in 0.517517 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表