ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 强大的FILTERXML——文本处理函数(完结)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-5 16:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:FILTERXML
轩檐 发表于 2019-8-5 16:09
先回答两个问题,并上传下我对于filterxml的整理资料,老师有时间帮忙指正指正。

你整理的很棒~!
  1. "a/b[position()>="&LEFT(B30)& "and position()<="&RIGHT(B30)&"]"
复制代码

更通用
  1. ="a/b[position()>="&SUBSTITUTE(B30,","," and position()<=")&"]"
复制代码


另外这个题你可以参考我2章的截取小节,可能好些

TA的精华主题

TA的得分主题

发表于 2019-8-5 17:23 | 显示全部楼层
  1. =FILTERXML("<a><b>"&SUBSTITUTE(B3,",","</b><b>")&"</b></a>","a/b[.*0=0][not(.<../*)]")
复制代码

  1. =FILTERXML("<a><b>"&SUBSTITUTE(B3,",","</b><b>")&"</b></a>","a/b[.*0=0][not(.>../*)]")
复制代码


请老师指正,后面几题暂时没时间写,晚上或者其他时间来写写看。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-5 17:50 | 显示全部楼层
轩檐 发表于 2019-8-5 17:23
请老师指正,后面几题暂时没时间写,晚上或者其他时间来写写看。

很精彩~!
下面是预设的,请多多指教~!
3.1.基础篇-数值的最大值及最小值.jpg

TA的精华主题

TA的得分主题

发表于 2019-8-6 22:17 | 显示全部楼层
老师,我开始写的时候,理解错题意了,您要是的名字,而我一直在求分数,看到后面几题才发现看错题目了~~~

那么,我就先发求分数的公式的吧。

  1. =FILTERXML("<a><"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2,"="," b='"),",","'/,"),",","><")&"'/></a>","a/*[@b>90]["&ROW(A1)&"]/@b")
复制代码

  1. =FILTERXML("<a><"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2,"="," b='"),",","'/,"),",","><")&"'/></a>","a/*[@b>90][following-sibling::*]["&ROW(A1)&"]/@b")
复制代码

  1. =FILTERXML("<a><"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2,"="," b='"),",","'/,"),",","><")&"'/></a>","a/*[@b>90][position()="&ROW(A1)&"]/@b")
复制代码


以上取大于90分的分数。。。有无数种写法,因为是同一级的,可以用父级,祖辈级等。

另外,第二题应该是小于80分的,小于70分的是没有分数的。小于的就不发了。

  1. =FILTERXML("<a><"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2,"="," b='"),",","'/,"),",","><")&"'/></a>","a/*[@b>=80 and @b<=90] [position()="&ROW(A1)&"]/@b")
复制代码


前面大于90的公式有好几个了,这里就写一个吧,就剩去了写following,parent等函数了。

不过提取名字的题目,我还没解答出来,有空再研究研究。

TA的精华主题

TA的得分主题

发表于 2019-8-7 09:46 | 显示全部楼层
本帖最后由 轩檐 于 2019-8-7 10:38 编辑
  1. =FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE($B$2,",","</c></b><b>"),"=","<c>")&"</c></b></a>","a/b[c>90][not(.<../*)]["&ROW(A1)&"]")
复制代码


提取大于90分的人名。xpath这里就写一个吧,其他的可以用position=row(a1),另外用string,text,following::*都可以抓取。
小于80分的,就写成c<80;大于等于80小于等于90的,就写成c>=80 and c<=90,其他都不变。
  1. =FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE($B$2,",","</c></b><b>"),"=","<c>")&"</c></b></a>","a/b[text()=('紫星')]/c")
复制代码

取sayhi95和小U的成绩,这里应该可以写a/b[last()-2]/c,又因为是连续,也可以用position()去定位下拉。

  1. =FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE($B$2,",","</c></b><b>"),"=","<c>")&"</c></b></a>","a/b[position()>"&ROW(A8)&"]/c")
复制代码
可以下拉。

关于多个最大值,我还要琢磨一下,我现在只会找到一个最大值的方法。
今天估计没时间琢磨了,高阶一的最大值,还有高阶二的去重,有空再来写写看

请老师指正。


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-7 12:16 | 显示全部楼层
轩檐 发表于 2019-8-7 09:46
提取大于90分的人名。xpath这里就写一个吧,其他的可以用position=row(a1),另外用string,text,followi ...

老师的公式很精彩~!
有几点说明下:
1.[position()="&ROW(A1)&"] 就是 ["&ROW(A1)&"] ,等同的
2.FILTERXML的结果如果是多个就是数组的,单个就是单值~!
   他返回的数据类型最广——数值、文本、逻辑值。空文本为错误值,作为对象或者文本内容不存在处理而返回的错误值!数据结构多样的一个函数——单值、数组!
   如非必要,不用单取~!所以大部分的 ["&ROW(A1)&"]  可以省略!3.对于“小于70分” 的确实是我的笔误,谢谢老师指正~!
4.就题而言,老师的第一个公式
  1. =FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE($B$2,",","</c></b><b>"),"=","<c>")&"</c></b></a>","a/b[c>90][not(.<../*)]["&ROW(A1)&"]")
复制代码
   [not(.<../*)] 不知道老师怎么考虑的,这个是没必要的,["&ROW(A1)&"]" 也可以省略,直接一个数组公式也可以。
   改成:
  1.   =FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE($B$2,",","</c></b><b>"),"=","<c>")&"</c></b></a>","a/b[c>90]")
复制代码
  第二个公式,就是那个感觉。
   第三个公式,老师按照观察,取巧了。实际我想要的是用 or 或者 | 提取  。
---------------------------*----------********
像老师说的变化太多太多,我想找最直接的方式解决,最主要还是思路为主。
   下面楼层,我也会贴上我的公式,请老师指正~!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-7 14:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 象山海鲜 于 2019-8-7 14:54 编辑

3.1.条件取值高阶实例习题、公式
3.1.条件取值高阶习题及公式.rar (26.69 KB, 下载次数: 29)


3.1.条件取值高阶实例.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-8-7 16:31 | 显示全部楼层
象山海鲜 发表于 2019-8-7 12:16
老师的公式很精彩~!
有几点说明下:
1. 就是 ["&ROW(A1)&"] ,等同的

老师,我那个公式里,如果只是a/b[c>90]的话,没办法下拉,所以我就加了,但是not(.<../*)确实多余,想多了。。。只需要"a/b[c>90]["&row(a1)&"]"

TA的精华主题

TA的得分主题

发表于 2019-8-7 16:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
老师已经公布答案了,还是没赶上答题,哈哈,既然如此,我就好好学习老师的精髓吧。

老师对于xml的树枝结构的构造,使得后面xpath的写法更加简便,真是厉害。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-7 17:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
轩檐 发表于 2019-8-7 16:37
老师已经公布答案了,还是没赶上答题,哈哈,既然如此,我就好好学习老师的精髓吧。

老师对于xml的树枝 ...

我的也不一定是最佳的。可以不看答案,先做题哈,然后还可以互相学习。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 21:10 , Processed in 0.035900 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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