ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 【函数小题】排排站,不插队

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-5-11 12:48 | 显示全部楼层
象山海鲜 发表于 2021-5-11 12:43
嗯嗯,小数运算可能有浮点误差的风险~~~,要小心才好。

,刮刮卡~~~

果然。。。。。。。。。。
是设置字体全白色了吗?

TA的精华主题

TA的得分主题

发表于 2021-5-11 13:12 | 显示全部楼层
cinlo 发表于 2021-5-11 12:48
果然。。。。。。。。。。
是设置字体全白色了吗?

是的,字体和背景颜色一样就可以了。
FILTERXML 公式
  1. =IFERROR(TEXTJOIN(",",,FILTERXML(SUBSTITUTE("<a><b>"&A2&",</b></a>",",","<c>"&SUBSTITUTE(A2,",","</c><c>")&"</c></b><b>"),"a/b[position()=count((c[.>=../text()]))]")),"")
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-5-11 13:30 | 显示全部楼层
象山海鲜 发表于 2021-5-11 13:12
是的,字体和背景颜色一样就可以了。
FILTERXML 公式

很汗颜,我还没来得及学习您的FILTERXML函数,在这里呆着就不想干别的了,在论坛里呆的时候太长,剩下一点时间工作都很紧张了。。。准备尽快抽时间学习FILTERXML!

TA的精华主题

TA的得分主题

发表于 2023-5-17 18:27 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-5-17 19:39 来自手机 | 显示全部楼层
=LET(a,TEXTSPLIT(A2,,","),TEXTJOIN(",",1,FILTER(a,--a=SORT(--a,,-1),"")))
照超人老师抄一个,不知道符合不?365在解决问题上真的很有优势

TA的精华主题

TA的得分主题

发表于 2023-5-17 21:55 | 显示全部楼层
=LET(X,SUBSTITUTE(A2,",",REPT(" ",99)),
A,MID(A2,SEQUENCE(LEN(A2)),1),
B,COUNTA(FILTER(A,A=","))+1,
Y,--UNIQUE(TRIM(MID(X,SEQUENCE(B)*99-98,99))),
Z,LARGE(Y,SEQUENCE(ROWS(Y))),
IF(LEN(A2)=1,A2,TEXTJOIN(",",1,FILTER(Y,XMATCH(Y,Y)=XMATCH(Y,Z),"")))
)

TA的精华主题

TA的得分主题

发表于 2023-5-18 16:31 | 显示全部楼层
象山海鲜 发表于 2021-5-11 13:12
是的,字体和背景颜色一样就可以了。
FILTERXML 公式

海鲜老师,能详细讲讲这部分吗?谢谢!
"a/b[position()=count((c[.>=../text()]))]"

TA的精华主题

TA的得分主题

发表于 2023-5-19 10:30 | 显示全部楼层
本帖最后由 象山海鲜 于 2023-5-19 10:32 编辑
Tony412 发表于 2023-5-18 16:31
海鲜老师,能详细讲讲这部分吗?谢谢!
"a/b))]"

就A2数据为例
10,999,8,7
一.xml
SUBSTITUTE("<a><b>"&A2&",</b></a>",",","<c>"&SUBSTITUTE(A2,",","</c><c>")&"</c></b><b>")
="<a>
         <b>10
               <c>10</c>
              <c>999</c>
              <c>8</c>
              <c>7</c>
         </b>
         <b>999
               <c>10</c>
              <c>999</c>
              <c>8</c>
              <c>7</c>
         </b>
         <b>8
               <c>10</c>
              <c>999</c>
              <c>8</c>
              <c>7</c>

         </b>
         <b>7
               <c>10</c>
              <c>999</c>
              <c>8</c>
              <c>7</c>
         </b>
         <b>
         </b>
</a>"

二.xpath
a/b[position()=count((c[.>=../text()]))]
1) a/b=》根节点a下的b节点集合
2)[.....] 谓词。历遍 1)中集合,谓词中可以是条件 或位置
3)position() 历遍时当前节点在节点集合中的位置。如果历遍到集合中第二个b节点(值为999),position() 就等于2
4)count((c[.>=../text()]))

      例如 当前b节点为
         <b>8
               <c>10</c>
              <c>999</c>
              <c>8</c>
              <c>7</c>
         </b>

    (1)c  ==》 考虑到上下文,就是当前节点下的的c节点集合 {10,999,8,7}
      (2)  c[.>=../text()] ==》[]               谓词 历遍当前c节点集合。
                                         .                 当前历遍到的一个C节点 :如第一个10
                                         ..                当前节点的父节点: <b>8<c>10</c>.......</b>
                                         ../text()        当前节点的父节点的值 : 8
                                         .>=../text()  比较时尽量转为同类型比较(除了数值和逻辑外 不支持)
                                                            10>=8  = TRUE  那么返回当前c节点 10
                                                            999>=8  = TRUE  那么返回当前c节点 999
                                                            8>=8  = TRUE  那么返回当前c节点 8
                                                            7>=8  = FALSE  那么不返回
                                                           可看做:{10,999,8,7}>=8
      (3)  count((c[.>=../text()])), count 统计集合个数。例子结果:3
                                                  统计当前b节点下的c节点集合中有几个大于等于当前b节点的个数

        这样统计可以看做他的降序排名位置。
5)position()=count((c[.>=../text()]))  当前位置是否和降序排名位置相同。
                                                        在4)中的例子 b节点(值为8)的集合位置为3 且降序排名也为3 当前节点符合条件 返回当前节点。
                                                        其他类似判断并返回,最后返回一个集合。可看做筛选后的集合。


最后
position()=count((c[.>=../text()])) 这个谓词内的内容可以简化为 :count(c[.>=../text()])。
count返回的是数值
[]谓词内如果是数值(不是节点、集合、逻辑值...)时,那么只有当前位置和数值相等时才会返回。


希望能帮到你。



评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-21 15:14 | 显示全部楼层
象山海鲜 发表于 2023-5-19 10:30
就A2数据为例
10,999,8,7
一.xml

感谢大神,请收下我的膝盖!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 13:00 , Processed in 0.050784 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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