Excel精英培训网

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

[已解决]表2里的数据在表1数据里有的,就保留下来,没有的就删除;表1里有的数据在表2中没有的

[复制链接]
发表于 2011-12-23 07:13 | 显示全部楼层 |阅读模式
表2里的数据在表1数据里有的,就保留下来,没有的就删除;表1里有的数据在表2中没有的,添加到表2中去。该题用VLOOKUP做在数据量少时,比较快,但数据达到2万行以上时,对其操作就非常慢。请大家帮忙,谢谢!效果如下图


最佳答案
2011-12-23 08:51
梳理数据.rar (25.05 KB, 下载次数: 57)
fly_pic.jpg

Book1.rar

18.53 KB, 下载次数: 24

发表于 2011-12-23 08:51 | 显示全部楼层    本楼为最佳答案   
梳理数据.rar (25.05 KB, 下载次数: 57)
回复

使用道具 举报

发表于 2011-12-23 09:00 | 显示全部楼层
{:3912:}我也来一个,哈哈!
  1. Sub aa()
  2.     Dim d1 As Object, d2 As Object
  3.     Dim arr1, arr2
  4.     Dim arr(1 To 30000, 1 To 4)
  5.     Dim i&, j&
  6.     Application.ScreenUpdating = False
  7.     Set d1 = CreateObject("scripting.dictionary")
  8.     Set d2 = CreateObject("scripting.dictionary")
  9.     arr1 = Sheet1.Range("A1").CurrentRegion
  10.     arr2 = Sheet2.Range("A1").CurrentRegion
  11.     For i = 2 To UBound(arr1)
  12.         d1(arr1(i, 1)) = arr1(i, 2) & vbTab & arr1(i, 3)
  13.     Next i
  14.     For i = 2 To UBound(arr2)
  15.         If d1.exists(arr2(i, 2)) Then
  16.             j = j + 1
  17.             d2(arr2(i, 2)) = ""
  18.             arr(j, 1) = arr2(i, 1)
  19.             arr(j, 2) = arr2(i, 2)
  20.             arr(j, 3) = arr2(i, 3)
  21.             arr(j, 4) = arr2(i, 4)
  22.         End If
  23.     Next i
  24.     Erase arr2
  25.     Set d1 = Nothing
  26.     For i = 2 To UBound(arr1)
  27.         If Not d2.exists(arr1(i, 1)) Then
  28.             j = j + 1
  29.             arr(j, 2) = arr1(i, 1)
  30.             arr(j, 3) = arr1(i, 2)
  31.             arr(j, 4) = arr1(i, 3)
  32.         End If
  33.     Next i
  34.     Erase arr1
  35.     Set d2 = Nothing
  36.     Sheets.Add(, Sheets(Sheets.Count)).Name = "NEW"
  37.     Range("A1").Resize(, 4) = [{"月份","编号","学生","成绩"}]
  38.     Range("A2").Resize(UBound(arr), 4) = arr
  39.     Application.ScreenUpdating = True
  40. End Sub
复制代码


Book1.rar

29.59 KB, 下载次数: 12

点评

字典功能很强大,学习!!  发表于 2011-12-23 19:31
回复

使用道具 举报

 楼主| 发表于 2011-12-23 20:52 | 显示全部楼层
zjdh 发表于 2011-12-23 08:51

字典刚刚接触一点点,我对您的代码的理解不知道对不对,请zjdh看下,谢谢!!

Sub test()
    ARR = Range("A2:C" & Range("A65536").End(3).Row) '把表1的数据存入数组ARR
    Set D = CreateObject("scripting.dictionary") '创建一个字典
    For I = 1 To UBound(ARR)
        If ARR(I, 1) <> "" Then '如果表1中的编号不为空,那么把表1中的每列的数据连接起来赋值给CJ
            CJ = "|" & ARR(I, 1) & "|" & ARR(I, 2) & "|" & ARR(I, 3)
            
            '问题中要求:表1里有的数据在表2中没有的,添加到表2中去。以下代码就实现了把表1里的数据添加到字典,把表2中的数据在表1中存在的数据再次添加到字典
            If Not D.exists(ARR(I, 1)) Then '如果字典中不存在表1中的编号,那么在字典中添加关键字(即编号)和Item(即每列连接起来的数据CJ)
                D.Add ARR(I, 1), CJ '当I=1时在字典中存在的样式如:Key为X10001,Item为|X10001|A|100
            End If
        End If
    Next
    BRR = Sheets("表2").Range("A2:D" & Sheets("表2").Range("A65536").End(3).Row) '把表2的数据存入数组BRR
    For I = 1 To UBound(BRR)
        If BRR(I, 2) <> "" Then '如果表2中的编号不空,那么将表2中的每列数据连接起来赋值给CJ
            CJ = BRR(I, 1) & "|" & BRR(I, 2) & "|" & BRR(I, 3) & "|" & BRR(I, 4)
            If D.exists(BRR(I, 2)) Then '此时的字典已是存入了表1数据的字典,如果字典中存在表2的编号。
                D(BRR(I, 2)) = CJ '那么就将表2的每列连接起来的数据赋给字典关键字为表2编号Item项。此项功能是把表2中的数据在表1中存在的数据,全部赋给字典
            End If
        End If
    Next
    S = D.ItemS '把字典的Item项的值全部赋给数组S
    ReDim CRR(1 To UBound(S) + 1, 1 To 4) '重新定义一个CRR数组
    For I = 0 To UBound(S)
        For J = 1 To 4
            CRR(I + 1, J) = Split(S(I), "|")(J - 1) '将原来每行连接起来的数据依次分出来,赋给数据CRR
        Next
    Next
    Sheets("表2").Range("A2:D" & Range("A65536").End(3).Row + 1).ClearContents '清空表2的数组
    Sheets("表2").Range("A2").Resize(UBound(CRR), 4) = CRR '把数组CRR填充至表2
End Sub

回复

使用道具 举报

发表于 2011-12-23 21:08 | 显示全部楼层
注释得很好,这一句再作点说明:
D(BRR(I, 2)) = CJ
是刷新字典相关Item项,因为这里的CJ包含月份。
回复

使用道具 举报

 楼主| 发表于 2011-12-23 21:15 | 显示全部楼层
zjdh 发表于 2011-12-23 21:08
注释得很好,这一句再作点说明:
D(BRR(I, 2)) = CJ
是刷新字典相关Item项,因为这里的CJ包含月份。

字典功能很强大,努力学习,谢谢您!
回复

使用道具 举报

发表于 2011-12-24 15:34 | 显示全部楼层
不错,呵呵学习一了,
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 20:15 , Processed in 4.331710 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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