有没有办法做到这一点,即将 Foo
、FOO
和fOO
变成Bar
、BAR
、 和bAR
,而不必在函数中单独输入所有可能的排列。
=SUBSTITUTE(A1,"foo","bar")
区分大小写,SUBSTITUTE(lower(A1),"foo", "bar")
适用于某些应用程序,但会从 A1 中删除任何现有的大小写区别;因此FoofooFOO
将转到barbarbar
。显然,您可以使用多个替换来捕获所有出现的情况,但有时这真的很麻烦。
非常感谢。
答案1
这是一个丑陋但实用的答案。
适用于任意两个相同长度的字符串。
我只是参加讨论,希望有人能想出更好的解决方案(也许是数组公式?)
需要辅助列。辅助列的顶行用于索引。
公式:
A2 : (original string)
C1 : blank, or 0 (needed for next column)
C2:C... : =SUBSTITUTE(UPPER(A2),"FOO","BAR")
D1 : =B1+1
D2:D... : =IF(EXACT(MID($A2,C$1,1),UPPER(MID($A2,C$1,1))),MID($B2,C$1,1),LOWER(MID($B2,C$1,1)))
B2 : concatenate (or textjoin if you're using new excel)
拖动 D 列,直到有足够多的列。目测,或使用它=max(len(A:A))
来找到最大长度。
答案2
既然 Excel 支持 Lambda 函数,那么非 VBA 答案就是:
SUBSTITUTE_I = LAMBDA(Text, OldText, NewText, [InstanceNum],
IFS(
Text = "", "",
OldText = "", Text,
TRUE, LET(
_oldLen, LEN(OldText),
_maxInstance, INT(LEN(Text) / _oldLen),
_pos, SCAN(0, SEQUENCE(1, _maxInstance),
LAMBDA(_acc, _curr,
IF(_acc = "", "", IFERROR(SEARCH(OldText, Text, _acc + 1), ""))
)
),
_count, COUNT(_pos),
_instance, N(InstanceNum),
IFS(
_count = 0, Text,
ABS(_instance) > _count, Text,
_instance > 0, REPLACE(Text, INDEX(_pos, 1, _instance), _oldLen, NewText),
_instance < 0, REPLACE(Text, INDEX(_pos, 1, _count + _instance + 1), _oldLen, NewText),
TRUE, LET(
_lenDiff, LEN(NewText) - _oldLen,
_nPos, TAKE(_pos, 1, _count) + SEQUENCE(1, _count, 0, _lenDiff),
REDUCE(Text, _nPos,
LAMBDA(_acc, _curr,
REPLACE(_acc, _curr, _oldLen, NewText)
)
)
)
)
)
)
);