V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
whitefable
V2EX  ›  问与答

Excel 关于 concat 和 concatenate 对数组常量运算结果的一个问题

  •  
  •   whitefable · 327 天前 · 486 次点击
    这是一个创建于 327 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景及当前情况描述如下:
    首先使用 FILTER 函数得到一个数组结果,如 A 、E 、G 为结果值,则长度为 3 。
    需求是:
    希望在一个单元格中得到结果为 "A","E","G" 这样的拼接值。
    这个需求其实用现在的函数能处理,处理是使用 CONCATENATE 为每个值拼接上双引号,然后再使用 TEXTJOIN 插入分隔符,如 TEXTJOIN(",",TRUE,CONCATENATE(CHAR(34),FILTER 结果,CHAR(34)))。

    疑问是:
    现在 Excel 将 CONCATENATE 函数使用 CONCAT 进行替代,本想使用 CONCAT 函数进行处理,但这里发现了对于像 FILTER 返回结果的这种数组值这两个函数会得到不同的结果。
    - CONCAT 会直接合并成一个字符串:"AEG",这符合该函数描述但合并后我就无法对数组中每个元素都进行相同的处理;
    - 而 CONCATENATE 函数则会对数组中每个元素应用同一个操作并返回仍然是一个数组可以进行后续运算。
    此处 CONCAT 替换 CONCATENATE 函数我能理解,也的确更符合字符串连接变得更简单。但 CONCATENATE 作为过时函数,不知道在新的函数集合里面有没有其他函数能够实现类似 CONCATENATE 这样的行为,即为数组中每个元素应用同样的操作,并依然返回一个数组这样呢?

    还望各位 Excel 大神给出一点指引,谢谢^_^
    5 条回复    2023-06-04 01:02:29 +08:00
    512357301
        1
    512357301  
       327 天前 via Android
    用 Ctrl shift enter 组合键试试呢,输入完公式按组合键,看下会不会生效。没开电脑,盲猜的
    crashdada
        2
    crashdada  
       327 天前   ❤️ 1
    =CONCAT(FILTER(CHAR(34) & A1:A3 & "," & CHAR(34),A1:A3<>"",""))
    试试这样行不行
    snw
        3
    snw  
       327 天前   ❤️ 1
    简单的做法,直接用&连接就行:
    =TEXTJOIN(",",1,CHAR(34)&FILTER 结果&CHAR(34))

    如果你对数组有执念,你可以用 MAP+LAMBDA 来显式实现“对数组中每个元素应用同一个操作并返回仍然是一个数组”的操作,虽然在这个例子中没必要:
    =TEXTJOIN(",",1,MAP(FILTER 结果,LAMBDA(x,CHAR(34)&x&CHAR(34))))

    然后解释一下 CONCATENATE 和 CONCAT 的区别:
    * CONCATENATE 起初的设计是每个参数只接受单个值,虽然后来可以接受区域引用,但这只是配合 CSE (ctrl+shift+enter)数组的操作,行为是对引用区域中每个(组)值遍历执行 CONCATENATE 操作; Excel 引入动态数组之后 CONCATENATE 继续沿用 CSE 数组的行为。
    * CONCAT 起初的设计就接受动态数组,如果参数接受了动态数组,则先把动态数组展开为一系列单个值,最后再把所有参数展开的所有值串起来。
    whitefable
        4
    whitefable  
    OP
       326 天前
    @crashdada 这个写法我明白了,其实就是将 CHAR(34)连接的运算放在 FILTER 的输出参数中先进行运算再输出。这样的确可以,其实这里也暗含了 & 这个操作符就是我想寻找的替代 CONCATENATE 运算结果的方法。不过后面 3 楼给出的答案算是完全解释比较明白,而且方案是一致的。这里还是非常感谢
    whitefable
        5
    whitefable  
    OP
       326 天前
    @snw 的确,而且 & 操作符也就是我想寻求的东西。因为 CONCANTENATE 已被官方标记过时,所以我觉得应该还是有方法可以达到同样目的但我不清楚;至于使用 CONCANTENATE 可以我也猜测到我只是刚好利用了一个可能设计原意并不是这样使用的特性,毕竟替代版的 CONCAT 的行为并非如此。

    数组方面其实倒是没执念,只是好奇对于一个过时函数实现的功能,按兼容性为王的微软应该是有一般方法可以做到的,但找不到就还是很好奇如何做才能是符合设计理念来使用。在这里例子中固然是没必要使用 MAP+LAMBDA 来显示实现数组的操作,但还是很开心了解到了这种方法,后续使用说不定会使用上。

    关于这两个函数的解释真的非常感谢可以一下子命中我所好奇了解的地方,看完我也的确更明白了。本身也是写程序的我对这个非常好奇,但又的确工作中使用较少导致对 Excel 了解甚少,只是抱着好奇之心来寻求一下答案,能够得到一个从原理上解释的答案真的非常满足。
    再次感谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2777 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:41 · PVG 23:41 · LAX 08:41 · JFK 11:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.