用括号将可变值字符串括在一个较大的字符串中,所有值都包含在单个单元格中

问题描述 投票:0回答:1

我的单元格包含!后跟长度不同的字母数字字符串。

我想改变!到 NOT( 这相对容易,我遇到的问题是字母数字字符串后面的右括号

!AlphaNumericString 变为 NOT(AlphaNumericString)

更改前的单元格示例,
与(!BI,OR(Z1,Z2,Z102,Z103,Z104,Z306))

!L1M23 或(NP001 和 !CA);
Z200 和 !VP100;
!N001L010D132

我希望这些细胞成为,
与(非(BI),或(Z1,Z2,Z102,Z103,Z104,Z306))

非(L1M23) 或(NP001 和 非(CA));
Z200 和 非 (VP100);
不是(N001L010D132)

感叹号后面始终跟有 1 个字符,那么它将是一系列字母数字字符,并且感叹号字符串始终以以下之一结尾

空间
)
;
,
或者它可以以单元格中的最后一个字符结束,

按照上面的例子

希望这是有道理的。

我更喜欢宏,这样它就可以从 EXCEL 365 向后兼容到 2010 年,但如果有简单的公式,那就太棒了。

谢谢 姆巴特67

excel vba excel-formula excel-2010
1个回答
0
投票

但是如果有简单的公式,那就太棒了

并非如此,但在 Office 365 中我们可以组合公式来获得您想要的结果:

=MAP(A1:A2, 
 LAMBDA(a,
     REDUCE(a,SEQUENCE(LEN(a)-LEN(SUBSTITUTE(a,"!",))),
     LAMBDA(r,_,
LET(x,MID(r,FIND("!",r),LEN(r)),
    y,TOROW(HSTACK(FIND({" ","(",";",","},x),LEN(x)+1),2),
IFERROR(
        SUBSTITUTE(
                   REPLACE(r,
                           MIN(y+FIND("!",r)-1),
                           ,
                           ")"),
                   "!",
                   "NOT(",
                   1),
        r))))))

基本上它会检查在初始文本字符串中找到

!
的次数,以设置reduce的迭代次数,我将其声明为
_
,因为它用于迭代,但在函数中不再调用。 初始文本字符串本身被声明为
r
.

迭代 我们在字符串

!
中搜索第一个找到的
r
,并找到最接近的
 
)
;
,
字符或第一个找到的
!
之后的字符串末尾(以哪个为准)首先),在其后面添加一个
)
并将第一个计数
!
替换为
NOT(
。 如果出现上述错误,则保留
r
,如果不是则替换/替代的
r
成为新的
r
并重复迭代
_
次。

我使用

MAP
一次在各个单元格上循环公式,但如果需要,您可以用
MAP/LAMBDA
替换
LET(a,A1,REDUCE(..
部分,使其适用于单个单元格。

© www.soinside.com 2019 - 2024. All rights reserved.