Excel精英培训网

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

[已解决]跨表提取不重复数据(都可以学习)

[复制链接]
发表于 2015-4-3 10:41 | 显示全部楼层 |阅读模式
本帖最后由 文轩馨婷 于 2015-4-3 11:58 编辑

要求:提取“表1”“表2”中领货人不重复的姓名在“汇总表”A列(想要的效果如M列)
如附件!!!


如果能用函数解决是最好了!(最近在整理“提取不重复数据“的函数解法)

在此先谢过了!!

谢谢grf1973老师的VBA解法!!
谢谢qinqh_yl老师的函数解法!!
最佳答案
2015-4-3 11:50
只有两个表还是可以用函数求出来:
A2=IF(ROW()-1>SUM(IFERROR(1/COUNTIF(表1!$B$2:$D$4,表1!$B$2:$D$4),0)),INDIRECT("表2!"&TEXT(MIN(IF((COUNTIF(A$1:A1,表2!$B$2:$D$4)=0)*(表2!$B$2:$D$4<>""),ROW($2:$4)*100+COLUMN($B:$D),9999)),"R#C00"),),INDIRECT("表1!"&TEXT(MIN(IF((COUNTIF(A$1:A1,表1!$B$2:$D$4)=0)*(表1!$B$2:$D$4<>""),ROW($2:$4)*100+COLUMN($B:$D),9999)),"R#C00"),))&""

B2=IF(A2="","",SUM(COUNTIF(INDIRECT("表"&{"1","2"}&"!B:D"),A2)))
均为数组公式。

跨表提取不重复数据.zip

9.94 KB, 下载次数: 127

评分

参与人数 1 +6 收起 理由
心正意诚身修 + 6 這問題比較有代表性.等解法.

查看全部评分

发表于 2015-4-3 11:21 | 显示全部楼层
  1. Sub tt()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     For Each sh In Worksheets
  4.         If sh.Name <> ActiveSheet.Name Then
  5.             arr = sh.[a1].CurrentRegion
  6.             For i = 2 To UBound(arr)
  7.                 For j = 2 To UBound(arr, 2)
  8.                     If arr(i, j) <> "" Then d(arr(i, j)) = d(arr(i, j)) + 1
  9.                 Next
  10.             Next
  11.         End If
  12.     Next
  13.     [a2].Resize(d.Count, 2) = Application.Transpose(Array(d.keys, d.items))
  14. End Sub
复制代码

跨表提取不重复数据.rar

17.92 KB, 下载次数: 141

评分

参与人数 3 +15 收起 理由
武林长风 + 6 很给力!
心正意诚身修 + 6 赞一个!
文轩馨婷 + 3 不好意思,最佳给了函数!十分感谢!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-4-3 11:31 | 显示全部楼层
grf1973 发表于 2015-4-3 11:21

谢谢!完全解决了!{:25:}

只是VBA不懂!(能否加上中文注释)

最佳先留着,在看看有没有用函数解决的!
回复

使用道具 举报

发表于 2015-4-3 11:36 | 显示全部楼层
文轩馨婷 发表于 2015-4-3 11:31
谢谢!完全解决了!

只是VBA不懂!(能否加上中文注释)

我也在等函數的解法.等著學習一下.
回复

使用道具 举报

发表于 2015-4-3 11:50 | 显示全部楼层    本楼为最佳答案   
只有两个表还是可以用函数求出来:
A2=IF(ROW()-1>SUM(IFERROR(1/COUNTIF(表1!$B$2:$D$4,表1!$B$2:$D$4),0)),INDIRECT("表2!"&TEXT(MIN(IF((COUNTIF(A$1:A1,表2!$B$2:$D$4)=0)*(表2!$B$2:$D$4<>""),ROW($2:$4)*100+COLUMN($B:$D),9999)),"R#C00"),),INDIRECT("表1!"&TEXT(MIN(IF((COUNTIF(A$1:A1,表1!$B$2:$D$4)=0)*(表1!$B$2:$D$4<>""),ROW($2:$4)*100+COLUMN($B:$D),9999)),"R#C00"),))&""

B2=IF(A2="","",SUM(COUNTIF(INDIRECT("表"&{"1","2"}&"!B:D"),A2)))
均为数组公式。

评分

参与人数 3 +23 收起 理由
zjdh + 14 赞一个!
文轩馨婷 + 3
心正意诚身修 + 6 我的是03版,不支持IFERROR,不過.光看一眼就.

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-4-3 11:54 | 显示全部楼层
qinqh_yl 发表于 2015-4-3 11:50
只有两个表还是可以用函数求出来:
A2=IF(ROW()-1>SUM(IFERROR(1/COUNTIF(表1!$B$2:$D$4,表1!$B$2:$D$4),0 ...

解决了!!{:25:}

老师,可否讲讲思路??
回复

使用道具 举报

发表于 2015-4-3 13:23 | 显示全部楼层
代码很简单。。。。只是学了代码之后再也没有心思钻研公式了。。。。。
  1. Sub tt()
  2.     Set d = CreateObject("scripting.dictionary")      '设立字典
  3.     For Each sh In Worksheets     '遍历所有工作表
  4.         If sh.Name <> ActiveSheet.Name Then        '工作表名不等于当前工作表名
  5.             arr = sh.[a1].CurrentRegion       '工作表数据入数组
  6.             For i = 2 To UBound(arr)       '对数组行循环
  7.                 For j = 2 To UBound(arr, 2)       '对数组列循环
  8.                     If arr(i, j) <> "" Then d(arr(i, j)) = d(arr(i, j)) + 1         '数组每个元素去重+1
  9.                 Next
  10.             Next
  11.         End If
  12.     Next
  13.     [a2].Resize(d.Count, 2) = Application.Transpose(Array(d.keys, d.items))        '显示结果
  14. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-4-3 13:26 | 显示全部楼层
grf1973 发表于 2015-4-3 13:23
代码很简单。。。。只是学了代码之后再也没有心思钻研公式了。。。。。

呵呵呵...{:011:}

谢谢!

等论坛开课后也得参加学习!
回复

使用道具 举报

发表于 2016-3-18 11:29 | 显示全部楼层
学习下  谢谢各位老师~~
回复

使用道具 举报

发表于 2017-2-20 14:48 | 显示全部楼层
学习了。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 03:31 , Processed in 0.325599 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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