ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] [套路合集]-函数法字符提取与重构18式

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-13 12:34 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
题外话,我是个喜欢发原创内容的,不怎么喜欢发这种纯整理性质的帖子(因为套路都被前辈们挖得差不多了没什么自己的新东西)


字符的提取问题,是excel函数的一类常见问题,很多招式都有独到之处                                                                        
这篇收集了在江湖上的一些常见招式,即便练不成降龙十八掌,能练成降龙十巴掌也足以混迹江湖了                                                                        
                                                                        
最基础的字符提取,是利用文本函数进行最简单的规律提取                                                                        
1.jpg
                                                                        
本文主要就是围绕各类字符串的提取/重组等介绍一些常见(与不常见)的套路                                                                        
希望能对大家有所助益                                                                        

2.jpg

套路篇-字符提取与重构.rar

122.95 KB, 下载次数: 524

评分

15

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 12:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 流浪铁匠 于 2019-6-13 12:42 编辑

第1章  基础篇

3.jpg

这2个函数一般可以理解为len计字符数,lenb计字节数                                
利用2个结果的差值,可以获取字符串内单字节字符/双字节字符的总数                                
(一般来说汉字为双字节字符,数字/英文/常用符号为单字节字符)                                
注意此招罩门在于默认语言,仅适合中文等,不适合英文



第2章 定位篇
本章主要介绍定位各种性质字符的套路

4.jpg
5.jpg


6.jpg

7.jpg


8.jpg
9.jpg

10.jpg




评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 12:42 | 显示全部楼层
本帖最后由 流浪铁匠 于 2019-6-13 12:45 编辑

第三章 套嵌应用篇
函数套嵌组合下实现的各种提取效果

11.jpg

12.jpg

13.jpg

14.jpg

15.jpg

TA的精华主题

TA的得分主题

发表于 2019-6-13 12:43 | 显示全部楼层
本帖最后由 jivy1212 于 2019-6-13 12:44 编辑

=FILTERXML(SUBSTITUTE("<a><b>"&A18&"</b></a>","-","</b><b>"),"//b[last()]")这个很好玩。。有没有老师可以扩展下这个参数的技巧,我就只知道"a/a[.<99]"这个技巧(分列后只取符合条件的数值)。论坛出的书上也没有讲这个的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 12:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第四章  数组运算篇

16.jpg
17.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 12:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 流浪铁匠 于 2019-6-13 12:53 编辑

前面的只是开胃菜,本篇才是正题

第五章 函数进阶篇

18.jpg

19.jpg

20.jpg

22.jpg

23.jpg

利用对相邻字符的判断来定位位置进行提取的可怕思路
24.jpg

非汉字
  1. =MID(LEFT(A130,SMALL(IF(MMULT(N(MID(A130,ROW($1:$99)+{0,1},1)<"吖"),{2;1})=2,ROW($1:$99),99),F130)),SMALL(IF(MMULT(N(IFERROR((MID(A130,ROW($1:$99)+{-1,0},1)<"吖"),)),{2;1})=1,ROW($1:$99),99),F130),99)
复制代码
汉字
  1. =MID(LEFT(A130,SMALL(IF(MMULT(N(MID(A130,ROW($1:$99)+{0,1},1)>="吖"),{2;1})=2,ROW($1:$99),99),F130)),SMALL(IF(MMULT(N(IFERROR((MID(A130,ROW($1:$99)+{-1,0},1)>="吖"),)),{2;1})=1,ROW($1:$99),99),F130),99)
复制代码
英文
  1. =MID(LEFT(A130,SMALL(IF(MMULT(N(ISNUMBER(AREAS(INDIRECT(MID(A130,ROW($1:$99)+{0,1},1)&1)))),{2;1})=2,ROW($1:$99),99),F130)),SMALL(IF(MMULT(N(IFERROR(ISNUMBER(AREAS(INDIRECT(MID(A130,ROW($1:$99)+{-1,0},1)&1))),)),{2;1})=1,ROW($1:$99),99),F130),99)
复制代码
(附件调整时行数变化了,显示的公式没调整,单元格位置自己改下,这篇主要是为了列套路的)


18,未完待续                                       
星爷的"武状元苏乞儿"中,降龙十八掌是只有前17掌的,把这17掌合成一掌就是第18掌,(在此致敬下经典)                                       
这里也是                                       
提取字符的方法和思路太多,永远没有终点                                       
见招拆招,把本文所列的各种思路融会贯通,希望你能自己练成自己的第18掌,谢谢                                       
                                       
以上,均为纯函数手段的字符提取                                       
当然,实际工作中,迭代运算,word的替换/vba配合正则表达式/power query的m函数等等                                       
都能实现一些函数很难完成的字符提取问题                                       
本文仅仅列举了一些纯函数思路的解决方式,只为给新手们开拓一些思路,谢谢                               
                                       



评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 13:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jivy1212 发表于 2019-6-13 12:43
=FILTERXML(SUBSTITUTE(""&A18&"","-",""),"//b[last()]")这个很好玩。。有没有老师可以扩展下这个参数的技 ...

只会一些简单的,譬如按照固定分隔符分列……

25.jpg

这个函数据说需要掌握html相关知识才能灵活应用

TA的精华主题

TA的得分主题

发表于 2019-6-13 13:55 | 显示全部楼层
铁匠老师,找数字的还有个特好记=MATCH(1,1^MID(A1,ROW(1:99),1),)有逗号是第一个,无逗号是最后一个

TA的精华主题

TA的得分主题

发表于 2019-6-13 14:07 | 显示全部楼层
流浪铁匠 发表于 2019-6-13 13:01
只会一些简单的,譬如按照固定分隔符分列……

额,就是缺少高深技巧的,总感觉会有很多,会比老套路舒服。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 15:41 | 显示全部楼层
1055751654 发表于 2019-6-13 13:55
铁匠老师,找数字的还有个特好记=MATCH(1,1^MID(A1,ROW(1:99),1),)有逗号是第一个,无逗号是最后一个

找第1个没问题
如果缺省match 3参找最后1个
此时 a1 如果是=1&REPT("a",48)&1&REPT("a",48)&1 时结果就错误了
你的公式和 7-4 / 7-7的思路类似

当然字符提取的公式没有万能的,这篇文章的主要目的之一就是展现一个提取问题有很多种方法
总要根据数据源决定最适合的那种罢了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 02:48 , Processed in 0.050212 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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