ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] LAMBDA函数使用技巧继续挑战:使用LAMBDA函数从任意字符串从右边提取任意位置的数...

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-6-19 04:02 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 丁建成 于 2022-6-19 04:06 编辑

一、定义函数

在Formula菜单NameManager里面定义下述名称;
下表中公式里面最后的括号及其内容无需在定义公式时录入。
  
Name
  
Formula
Results
GetLastChar
=LAMBDA(a,b,IF(b>LEN(a),a,IF(ISNUMBER(1*MID(a,LEN(a)-b+1,1)),RIGHT(a,b-1),GetLastChar(a,b+1))))("a1b2c3d4e5f",1)
f
DeleteLastChar
=LAMBDA(a,LEFT(a,LEN(a)-LEN(GetLastChar(a,1))))("a1b2c3d4e5f")
a1b2c3d4e5
GetLastNumber
=LAMBDA(a,b,IF(b>LEN(a),a,IF(MID(a,LEN(a)-b+1,1)="-",RIGHT(a,b),IF(ISNUMBER(1*RIGHT(a,b)),GetLastNumber(a,b+1),RIGHT(a,b-1)))))("a1b2c3d4e5",1)
5
DeleteLastNumber
=LAMBDA(a,LEFT(a,LEN(a)-LEN(GetLastNumber(a,1))))("a1b2c3d4e5")
a1b2c3d4e
RightFindChar
=LAMBDA(a,b,IF(b=1,GetLastChar(a,1),RightFindChar(DeleteLastNumber(DeleteLastChar(a)),b-1)))("a1b2c3d4e5f",6)
a
RightFindNumber
=LAMBDA(a,b,IF(b=1,GetLastNumber(DeleteLastChar(a),1)*1,RightFindNumber(DeleteLastNumber(DeleteLastChar(a)),b-1)))("a1b2c3d4e5f",4)
2
RightFind
=LAMBDA(a,b,c,IF(c=1,RightFindNumber(a,b),RightFindChar(a,b)))("a1b2c3d4e5f",3,1)
3

A、提取最右边字符串函数,GetLastChar(aas string,b as ID =1)
=LAMBDA
(a, b,
IF      (
          b>LEN(a),
          a,
          IF       (
                    ISNUMBER(1*MID(a,LEN(a)-b+1,1)),
                    RIGHT(a,b-1),
                    GetLastChar(a,b+1)
                    )
          )
)
1、 设置两个参数:待处理字符串,计数值1;从右边逐个递增识别字符,若为字符,则判断下一位;否则,按计数值减1从右边截取字符串。
2、 第二层判断,按当前序数值取单一字符,乘以1强制转换类型,判断是否为数值;如果是,则按当前序数值减1,从右边截取字符串;否则,当期序数值加1,调用本函数;
3、 若待处理字符串,全部为字符,当判断到最左边时,当前序数值等于字符串长度;然后序数值加1,再次调用本函数时,Mid函数将报错;因此,增加第一层判断,避免报错。
B、 删除最右边字符串函数,DeleteLastChar(aas string)解析
=LAMBDA
(a,
LEFT
          (a,
          LEN(a)-LEN        (
                                        GetLastChar(a,1)
                                        )
          )
)
·       设置一个参数:待处理字符串;基于待处理字符串,将GetLastChar函数提取的字符串,按字符串长度差异在待处理串中删除;

C、 提取最右边数值函数:GetLastNumber(aas string,b as ID =1)解析
=LAMBDA
(a,b,
IF      (b>LEN(a),
          a,
          IF       (MID(a,LEN(a)-b+1,1)="-,
                    RIGHT(a,b),
                    IF                (ISNUMBER(1*RIGHT(a,b)),
                                        GetLastNumber(a,b+1),
                                        RIGHT(a,b-1))
                    )
          )
)
·       设置两个参数:字符串参数,必须最右边为是数值;计数值1;
·       相关逻辑与GetLastChar基本相同;从右边逐个递增识别字符,若为数值,则判断下一位;否则,按计数值减1从右边截取数值字符串。
·       增加了一个特殊判断,若当前字符为“-”,则按照当期计数值返回右边的字符串。




Picture1.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-6-19 04:04 | 显示全部楼层
D、 删除最右边数值字符串函数, DeleteLastNumber(a as string)解析
=LAMBDA
(a,
LEFT(
        a,
        LEN(a)-LEN(GetLastNumber(a,1))
        )
)
•        设置一个参数:字符串参数,必须最右边为是数值;相关逻辑与GetLastChar基本相同;
•        基于待处理字符串,将GetLastNumber函数提取的数值字符串,按字符串长度差异在待处理串中删除。
E、提取右边指定位置的字符串,RightFindChar(a as String, b as ID)解析
=LAMBDA
(a,b,
        IF        (
                b=1,
                GetLastChar(a,1),
                RightFindChar(DeleteLastNumber(DeleteLastChar(a)),b-1))
)
•        设置两个参数:待处理字符串,从右边开始提取第ID位的字符串;
•        若ID为1,可直接调用GetLastChar函数;
•        若ID大于1,则调用DeleteLastChar和DeleteLastNuber分别删除最右边的字符串和数值字符串,ID减1;如此,循环调用。
F、提取右边指定位置的数值字符串,RightFindNumber(a as String, b as ID)解析
=LAMBDA
(a,b,
        IF        (
                b=1,
                GetLastNumber(DeleteLastChar(a),1)*1,
                RightFindNumber(DeleteLastNumber(DeleteLastChar(a)),b-1))
)
•        设置两个参数:待处理字符串,从右边开始提取第ID位的字符串;
•        若ID为1,可直接调用GetLastChar先删除最右边的字符串函数,再调用GetLastNumber获取对应的数值字符串;
•        若ID大于1,则调用DeleteLastChar和DeleteLastNuber分别删除最右边的字符串和数值字符串,ID减1;如此,循环调用。
G、提取右边指定位置的字符串或数值字符串,RightFind(a as String, b as ID, C as type)解析
=LAMBDA
(a,b,c,
        IF        (
                c=1,
                RightFindNumber(a,b),
                RightFindChar(a,b))
)
•        设置两个参数:待处理字符串;从右边开始提取第ID位的字符串;提取类型,1表示数值;
•        判断参数TYPE是否为1;如为1,则调用RightFindNumber函数;否则,调用RightFindChar函数。

三、运行示例

若在A1里面输入字符串s;120101.-dsisis-erwr..34--34wrwr-02-392.3394.32sdjfsls;dfj。
按下图输入相关参数和公式,查看运行结果,还是比较令人满意的。


 

TA的精华主题

TA的得分主题

发表于 2022-6-19 09:34 来自手机 | 显示全部楼层
感谢分享~建议可以将excel源文件压缩后一并上传,方便大家学习讨论,谢谢[嘻嘻]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-6-19 10:21 | 显示全部楼层
需要在公式菜单名称定义里面,逐个定义七个函数,注意不要把测试参数定义进去。

20220617.zip

9.32 KB, 下载次数: 31

TA的精华主题

TA的得分主题

发表于 2022-10-31 14:06 | 显示全部楼层
这个lambda只能在365中用吗。 我装了2021版excel,竟然不识别lambda

TA的精华主题

TA的得分主题

发表于 2022-11-1 09:45 | 显示全部楼层
ipkdbr 发表于 2022-10-31 14:06
这个lambda只能在365中用吗。 我装了2021版excel,竟然不识别lambda

当然啦,貌似得预览版才行,我有台电脑没弄到预览版都没有lambda

TA的精华主题

TA的得分主题

发表于 2024-5-16 23:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-5-17 09:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
很实用,感谢楼主分享
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 05:21 , Processed in 0.045797 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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