Excel精英培训网

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

[已解决]用代码方法查找两个工作表中相同和不相同的数据并在另外工作表列出

[复制链接]
发表于 2015-2-6 10:38 | 显示全部楼层 |阅读模式
如题,请教大师们编代码,因为我想用宏方法的,麻烦了,先谢谢。附件中《期中》、《期末》工作表为数据源,其他表为查找后列出结果

查找并列出相同不相同.zip (9.6 KB, 下载次数: 30)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-2-6 10:46 | 显示全部楼层
回复

使用道具 举报

发表于 2015-2-6 10:54 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2015-2-6 10:54 | 显示全部楼层
hwc2ycy 发表于 2015-2-6 10:46
这个直接用函数就能解决呀。

我就是想用宏的啊
回复

使用道具 举报

发表于 2015-2-6 11:26 | 显示全部楼层
本帖最后由 hwc2ycy 于 2015-2-6 11:32 编辑
  1. Sub demo()
  2.     Dim arrQz, arrQm
  3.     Dim dicQz As Object, dicQm As Object
  4.     Dim arrPos(1 To 3) As Long

  5.     '取期中,期末数据
  6.     '    arrQz = Worksheets("期中").UsedRange.Value
  7.     '    arrQm = Worksheets("期末").UsedRange.Value
  8.     With Worksheets("期中")
  9.         arrQz = .Range("a3:e" & .Cells(Rows.Count, 1).End(xlUp).Row)
  10.     End With
  11.     With Worksheets("期末")
  12.         arrQm = .Range("a3:e" & .Cells(Rows.Count, 1).End(xlUp).Row)
  13.     End With

  14.     '字典,存储学号与数据所在的行号
  15.     Set dicQz = CreateObject("scripting.dictionary")
  16.     Set dicQm = CreateObject("scripting.dictionary")
  17.     Dim i&
  18.     '结果数组
  19.     Dim arrQzQm1(1 To 500, 1 To 5), arrQzQm2(1 To 500, 1 To 5), arrQzonly(1 To 500, 1 To 5), arrQmonly(1 To 500, 1 To 5)

  20.     '存储相关数据到对应的字典中
  21.     For i = LBound(arrQz) To UBound(arrQz)
  22.         dicQz(arrQz(i, 1)) = i
  23.     Next
  24.     For i = LBound(arrQm) To UBound(arrQm)
  25.         dicQm(arrQm(i, 1)) = i
  26.     Next


  27.     Dim Keytmp, j&, k&, l&, m&
  28.     '遍历期中字典
  29.     For Each Keytmp In dicQz.keys
  30.         If dicQm.Exists(Keytmp) Then
  31.             '期中期末共有数据
  32.             arrPos(1) = arrPos(1) + 1
  33.             k = arrPos(1)    '结果数组行号
  34.             l = dicQz(Keytmp)    '期中数据行号
  35.             m = dicQz(Keytmp)    '期末数据行号
  36.             For j = LBound(arrQz, 2) To UBound(arrQz, 2)
  37.                 arrQzQm1(k, j) = arrQz(l, j)    '期中
  38.                 arrQzQm2(k, j) = arrQm(m, j)    '期末
  39.             Next
  40.             dicQm.Remove (Keytmp)    '删除期末共有的
  41.         Else
  42.             '期中独有
  43.             arrPos(2) = arrPos(2) + 1
  44.             k = arrPos(2)    '结果数组行号
  45.             l = dicQz(Keytmp)    '期中数据行号
  46.             For j = LBound(arrQz, 2) To UBound(arrQz, 2)
  47.                 arrQzonly(k, j) = arrQz(l, j)    '期中
  48.             Next
  49.         End If
  50.     Next
  51.     If dicQm.Count Then
  52.         '期末独有
  53.         For Each Keytmp In dicQm.keys
  54.             arrPos(3) = arrPos(3) + 1
  55.             k = arrPos(3)    '结果数组行号
  56.             l = dicQm(Keytmp)    '期末数据行号
  57.             For j = LBound(arrQm, 2) To UBound(arrQm, 2)
  58.                 arrQmonly(k, j) = arrQm(l, j)    '期末
  59.             Next
  60.         Next
  61.     End If
  62.     Application.ScreenUpdating = False
  63.     With Worksheets("期中期末共有")
  64.         .Range("a4").Resize(UBound(arrQzQm1), UBound(arrQzQm1, 2)).Value = arrQzQm1
  65.         .Range("g4").Resize(UBound(arrQzQm2), UBound(arrQzQm2, 2)).Value = arrQzQm2
  66.     End With
  67.     Worksheets("期中有期末没有").Range("a4").Resize(UBound(arrQzonly), UBound(arrQzonly, 2)).Value = arrQzonly
  68.     Worksheets("期末有期中没有").Range("a4").Resize(UBound(arrQmonly), UBound(arrQmonly, 2)).Value = arrQmonly
  69.     Application.ScreenUpdating = True
  70.     MsgBox "对比完成", vbInformation
  71. End Sub
复制代码
回复

使用道具 举报

发表于 2015-2-6 11:29 | 显示全部楼层
上面的有个数组名错了,更正
  1. Option Explicit

  2. Sub demo()
  3.     Dim arrQz, arrQm
  4.     Dim dicQz As Object, dicQm As Object
  5.     Dim arrPos(1 To 3) As Long

  6.     '取期中,期末数据
  7.     '    arrQz = Worksheets("期中").UsedRange.Value
  8.     '    arrQm = Worksheets("期末").UsedRange.Value
  9.     With Worksheets("期中")
  10.         arrQz = .Range("a3:e" & .Cells(Rows.Count, 1).End(xlUp).Row)
  11.     End With
  12.     With Worksheets("期末")
  13.         arrQm = .Range("a3:e" & .Cells(Rows.Count, 1).End(xlUp).Row)
  14.     End With

  15.     '字典,存储学号与数据所在的行号
  16.     Set dicQz = CreateObject("scripting.dictionary")
  17.     Set dicQm = CreateObject("scripting.dictionary")
  18.     Dim i&
  19.     '结果数组
  20.     Dim arrQzQm1(1 To 500, 1 To 5), arrQzQm2(1 To 500, 1 To 5), arrQzonly(1 To 500, 1 To 5), arrQmonly(1 To 500, 1 To 5)

  21.     '存储相关数据到对应的字典中
  22.     For i = LBound(arrQz) To UBound(arrQz)
  23.         dicQz(arrQz(i, 1)) = i
  24.     Next
  25.     For i = LBound(arrQm) To UBound(arrQm)
  26.         dicQm(arrQm(i, 1)) = i
  27.     Next


  28.     Dim Keytmp, j&, k&, l&, m&
  29.     '遍历期中字典
  30.     For Each Keytmp In dicQz.keys
  31.         If dicQm.Exists(Keytmp) Then
  32.             '期中期末共有数据
  33.             arrPos(1) = arrPos(1) + 1
  34.             k = arrPos(1)    '结果数组行号
  35.             l = dicQz(Keytmp)    '期中数据行号
  36.             m = dicQm(Keytmp)    '期末数据行号
  37.             For j = LBound(arrQz, 2) To UBound(arrQz, 2)
  38.                 arrQzQm1(k, j) = arrQz(l, j)    '期中
  39.                 arrQzQm2(k, j) = arrQm(m, j)    '期末
  40.             Next
  41.             dicQm.Remove (Keytmp)    '删除期末共有的
  42.         Else
  43.             '期中独有
  44.             arrPos(2) = arrPos(2) + 1
  45.             k = arrPos(2)    '结果数组行号
  46.             l = dicQz(Keytmp)    '期中数据行号
  47.             For j = LBound(arrQz, 2) To UBound(arrQz, 2)
  48.                 arrQzonly(k, j) = arrQz(l, j)    '期中
  49.             Next
  50.         End If
  51.     Next
  52.     If dicQm.Count Then
  53.         '期末独有
  54.         For Each Keytmp In dicQm.keys
  55.             arrPos(3) = arrPos(3) + 1
  56.             k = arrPos(3)    '结果数组行号
  57.             l = dicQm(Keytmp)    '期末数据行号
  58.             For j = LBound(arrQm, 2) To UBound(arrQm, 2)
  59.                 arrQmonly(k, j) = arrQm(l, j)    '期末
  60.             Next
  61.         Next
  62.     End If
  63.     Application.ScreenUpdating = False
  64.     With Worksheets("期中期末共有")
  65.         .Range("a4").Resize(UBound(arrQzQm1), UBound(arrQzQm1, 2)).Value = arrQzQm1
  66.         .Range("g4").Resize(UBound(arrQzQm2), UBound(arrQzQm2, 2)).Value = arrQzQm2
  67.     End With
  68.     Worksheets("期中有期末没有").Range("a4").Resize(UBound(arrQzonly), UBound(arrQzonly, 2)).Value = arrQzonly
  69.     Worksheets("期末有期中没有").Range("a4").Resize(UBound(arrQmonly), UBound(arrQmonly, 2)).Value = arrQmonly
  70.     Application.ScreenUpdating = True
  71.     MsgBox "对比完成", vbInformation
  72. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
shixyi37 + 1 很给力

查看全部评分

回复

使用道具 举报

发表于 2015-2-6 11:31 | 显示全部楼层
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, brr, d, ar, dr, cr, i&, j%, s1&, s2&, s3&
  4. Set d = CreateObject("scripting.dictionary")
  5. arr = Sheets("期中").Range("a1").CurrentRegion
  6. brr = Sheets("期末").Range("a1").CurrentRegion
  7. ReDim ar(1 To UBound(arr), 1 To UBound(arr, 2) * 2 + 1)
  8. ReDim br(1 To UBound(arr), 1 To UBound(arr, 2))
  9. ReDim cr(1 To UBound(brr), 1 To UBound(brr, 2))
  10. For i = 3 To UBound(arr)
  11.     d(arr(i, 1)) = i
  12. Next
  13. For i = 3 To UBound(brr)
  14.     If Not d.exists(brr(i, 1)) Then
  15.         s3 = s3 + 1
  16.         For j = 1 To UBound(brr, 2)
  17.             cr(s3, j) = brr(i, j)
  18.         Next
  19.         d(brr(i, 1)) = "," & i
  20.     Else
  21.         s1 = s1 + 1
  22.         n = d(brr(i, 1))
  23.         For j = 1 To UBound(arr)
  24.             ar(s1, j) = arr(n, j)
  25.             ar(s1, j + 6) = brr(i, j)
  26.         Next
  27.         d(brr(i, 1)) = d(brr(i, 1)) & "," & i
  28.     End If
  29. Next
  30. b = d.items
  31. For i = 0 To d.Count - 1
  32.     If InStr(b(i), ",") = 0 Then
  33.         s2 = s2 + 1
  34.         For j = 1 To UBound(arr, 2)
  35.         br(s2, j) = arr(b(i), j)
  36.     Next
  37. End If
  38. Next
  39. Sheet1.Range("a4").Resize(s1, UBound(ar, 2)) = ar
  40. Sheet2.Range("a4").Resize(s2, UBound(br, 2)) = br
  41. Sheet3.Range("a4").Resize(s3, UBound(cr, 2)) = cr
  42. End Sub
复制代码
回复

使用道具 举报

发表于 2015-2-6 11:35 | 显示全部楼层    本楼为最佳答案   
………………

查找并列出相同不相同.rar

15.27 KB, 下载次数: 45

回复

使用道具 举报

 楼主| 发表于 2015-2-6 15:21 | 显示全部楼层
6楼 7楼的都能解决问题,非常感谢,太强大了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 17:56 , Processed in 0.359350 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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