|
楼主 |
发表于 2024-10-21 22:50
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 daziran 于 2024-10-21 22:56 编辑
小结。
前面的回帖已经完全符合我的需求。但这么多高水平算法,我必须认真学习,逐一测试,报告如下(其中的“思路”是我的肤浅理解):
1.飞天篮球猪
提供了两个厉害解法。但我没装Power Query和Power Pivot插件,没测试。
2.李贵濮
=COUNTA(FILTER(B1:B8,(A1:A8=D3)+(A1:A8=F2)))-COUNTA(UNIQUE(FILTER(B1:B8,(A1:A8=D3)+(A1:A8=F2))))
运行成功。
思路:用Filter函数,分别按【F列姓名】、【第2行姓名】获得【信息列】(放在同一个数组);另外再获得一个同样的数组,用UNIQUE去重;二者数量相减。
3.ww87725244
(1)
=IF($F3=G$2,"",SUM(N(TOCOL(IF($C$3:$C$11=$F3,$D$3:$D$11,0/0),3)=TOCOL(IF($C$3:$C$11=G$2,$D$3:$D$11,0/0),3))))
运行未成功。
思路:第1个【TOCOL(IF】获得【F列姓名】对应的【信息列】,第2个【TOCOL(IF】获得【第2行李四】对应的【信息列】,二者对比,求和。
(2)
=LET(m,GROUPBY($D$3:$D$11,$C$3:$C$11,ARRAYTOTEXT,,0),n,SUM(N(TEXTJOIN(", ",,$F3,G$2)=TAKE(m,,-1))),IF(n=0,"",n))
运行成功。
思路:用GROUPBY获得【二维表】,包含【信息】及其对应的【姓名】表,用TAKE仅保留这个表的【姓名列】,再与用TEXTJOIN合并的【两个姓名】作比较,求和。
4.我要成为专家
=IF($F3=G$2,"",TEXT(SUM(COUNTIFS($C:$C,G$2,$D:$D,FILTER($D:$D,$C:$C=$F3))),"[>]"))
运行成功。
思路:用FILTE函数,按包括【F列姓名】筛选【信息列】;用COUNTIFS函数,【第2行姓名】、【信息列】分别作为criteria;求和。
5.我会修电视
=LET(X,FILTER($D:$D,($C:$C=$F3)+($C:$C=G$2)),COUNTA(X)-COUNTA(UNIQUE(X)))
运行成功。
思路:与李贵濮提供算法类似。用LET-X进行简化。
6.hxj119
=MAP($G$2:$I$2,LAMBDA(x,LET(a,$D$3:$D$11,b,$C$3:$C$11,IF(x=$F3,"",SUM(N(FILTER(a,b=$F3)=TRANSPOSE(FILTER(a,b=x))))))))
运行成功。
思路:用两个Filter函数分别【按F列姓名】、【第3行姓名】获得【信息列】;TRANSPOSE转置后对比求和。用map、lambda、let简化代码。公式结果为数组,仅需在F列写入公式。
7.wp231957
=LET(_c,C3:C22,_d,D3:D22,_e,UNIQUE(_c),HSTACK(VSTACK("",_e),VSTACK(TOROW(_e),MAKEARRAY(ROWS(_e),ROWS(_e),LAMBDA(x,y,LET(a,FILTER(_d,_c=CHOOSEROWS(_e,x)),b,FILTER(_d,_c=CHOOSEROWS(_e,y)),IF(x<>y,SUM((ISNUMBER(MATCH(a,b,0)))*1),0)))))))
运行成功。
思路:看着累。特点:只需在一个单元格F2输入上述公式,自动生成二维表结果。
8.你是那块小饼干
=LET(T,FILTER($D$3:$D$11,$C$3:$C$11=$F3,""),_T,FILTER($D$3:$D$11,$C$3:$C$11=G$2,""),IF(G$2=$F3,"",SUM((T=_T)*1)))
运行成功。本算法适用于每个人的行数相同(我给的示例中每人三行)。
思路:用FILTER根据【F列姓名】获得【信息列】,用FILTER根据【第2行姓名】获得【信息列】,两列对比求和。
9.mykitami
=LET(s,COUNTIFS($C:$C,$F3,$D:$D,UNIQUE($D$3:$D$11)),IFERROR(1/IF($F3=G$2,0,SUM((s>0)*(s=COUNTIFS($C:$C,G$2,$D:$D,UNIQUE($D$3:$D$11)))))^-1,""))
运行成功。
思路:UNIQUE获得【不重复信息列】,COUNTIFS根据【F列姓名】和【不重复信息列】获得【数量表】;类似的,根据【第2行姓名】和【不重复信息列】获得【数量表】,两个【数量表】比对求和。
10.hcm19522
=IF((ROW(A1)<=COLUMN(A1))+($F3=""),"",COUNT(MATCH(IF($C$3:$C$99=$F3,$D$3:$D$99,"A"),IF($C$3:$C$99=G$2,$D$3:$D$99,"B"),)))
运行成功。
思路:用IF函数按【F列姓名】获得【信息列1】,再用IF按【第2行姓名】获得【信息列2】;用MATCH函数,以【信息列1】的值到【信息列2】查找;最后COUNT计数。本算法没用前面帖子中的高级函数,可算是常规函数运用典范了(公式中IF-ROW-COLUMN进行排除,熟练之极)。
|
-
评分
-
1
查看全部评分
-
|