Excel精英培训网

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

[已解决]如果用VBA,进行对比,找出不同的地方,谢谢。

[复制链接]
发表于 2015-7-31 19:10 | 显示全部楼层 |阅读模式
本帖最后由 新一 于 2015-7-31 20:48 编辑

如果用VBA,进行对比,找出不同的地方,谢谢。如附件中,表一与表二进行对比,结果在表三中显示出来,满足两个条件:日期+姓名,找出总计加班列的不相同的地方。表三结果为模拟结果,谢谢。
最佳答案
2015-7-31 23:17
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. n = 1: Sheet3.Activate
  5. [a:g].Clear
  6. For i = 1 To 2
  7.     Sheets(i).Range("a1").CurrentRegion.Offset(i - 1, 0).Copy Cells(n, 1)
  8.     n = Range("a65536").End(xlUp).Row + 1
  9. Next
  10. arr = Range("a1").CurrentRegion
  11. ReDim brr(1 To UBound(arr), 1 To 1)
  12. For i = 2 To UBound(arr)
  13.     zf = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 5)
  14.     If Not d.exists(zf) Then
  15.         d(zf) = i
  16.     Else
  17.         brr(d(zf), 1) = 1
  18.         brr(i, 1) = 1
  19.     End If
  20. Next
  21. With Range("g1").Resize(UBound(brr))
  22.     .Value = brr
  23.     .SpecialCells(xlCellTypeConstants, 23).EntireRow.Delete
  24. End With
  25. Range("a1").CurrentRegion.Sort [a2], Header:=xlGuess
  26. End Sub
复制代码

附件.rar

2.68 KB, 下载次数: 15

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-7-31 22:34 | 显示全部楼层
用了字典,请自行引用(方法请参考相关资料)
Sub test()
Dim d As New Dictionary, ar1(), ar2(), ar3()
ar1 = Sheets("表一").Range("a1").CurrentRegion.Value
ar2 = Sheets("表二").Range("a1").CurrentRegion.Value
ReDim ar3(1 To UBound(ar1) + UBound(ar2), 1 To 6)
For i1% = 2 To UBound(ar1)
    d(ar1(i1, 1) & "|" & ar1(i1, 2) & "|" & ar1(i1, 5)) = 1
Next
For i1% = 2 To UBound(ar2)
    If d.Exists(ar2(i1, 1) & "|" & ar2(i1, 2) & "|" & ar2(i1, 5)) Then
        d(ar2(i1, 1) & "|" & ar2(i1, 2) & "|" & ar2(i1, 5)) = 2
    Else
        i2 = i2% + 1
        For i3 = 1 To 6
            ar3(i2, i3) = ar2(i1, i3)
        Next
    End If
Next
For i1% = 2 To UBound(ar1)
    If d(ar1(i1, 1) & "|" & ar1(i1, 2) & "|" & ar1(i1, 5)) = 1 Then
        i2 = i2% + 1
        For i3 = 1 To 6
            ar3(i2, i3) = ar1(i1, i3)
        Next
    End If
Next
Sheets("表三").Range("a2").Resize(i2, 6) = ar3
End Sub

评分

参与人数 1 +3 收起 理由
新一 + 3 很给力!感谢帮助。

查看全部评分

回复

使用道具 举报

发表于 2015-7-31 23:17 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. n = 1: Sheet3.Activate
  5. [a:g].Clear
  6. For i = 1 To 2
  7.     Sheets(i).Range("a1").CurrentRegion.Offset(i - 1, 0).Copy Cells(n, 1)
  8.     n = Range("a65536").End(xlUp).Row + 1
  9. Next
  10. arr = Range("a1").CurrentRegion
  11. ReDim brr(1 To UBound(arr), 1 To 1)
  12. For i = 2 To UBound(arr)
  13.     zf = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 5)
  14.     If Not d.exists(zf) Then
  15.         d(zf) = i
  16.     Else
  17.         brr(d(zf), 1) = 1
  18.         brr(i, 1) = 1
  19.     End If
  20. Next
  21. With Range("g1").Resize(UBound(brr))
  22.     .Value = brr
  23.     .SpecialCells(xlCellTypeConstants, 23).EntireRow.Delete
  24. End With
  25. Range("a1").CurrentRegion.Sort [a2], Header:=xlGuess
  26. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-8-1 19:19 | 显示全部楼层
谢谢,各位大神的帮助。{:011:}
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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