ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] Microsoft 365:X檔案大揭秘

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-2 13:59 来自手机 | 显示全部楼层
本帖已被收录到知识树中,索引项:LAMBDA
一杯绿茶来了 发表于 2023-9-1 20:04
真心同意!山脉数组之前勉强看懂一点,还觉得蛮有意思,越向后越蒙圈,直接放弃了!哎!

可以忽略具体题目的意思,只看怎么利用和处理的x就成了

TA的精华主题

TA的得分主题

发表于 2023-9-2 15:47 | 显示全部楼层
shaowu459 发表于 2023-9-2 13:59
可以忽略具体题目的意思,只看怎么利用和处理的x就成了

版主,请问这个m,n代表的是哪个参数呢?
51JS2~R48F$V{OJ5WY$FZO1.png

TA的精华主题

TA的得分主题

发表于 2023-9-2 16:01 | 显示全部楼层
onthetrip 发表于 2023-9-2 15:47
版主,请问这个m,n代表的是哪个参数呢?

自定义F的两个参数。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-2 18:01 来自手机 | 显示全部楼层
onthetrip 发表于 2023-9-2 15:47
版主,请问这个m,n代表的是哪个参数呢?

就是用lambda定义了一个自定义函数,m和n就是它的俩参数。你看后面调用的时候F(第一参数,第二参数)输入的参数对应的就是m和n

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-9-4 10:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
shaowu459 发表于 2023-9-2 18:01
就是用lambda定义了一个自定义函数,m和n就是它的俩参数。你看后面调用的时候F(第一参数,第二参数)输入 ...

之前习惯了lambda的参数由reduce,map等内置函数的输入,突然自定义输入参数,而且还在后面的时候才调用,不适应了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-4 11:14 | 显示全部楼层
onthetrip 发表于 2023-9-4 10:14
之前习惯了lambda的参数由reduce,map等内置函数的输入,突然自定义输入参数,而且还在后面的时候才调用, ...

嗯,一般用的时候不多。如果发现后面多次调用相同模式的计算,可以考虑定义一个lambda,后面直接用就好了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-13 22:54 | 显示全部楼层
本帖最后由 shaowu459 于 2023-9-13 23:10 编辑

链接中的20楼是循环中操纵和更新x的例子。
图片.jpg
参考公式之一简要说明如下(MAP可以去掉,去重合并在BYCOL里进行):
=MAP(
    REDUCE(
        A1:B1,
        ROW(2:14),
        LAMBDA(x, y,
            LET(
                s, INDEX(A:B, y, ),     逐行提取源数据
                t, BYROW(          对x中的每行进行判断,判断当前行数据s是否在x中出现过,在哪行出现过
                    x,
                    LAMBDA(u, COUNT(FIND(TEXTSPLIT(CONCAT(s & "、"), , "、", 1), u)))  出现过的行返回非0数字,没出现过返回0
                ),
                VSTACK(
                    FILTER(x, t = 0),   筛选当前行数据在x中没有出现过的行,下面堆积出现过的行合并后的结果
                    BYCOL(FILTER(x, t, G1:H1), LAMBDA(v, CONCAT(v & "、"))) & s   筛选出当前行数据在x中出现过的行,按列合并后再并上当前行数据s
                )
            )
        )
    ),
    LAMBDA(o, TEXTJOIN("、", , UNIQUE(TEXTSPLIT(o, , "、"))))   最后使用MAP函数循环每个值,去重后合并。
)

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-15 09:46 | 显示全部楼层
本帖最后由 shaowu459 于 2023-9-15 09:52 编辑

横向堆叠x,操作和更新x值。

已知A-J列,每两列代表一个闭合的区间。请你排除空格以后合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
图片.png


参考公式如下:
  1. =MID(TEXTJOIN({"],[",","},,REDUCE(-9,ROW($1:$5),LAMBDA(x,y,LET(t,INDEX(SORT(WRAPROWS(A2:J2,2)),y,),k,@t>MAX(x)+1,HSTACK(DROP(x,,k-1),IF(k,t,MAX(t,x)))))))&"]",5,99)
复制代码
图片.jpg
图片.png

公示简要说明如下:
=MID(
    TEXTJOIN(
        {"],[", ","},      用[]合并REDUCE生成的字符串,合并符可以重复使用
        ,
        REDUCE(
            -9,            数据区域最小是0,初始值设定一个比较大的负数,保证第一个数据肯定堆叠进数组
            ROW($1:$5),    因为有5组数据,提取5次
            LAMBDA(x, y,
                LET(
                    t, INDEX(SORT(WRAPROWS(A2:J2, 2)), y, ),    将数据按2个一行折叠,并按每组第一个数值排序。按行逐行提取
                    k, @t > MAX(x) + 1,        判断当前行第一个是否大于x中的最大值+1的结果
                    HSTACK(DROP(x, , k - 1), IF(k, t, MAX(t, x)))   如果当前行第一个大于x中最大值+1的结果,肯定是一个新组,直接横向堆叠在x右侧。如果不大于,则将当前x最右侧值更新为x最右侧值和当前行中最大的值
                )
            )
        )
    ) & "]",
    5,
    99
)

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-16 22:40 | 显示全部楼层
本帖最后由 shaowu459 于 2023-9-16 23:13 编辑

利用X行数计数,一定条件时将X行数归一后继续计数。

如下图,需要将A列的字符串压缩,压缩规则是将连续相同的大写字母统计个数。如字符串“AABA”结果为“A2B1A1”,因为开始A连续出现2次所以返回“A2”,B出现一次所以返回“B1”,后面再出现的A要重新计数,出现了一次,所以返回“A1”。最终效果如C列所示:
图片.png

参考公式如下:
  1. =@REDUCE("",ROW($1:99),LAMBDA(x,y,LET(s,MID(A1,y,1),IF(s=MID(A1,y+1,1),VSTACK(x,0),@x&s&ROWS(x)))))
复制代码
图片.png
图片.png

公式简要说明如下:

=@REDUCE(           X的第一个元素存储结果字符串,所以使用@提取结果字符串中的第一个元素
    "",             初始值设定为空文本,用于连接后续大写字母和出现次数的字符串
    ROW($1:99),     足够大的从1开始的自然数序列,用于逐个提取字符串中的字符
    LAMBDA(x, y,
        LET(
            s, MID(A1, y, 1),        逐个提取A1的每个字符
            IF(
                s = MID(A1, y + 1, 1),   将提取的当前字符和下一个字符对比
                VSTACK(x, 0),            如果当前字符和下一个字符相同,也就是连续出现,那么就在X下堆积一个数字(具体数值没用),使X增加一行。
                @x & s & ROWS(x)         如果当前字符和下一个字符不同,也就是中断了,那么就提取X顶端的字符串和当前字符s及当前X行数(相同字符个数)连接。这样X就又变成一行了。超过字符串原本长度之后就都是空,都是相同的空,所以不会触发对空计数的问题。
            )
        )
    )
)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-9-16 22:50 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个@用的真好,叹为观止
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 10:35 , Processed in 0.047235 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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