excel 计算另一个单元格中的公式(不带相等(=)字符(NO VBA))

gudnpqoy  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(134)

单元格A1包含很长的公式,但没有“=”如何计算A2中的公式?
无VBA
P.S.:A1的公式真的很长:
TEXTJOIN(", ";;IF(INDIRECT("E"&AA2&":E"&AB2)=INDIRECT("AA"&ROW());INDIRECT("B"&AA2&":B"&AB2);""))
我尝试使用INDIRECT函数,但评估的响应是错误“#REF!”

2vuwiymt

2vuwiymt1#

所以ms365有一种简洁的方式来使用古老的XLM Macro EVALUATE()函数,如果你想通过命名的管理器调用它的话。例如,创建一个命名的公式'z'并引用:

=LAMBDA(x,EVALUATE(x))

如果你稍微玩一下,你会注意到你可以引用各种字符串格式的公式,例如=z("TEXTJOIN("", "",,B3:B6)"),如果屏幕截图返回1, 2, 3, 4。这在很多情况下都是正确的,但是当在混合中使用INDIRECT()时就不是这样了。(至少在我的测试中)一个'#REF'错误。我相信我在某个地方读到过EVALUATE()在试图解析包含INDIRECT()的字符串时会出错,我不确定这是否正确。如果我找到更多信息,我会更新我的答案。在此之前,我使用了一个公式来绕过这个问题:

B1中的公式:

=LET(x,SUBSTITUTE(A1,"INDIRECT(","ζ"),TAKE(REDUCE(VSTACK(x,0),SEQUENCE(LEN(x)),LAMBDA(y,n,LET(r,TAKE(y,1),s,DROP(y,1),q,MID(r,n,1),SWITCH(q,"ζ",VSTACK(r,1),"(",IF(s,VSTACK(r,s+1),y),")",IF(s-1,VSTACK(r,s-1),VSTACK(REPLACE(r,n,1,"ξ"),0)),y)))),1))

这个公式背后的想法很简单,但是执行起来相当棘手,我不确定它是否足够强大。我想在每次出现INDIRECT(之后寻找平衡的括号,因此在REDUCE()中使用VSTACK()来允许“ticker”。一旦所有适当的括号都被替换为其他可识别的字符,我们可以使用C1中的公式:

=z(LET(a,TEXTSPLIT(B1,"ζ","ξ"),b,TEXTJOIN(IFERROR(MAP(DROP(a,,1),LAMBDA(c,z(c))),""),,TAKE(a,,1)),b))

在这里,我们按已识别的字符进行拆分,取第二列(INDIRECT()函数正确括号内的每个子字符串),将每个值放入'z'函数中,然后简单地将第一列TEXTJOIN()与我们通过'z'找到的分隔符一起返回,最后我们再次将结果字符串放入'z'函数中。
你也可以一次创建整个东西:

=z(LET(a,TEXTSPLIT(@LET(x,SUBSTITUTE(A1,"INDIRECT(","ζ"),TAKE(REDUCE(VSTACK(x,0),SEQUENCE(LEN(x)),LAMBDA(y,n,LET(r,TAKE(y,1),s,DROP(y,1),q,MID(r,n,1),SWITCH(q,"ζ",VSTACK(r,1),"(",IF(s,VSTACK(r,s+1),y),")",IF(s-1,VSTACK(r,s-1),VSTACK(REPLACE(r,n,1,"ξ"),0)),y)))),1)),"ζ","ξ"),b,TEXTJOIN(IFERROR(MAP(DROP(a,,1),LAMBDA(c,z(c))),""),,TAKE(a,,1)),b))

好了。在没有VBA的情况下计算公式。但是,如果您希望保存工作簿,则以定义的名称存储的Excel 4.0函数将要求您选择启用宏的文件类型。

相关问题