VBA生成的公式被Excel自动添加@符号导致失效的问题求助
VBA生成的公式被Excel自动添加@符号导致失效的问题求助
嗨,太懂你这种被Excel“自作聪明”坑到的烦躁感了!这个@是Excel的隐式交集运算符,是动态数组版本Excel(365/2021+)的默认“贴心行为”——它觉得你在普通单值单元格里用了数组范围,就自动加@把范围简化成当前行的单值引用,直接把你要的数组运算逻辑搞崩了。
先给你捋明白为啥只在第一个范围加@:你公式里第一个Sheet3!$A$1:$A$749是放在SEARCH的参数里,Excel默认会把这个范围按隐式交集处理(只取当前行对应的单元格);但第二个范围是IF的返回值,Excel能识别出这里需要数组输出,所以没乱加@。
给你两个最靠谱的解决办法,按需选就行:
办法1:用VBA的数组公式属性直接赋值
把原来设置单元格公式的Formula属性改成FormulaArray属性,这样VBA会直接把公式设置成数组公式,Excel就不会画蛇添足加@了。
比如你原来的代码可能是:
Range("B2").Formula = MyFormula
改成:
Range("B2").FormulaArray = MyFormula
这样生成的公式会被Excel直接识别为数组运算,完全不会出现@符号,直接就能正常跑起来。
办法2:给第一个范围套括号强制数组上下文
如果你的Excel版本支持动态数组,也可以在VBA生成公式的时候,给第一个Keywords范围外面套一层括号,强制Excel把它当成数组处理,而不是隐式交集。
修改你的VBA公式生成代码:
MyFormula = "=TEXTJOIN(" & Chr(34) & ", " & Chr(34) & ",TRUE,IF(ISNUMBER(SEARCH((" & Keywords.Address(ReferenceStyle:=xlR1C1, External:=True) & ")," & "RC" & ColumnNumber & "))," & Keywords.Address(ReferenceStyle:=xlR1C1, External:=True) & "," & Chr(34) & Chr(34) & "))"
注意这里给Keywords.Address外面加了( ),生成的单元格公式会变成:
=TEXTJOIN(", ",TRUE,IF(ISNUMBER(SEARCH((Sheet3!$A$1:$A$749),$A2)),Sheet3!$A$1:$A$749,""))
括号会让Excel明确知道这个范围要按数组逻辑处理,自然就不会乱加@了。
你可以先试试第一个办法,最直接省心;如果用的是新版Excel,第二个办法也一样好用~
备注:内容来源于stack exchange,提问作者aggi
相关产品推荐
相关产品推荐

