ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: apolloh

[Excel 函数与公式] [开_35] [已结]不重复值问题 ★★

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-12-7 01:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以下是引用UNARTHUR在2005-6-22 9:05:00的发言:


几百个可以用公式,几千个可以用高级筛选,几万个就要用vba了

谁告诉你的,几万个千万不要用VBA,我宁愿用高级筛选:)

TA的精华主题

TA的得分主题

发表于 2005-12-7 09:45 | 显示全部楼层

现在看山菊花网友的公式:①首先是定义名称

x=IF(基本分析2!$B$3:$B$121="铝土矿",ROW(基本分析2!$B$3:$B$121))

这是根据条件“铝土矿”筛选出需要的行号,得到一“FALSE和数字”混合的数组,

{FALSE;……;20;FALSE;……;31;FALSE;……;36;FALSE;……;114;FALSE……;121}

②再看单元格中的公式

=IF(ROW(1:1)>COUNT(x),"",INDEX(基本分析2!$A:$A,SMALL(x,ROW(1:1))))

后半部分INDEX(基本分析2!$A:$A,SMALL(x,ROW(1:1)))是中心公式,

small函数是将“FALSE和数字混合数组”序化,数字被逐一筛选出来。

这就是所需的“行号”,有了它,在任何列中获取信息,用Index无疑最好。

本例中共有14个有用的信息被筛选出来,至第16行的CK4402止。

第一页的源数据A列共119行(至121行止),用count(x)可以计算出来。

公式前半部‘=IF(ROW(1:1)>COUNT(x),"",当索引超出最大行数,返回空;

否则会返回#NUM!,从实用的角度,取消此判断亦可,甚至可作索引结束标志。

两相对比,鄙人的处女作是那么地笨拙!呵呵!

TA的精华主题

TA的得分主题

发表于 2005-12-7 09:58 | 显示全部楼层
以下是引用gdliyy在2005-12-7 0:50:43的发言:

这个解法应该是比较常规的解法,但没有判断属于“铝土矿”的是否重复。

不好意思,我刚接触这方面的知识,数组、动态引用等,都是我在这儿注册几天后学到的。故常规解法我也很陌生。

我的目的是实用。我所提供的案例恰恰是要提取所有“铝土矿”的重复项,和楼主的竞赛题目有差别,但也很相关。

按楼主的要求,判断是否重复可能会更复杂吧。

TA的精华主题

TA的得分主题

发表于 2005-12-12 11:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下是引用gvntw在2005-6-18 0:09:00的发言:

给几个:


第二个方法中心公式也可以改为:

LOOKUP(,0/(COUNTIF(E$4:E4,C$5:C$17)=0),C$5:C$17)

第一解法的match+countif和第二法Frequency和Lookup都用得好

第二个方法中心公式改为:LOOKUP(,0/(COUNTIF(E$4:E4,C$5:C$17)=0),C$5:C$17)会出错

建议改为LOOKUP(1,0/(COUNTIF(E$4:E4,C$5:C$17)=0),C$5:C$17)

——apolloh


看懂了gvntw版主的第一法,不禁拍案叫绝。在所有的近30个方案中,相当多的是应用Eraser的经典解法的思路,用countif的确是创新。进行了如下试验:

①将公式中C$5:C$17全部改为纯粹的绝对引用$C$5:$C$17,能加强通用性,拷贝到G列照样可以。改后的公式为:

{=IF(ROW()-ROW(D$4)>SUM(1/COUNTIF($C$5:$C$17,$C$5:$C$17)),"",INDEX($C$5:$C$17,MATCH(TRUE,COUNTIF(D$4:D4,$C$5:$C$17)=0,)))}

②从实用的角度看,最后出现#N/A也是可以容忍的。故将前面的判断删除,应该能减少内存的占用,公式大为简化。

③公式的进一步简化。这一段MATCH(TRUE,COUNTIF(D$4:D4,$C$5:$C$17)=0,)可以改为MATCH(0,COUNTIF(D$4:D4,$C$5:$C$17),)。

④将条件区域增加两行,第18行为空,第19行为CD。公式改为:{=INDEX($C$5:$C$19,MATCH(0,COUNTIF(G$4:G4,$C$5:$C$19),))}。结果倒数第二行出现了一个不需要的0。gvntw版主说加一些条件判断能解决这一问题,尚未去看。

TA的精华主题

TA的得分主题

发表于 2005-12-13 23:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

  我平时用的筛选重复值的方法是:

  1、排序;2、在条件列(以A列为例)的旁边插入一辅助列(以B列为例);

  3、在B列第一行的单元格输入0;4、在B列的第二行单元格输入公式“=if(a2=a1,1,0)”;

  5、将B列第二行单元格的公式B列其他有数据行的单元格中;6、在第一行之前插入一行;

  7、全选整个工作表应用自动筛选,在B列中筛选0值,此时筛选出的行A列的值均不重复。

TA的精华主题

TA的得分主题

发表于 2006-1-7 17:01 | 显示全部楼层

再给一个,用LOOKUP()生成内存数组:

New_data

=LOOKUP(SMALL(IF(MATCH(data,data,)=ROW(data)-MIN(ROW(data))+1,ROW(data)),ROW(INDIRECT("1:"&SUM(1/COUNTIF(data,data))))),ROW(data),data)

OqV54a2z.rar (12.43 KB, 下载次数: 217)

TA的精华主题

TA的得分主题

发表于 2006-1-7 17:14 | 显示全部楼层
以下是引用xml00在2005-12-6 21:23:34的发言:

gvntw版主,我先仔细看看,刚接触这个话题,感觉很费力。

我也刚刚做了一个,简直不能用。

费了九牛二虎之力,终于把这个相对引用的公式搞出来了,这么复杂,已经没有多少实用价值了。研究、或者钻牛角的价值或许有吧。
主要是返回B列中“铝土矿”左侧对应的A列的工程号。
从来没有搞过动态引用的公式,非常费力。这公式很复杂,相信还能简化,简化后应该有一定的实用价值。
另一问题是:我要将其粘贴到另一页面,但公式已经不管用了。如果添加表名引用,公式会进一步复杂。故只有定义名称了。
希望这儿的高手能给于改进和指正,先谢!

看你的表格设计,“铝土矿”对应的A列应该不会有重复的:

=INDEX(A:A,SMALL(IF(B$3:B$121="铝土矿",ROW($3:$121),65536),ROW(1:1)))&""

引用到别的工作表时,把表名加上。

TA的精华主题

TA的得分主题

发表于 2006-1-8 14:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-2-5 12:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-3-31 17:13 | 显示全部楼层
好像与大家的有一点一样,使用了一个辅助列。 U99kHGvU.rar (12.49 KB, 下载次数: 34)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 12:19 , Processed in 0.038360 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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