Excel精英培训网

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

[已解决]如何用代码挑出相同的组数据?

[复制链接]
发表于 2013-10-23 08:17 | 显示全部楼层 |阅读模式
本帖最后由 静小 于 2013-10-23 09:25 编辑

附件 查询相同一组附件.zip (141.15 KB, 下载次数: 7)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-10-23 08:37 | 显示全部楼层
二列数据不是同一行数据一一对应的相等吧?
回复

使用道具 举报

 楼主| 发表于 2013-10-23 08:40 | 显示全部楼层
CheryBTL 发表于 2013-10-23 08:37
二列数据不是同一行数据一一对应的相等吧?

l四列成一行,为一组。

两组的四个数,都要一致。

谢谢老师。
回复

使用道具 举报

发表于 2013-10-23 08:40 | 显示全部楼层
见以下代码所示:
  1. Sub EP()
  2.     Dim i As Integer, m As Integer, Rnum As Integer
  3.     Dim ar1, ar2, re
  4.     ar1 = Sheets(2).Range("A1").CurrentRegion
  5.     ar2 = Sheets(2).Range("F1").CurrentRegion
  6.     ReDim re(1 To UBound(ar1), 1 To 4)
  7.     For i = 1 To UBound(ar1)
  8.         m = 0
  9.         For j = 1 To UBound(ar2)
  10.             If ar1(i, 1) = ar2(j, 1) And ar1(i, 2) = ar2(j, 2) And ar1(i, 3) = ar2(j, 3) And ar1(i, 4) = ar2(j, 4) Then
  11.                 m = m + 1
  12.                 Rnum = Rnum + 1
  13.                 re(Rnum, 1) = ar1(i, 1)
  14.                 re(Rnum, 2) = ar1(i, 2)
  15.                 re(Rnum, 3) = ar1(i, 3)
  16.                 re(Rnum, 4) = ar1(i, 4)
  17.                 Exit For
  18.             End If
  19.         Next j
  20.     Next i
  21.     Sheets(2).[p1].Resize(UBound(re), 4) = re
  22. End Sub
复制代码
查询相同一组附件.rar (107.48 KB, 下载次数: 2)

评分

参与人数 1 +1 收起 理由
静小 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-10-23 08:41 | 显示全部楼层
静小 发表于 2013-10-23 08:40
l四列成一行,为一组。

两组的四个数,都要一致。

我知道,我是说第组数据不用在同一行吧?
以上附件是按所有组数据是否相同来确定的。
回复

使用道具 举报

发表于 2013-10-23 08:59 | 显示全部楼层
  1. Sub test1()
  2.     Dim arr1, arr2, result(1 To 1000, 1 To 1)
  3.     Dim i As Integer, j As Integer
  4.     Dim m As Integer
  5.     Dim dic1 As Object
  6.     Dim dic2 As Object
  7.     Dim key
  8.    
  9.     Set dic1 = CreateObject("scripting.dictionary")
  10.     Set dic2 = CreateObject("scripting.dictionary")
  11.    
  12.     arr1 = Range("a1").CurrentRegion.Value
  13.     arr2 = Range("f1").CurrentRegion.Value
  14.    
  15.     If Not (IsArray(arr1) Or IsArray(arr2)) Then Exit Sub
  16.    
  17.     i = UBound(arr1)
  18.     If UBound(arr1) > UBound(arr2) Then i = UBound(arr2)

  19.     For j = LBound(arr1) To i
  20.         dic1(Join(WorksheetFunction.Index(arr1, j, 0), "#")) = ""
  21.         dic2(Join(WorksheetFunction.Index(arr2, j, 0), "#")) = ""
  22.     Next

  23.     If i = UBound(arr1) Then
  24.         For j = i + 1 To UBound(arr2)
  25.             dic2(Join(WorksheetFunction.Index(arr2, j, 0), "#")) = ""
  26.         Next
  27.     Else
  28.         For j = i + 1 To UBound(arr1)
  29.             dic1(Join(WorksheetFunction.Index(arr1, j, 0), "#")) = ""
  30.         Next
  31.     End If


  32.     For Each key In dic1.keys
  33.         If dic2.exists(key) Then
  34.             m = m + 1
  35.             result(m, 1) = key
  36.         End If
  37.     Next
  38.    
  39.     If m Then
  40.         Application.ScreenUpdating = False
  41.         With Range("p1")
  42.             .CurrentRegion.ClearContents
  43.             .Resize(m).Value = result
  44.             .CurrentRegion.TextToColumns Destination:=Range("P1"), Other:=True, OtherChar:="#"
  45.             .Activate
  46.         End With
  47.         Application.ScreenUpdating = True
  48.     End If
  49. End Sub
复制代码
回复

使用道具 举报

发表于 2013-10-23 09:00 | 显示全部楼层
按楼主的要求来是求两组中的交集吧。
回复

使用道具 举报

发表于 2013-10-23 09:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hwc2ycy 于 2013-10-23 09:12 编辑

这个效率比上一个代码高多了。
  1. Sub test2()
  2.     Dim arr1, arr2, result(1 To 1000, 1 To 1)
  3.     Dim j As Integer, m As Integer
  4.     Dim dic1 As Object, dic2 As Object
  5.     Dim str1 As String, key
  6.     Dim t#
  7.     t = Timer
  8.    
  9.     Set dic1 = CreateObject("scripting.dictionary")
  10.     Set dic2 = CreateObject("scripting.dictionary")
  11.    
  12.     arr1 = Range("a1").CurrentRegion.Value
  13.     arr2 = Range("f1").CurrentRegion.Value
  14.    
  15.     If Not (IsArray(arr1) Or IsArray(arr2)) Then Exit Sub
  16.    
  17.     For j = LBound(arr1) To UBound(arr1)
  18.         For m = LBound(arr1, 2) To UBound(arr1, 2) - 1
  19.             str1 = str1 & arr1(j, m) & "#"
  20.         Next
  21.         str1 = str1 & arr1(j, m)
  22.         dic1(str1) = ""
  23.         str1 = ""
  24.     Next

  25.     For j = LBound(arr2) To UBound(arr2)
  26.         For m = LBound(arr2, 2) To UBound(arr2, 2) - 1
  27.             str1 = str1 & arr2(j, m) & "#"
  28.         Next
  29.         str1 = str1 & arr2(j, m)
  30.         dic2(str1) = ""
  31.         str1 = ""
  32.     Next
  33.    
  34.     m = 0

  35.     For Each key In dic1.keys
  36.         If dic2.exists(key) Then
  37.             m = m + 1
  38.             result(m, 1) = key
  39.         End If
  40.     Next
  41.    
  42.     If m Then
  43.         Application.ScreenUpdating = False
  44.         With Range("p1")
  45.             .CurrentRegion.ClearContents
  46.             .Resize(m).Value = result
  47.             .CurrentRegion.TextToColumns Destination:=Range("P1"), Other:=True, OtherChar:="#"
  48.             .Activate
  49.         End With
  50.         Application.ScreenUpdating = True
  51.         MsgBox "完成", vbInformation
  52.     End If
  53.     t = Timer - t
  54.     Debug.Print "用时:" & t & " 秒"
  55. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
静小 + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-10-23 09:13 | 显示全部楼层
hwc2ycy 发表于 2013-10-23 09:09
这个效率比上一个代码高多了。

还是烟花看的仔细,没注意原数据中还有真重复的。
不知道楼主对重复时的数据是怎么处理了? 不过要是彩票啥的,重复也应该是要的吧,呵呵
回复

使用道具 举报

 楼主| 发表于 2013-10-23 09:23 | 显示全部楼层
CheryBTL 发表于 2013-10-23 09:13
还是烟花看的仔细,没注意原数据中还有真重复的。
不知道楼主对重复时的数据是怎么处理了? 不过要是彩票 ...

比如:
如果ABCD  中有两组或多组,与FGHI中的一组都相同,也取一组即可。重复很罕见,但不是没有。

谢谢各位老师帮助。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 08:29 , Processed in 0.423319 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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