使用其他列中的参数进行多次顺序替换

Joa*_*oao 5 worksheet-function microsoft-excel

在 Excel 工作表中:

A 列都填充了需要更新的随机文本值(例如,单词?/?句子)。

B 列和 C 列包含指定需要对 A 列进行的更改的字符串。 B 列用旧文本填充每个单元格,用新文本填充 C 列,每一行彼此对应,即,文本B1 需要替换为文本 C1,B2 需要更改为 C2 文本。在 B 列中,要替换的内容之一是 a "

B 列中没有重复值。不过,C 列中的单元格可能会重复。替换必须遵守它们的书写顺序。D列是结果。

A 列中的每个单元格都需要从 B1-C1、B2-C2、B3-C3 等经过这个替换,直到 BC 列中的替换命令结束。因此,在给出最终结果之前,A 列中的文本将更改多次,并且在所有更改后仅在 D 列中显示结果。


例子:

Cell A1: Hello!
Cell A2: How are you "John"?
Cell A3: "Nice! thanks"
Run Code Online (Sandbox Code Playgroud)
Cell B1: !                           Cell C1: &
Cell B2: &                           Cell C2: .
Cell B3: "                           Cell C3:    (empty)
Cell B4: ?                           Cell C4: #
Cell B5: Nice. thanks                Cell C5: Fine, THANKS.
Run Code Online (Sandbox Code Playgroud)

因此,单元格 A1,即Hello!,将被 B1-C1 更改,因此Hello&。然后将更改 B2-C2 以更改临时结果,Hello&因此将Hello.. 然后将改变B3,C3,然后会做B4,C4,然后B5,C5,以及将会发生什么,因为"在不存在Hello.

在此之后,结果 D1 是Hello.

然后它会做 A2 改变 B1-C1(无事可做),然后应用到这个会做 B2-C2(无事可做),然后 B3-C3 将导致How are you John?(即,引号字符将被删除),然后将做 B4-C4 这将使How are you John#,然后 B5-C5 在这里没有什么可做的。

所以结果 D2 是How are you John#

同理,A3 的值首先"Nice! thanks"会从 B1-C1 变化,变成"Nice& thanks",然后 B2-C2 变成"Nice. thanks",然后 B3-C3 变成Nice. thanks(同样,引号将被删除),然后在 B4-C4 和 B5 中无所事事-C5 将使其最终成为Fine, THANKSD3。


结果:

D1: Hello.
D2: How are you John#
D3: Fine, THANKS.
Run Code Online (Sandbox Code Playgroud)

D 列中的公式是什么,用于在一行中进行多次替换,遵守 B 列和 C 列中的行顺序,允许 BC 列有 300 多行?(如果可能的话,我想要一个纯粹基于公式的解决方案,而不是 VBA。)

上面的样本数据和处理流程图

G-M*_*ca' 2

你可以做你所描述/说明的事情

\n\n
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1, B$1, C$1), B$2, C$2), B$3, C$3), B$4, C$4), B$5, C$5)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果将以上内容放入单元格\xc2\xa0D1并向下拖动/填充,\nA1将更新为A2A3等,\n但替换字符串参数(B$1C$1B$2C$2等)\n不会改变。\xc2\xa0 \n我相信 \xe2\x80\x99 显然\n这会在 上执行B1\xe2\x80\xaf\xe2\x86\x92\xe2\x80\xafC1替换A1,\n然后执行B2\xe2\x80\xaf\xe2 \x86\x92\xe2\x80\xafC2替换\n第一个替换的结果,\n然后执行B3\xe2\x80\xaf\xe2\x86\x92\xe2\x80\xafC3替换\n第二个替换的结果替换等。

\n\n

这对于 5 次替换来说很尴尬,\n并且对于更多替换很快就会变得笨拙。\xc2\xa0\n如果您可能想要进行多次替换(例如,最多 312 个),\n请使用辅助列:

\n\n
    \n
  • 设置AA1

    \n\n
    =SUBSTITUTE(A1, INDEX($B:$B, COLUMN()-COLUMN($Z1)), INDEX($C:$C, COLUMN()-COLUMN($Z1)))\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这相当于=SUBSTITUTE(A1, B1, C1),\n但它动态获取B1C1值\n通过获取列号 ( AA\xe2\x80\xaf\xe2\x86\x92\xe2\x80\xaf27)\n并减去 26(列的列号\n) xc2\xa0 Z),\n并使用结果 (1) 作为B和\xc2\xa0C列中的行号。

  • \n
  • 拖动/填充AA1AB1,所以它变成

    \n\n
    =SUBSTITUTE(B1, INDEX($B:$B, COLUMN()-COLUMN($Z1)), INDEX($C:$C, COLUMN()-COLUMN($Z1)))\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    并更改B1AA1,所以它变成

    \n\n
    =SUBSTITUTE(AA1, INDEX($B:$B, COLUMN()-COLUMN($Z1)), INDEX($C:$C, COLUMN()-COLUMN($Z1)))\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这相当于=SUBSTITUTE(AA1, B2, C2),\nwhich\xc2\xa0is\xc2\xa0equivalent\xc2\xa0to\xc2\xa0 =SUBSTITUTE(SUBSTITUTE(A1, B1, C1), B2, C2)

  • \n
  • 拖动/填充AB1到。\xc2\xa0\n这将是\n应用从到 的所有替换LZ1的结果\n(因为是第 12 个字母,而 12\xc3\x9726 是 312)。A1B1:C1B312:C312L
  • \n
  • 设置D1=LZ1, 以反映所有替换的结果。
  • \n
  • 拖动/填充D1并向AA1:LZ1下直到 column\xc2\xa0 中有数据A
  • \n
\n