单元格A1包含很长的公式,但没有“=”如何计算A2中的公式?无VBAP.S.:A1的公式真的很长:TEXTJOIN(", ";;IF(INDIRECT("E"&AA2&":E"&AB2)=INDIRECT("AA"&ROW());INDIRECT("B"&AA2&":B"&AB2);""))我尝试使用INDIRECT函数,但评估的响应是错误“#REF!”
TEXTJOIN(", ";;IF(INDIRECT("E"&AA2&":E"&AB2)=INDIRECT("AA"&ROW());INDIRECT("B"&AA2&":B"&AB2);""))
2vuwiymt1#
所以ms365有一种简洁的方式来使用古老的XLM Macro EVALUATE()函数,如果你想通过命名的管理器调用它的话。例如,创建一个命名的公式'z'并引用:
EVALUATE()
=LAMBDA(x,EVALUATE(x))
如果你稍微玩一下,你会注意到你可以引用各种字符串格式的公式,例如=z("TEXTJOIN("", "",,B3:B6)"),如果屏幕截图返回1, 2, 3, 4。这在很多情况下都是正确的,但是当在混合中使用INDIRECT()时就不是这样了。(至少在我的测试中)一个'#REF'错误。我相信我在某个地方读到过EVALUATE()在试图解析包含INDIRECT()的字符串时会出错,我不确定这是否正确。如果我找到更多信息,我会更新我的答案。在此之前,我使用了一个公式来绕过这个问题:
=z("TEXTJOIN("", "",,B3:B6)")
1, 2, 3, 4
INDIRECT()
B1中的公式:
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中的公式:
INDIRECT(
REDUCE()
VSTACK()
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'函数中。你也可以一次创建整个东西:
TEXTJOIN()
=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函数将要求您选择启用宏的文件类型。
1条答案
按热度按时间2vuwiymt1#
所以ms365有一种简洁的方式来使用古老的XLM Macro
EVALUATE()
函数,如果你想通过命名的管理器调用它的话。例如,创建一个命名的公式'z'并引用:如果你稍微玩一下,你会注意到你可以引用各种字符串格式的公式,例如
=z("TEXTJOIN("", "",,B3:B6)")
,如果屏幕截图返回1, 2, 3, 4
。这在很多情况下都是正确的,但是当在混合中使用INDIRECT()
时就不是这样了。(至少在我的测试中)一个'#REF'错误。我相信我在某个地方读到过EVALUATE()
在试图解析包含INDIRECT()
的字符串时会出错,我不确定这是否正确。如果我找到更多信息,我会更新我的答案。在此之前,我使用了一个公式来绕过这个问题:B1
中的公式:这个公式背后的想法很简单,但是执行起来相当棘手,我不确定它是否足够强大。我想在每次出现
INDIRECT(
之后寻找平衡的括号,因此在REDUCE()
中使用VSTACK()
来允许“ticker”。一旦所有适当的括号都被替换为其他可识别的字符,我们可以使用C1
中的公式:在这里,我们按已识别的字符进行拆分,取第二列(
INDIRECT()
函数正确括号内的每个子字符串),将每个值放入'z'函数中,然后简单地将第一列TEXTJOIN()
与我们通过'z'找到的分隔符一起返回,最后我们再次将结果字符串放入'z'函数中。你也可以一次创建整个东西:
好了。在没有VBA的情况下计算公式。但是,如果您希望保存工作簿,则以定义的名称存储的Excel 4.0函数将要求您选择启用宏的文件类型。