【问题标题】:Excel Substitute a substring in cell (sheet A) by the corresponding string in "lookup" (sheet B)Excel 将单元格(工作表 A)中的子字符串替换为“查找”(工作表 B)中的相应字符串
【发布时间】:2017-08-24 13:04:51
【问题描述】:

如何在 MS Excel 15.4 中执行此操作

我想将A列处理成B列

Column A                  | Column B
----------------------------------------------------------------------
one, 1, two, 2, three, 3  | one apple, two bananas, three strawberries
one, 1, four, 4           | one apple, four oranges
.......................
... many other rows ...
.......................
two, 2, four, 4, three, 3 | two bananas, four oranges, three strawberries    

A 列 可以在查找表中有 n 个匹配的子字符串。

我有另一张表(查找表),其中包含将 A 列 中的文本替换为

的内容
Match col | Replace col
----------------------------
one, 1    | one apple
two, 2    | two bananas
three, 3  | three strawberries
four, 4   | four oranges
... and many more ...

我想用查找表的 替换 col 值替换 A 列 中的所有子字符串

看起来我可以将VLOOKUPSUBSTITUTE 结合起来,但我正在努力解决它

【问题讨论】:

  • 你试过什么?您是否需要将返回的值放在 B 列中? (如果你可以先做 B,然后是 C,然后是 D,​​等等,这可能会更容易一些,具体取决于有多少结果)。每个单元格总是返回三个,还是仅在您的示例中?
  • 你可以使用辅助表/列吗?在运行Substitute 公式后,我正在考虑将您的数据通过文本拆分为列,该公式将使您的A 列变为one, 1; two, 2; three, 3。这可能对你有用吗?但是如果你有 4 个或更多的替代品,它可能会变得笨拙。为此,您可能需要 VBA。
  • @BruceWayne 我把引用表放在 K1:L4 中,然后在 B1 中使用它:=TEXTJOIN(",",TRUE,IF(ISNUMBER(SEARCH($K$1:$K$4,A1)),$L$1:$L$4,"")) 这是一个数组公式,所以 Ctrl-Shift-Enter。但它需要 Office 365 Excel 订阅。 B2 中的另一个(每个单元格):=IFERROR(INDEX($L:$L,AGGREGATE(15,6,ROW($K$1:$K$4)/(ISNUMBER(SEARCH($K$1:$K$4,$A1))),COLUMN(A:A))),"") 上下拖动。
  • @BruceWayne 注意,将输出按参考列表的顺序而不是 A 列的顺序。

标签: excel excel-formula


【解决方案1】:

我有一个相当笨拙的解决方案,但如果您不介意采取一些额外的步骤,它会为您工作。 (不需要 VBA)。

使用您的原始数据,突出显示所有数据并使用逗号分隔符执行Text to Columns。将目的地设置为您喜欢的任何地方。我选择了它右边的列(所以,B2):

所以现在你把它全部分开了。

我将VLOOKUP() 表放在“Sheet2”中:

回到 Sheet1,在 I2 中,我使用了这个公式:
=IFERROR(VLOOKUP(TRIM(B2)&", "&TRIM(C2),Sheet2!$A$1:$B$4,2,FALSE),"")

然后向右拖动。您将拥有一些可以隐藏/删除的空列,然后复制所有数据。

【讨论】:

  • 对不起,你让我思考如何做到这一点,并不是想偷你的风头。我的公式基本上和你的整个过程一样。
  • 您想要一些非常酷的东西,将 A 列上的参考数据排序并将其放入 B1 并复制下来:=TEXTJOIN(",",TRUE,IFERROR(LOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE($A1,",",REPT(" ",999)),({1,2,3}-1)*2*999+1,2*999),REPT(" ",999),",")),Sheet2!A:A,Sheet2!B:B),"")) 它会按照 A1 中的数据顺序将其放入一个单元格中。跨度>
  • @ScottCraner 哇,太棒了!非常感谢您对此的 cmets/提示。我已经标记了它,所以如果我需要做类似 OP 的事情,我可以在将来回来。干杯!
  • 我还没说完:这个是可变的,根据每行中的条目数:=TEXTJOIN(",",TRUE,IFERROR(LOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE($A1,",",REPT(" ",999)),(ROW(INDIRECT("1:" & INT((LEN($A1)-LEN(SUBSTITUTE($A1,",","")))/2)+1))-1)*2*999+1,2*999),REPT(" ",999),",")),Sheet2!A:A,Sheet2!B:B),""))再次数组公式。
【解决方案2】:

在单个单元格中进行;

=IFERROR(VLOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE($A1,",",REPT(" ",999)),(COLUMN(A:A)-1)*2*999+1,2*999),REPT(" ",999),",")),Sheet2!$A:$B,2,FALSE),"")


如果您订阅了 Office 3651 excel,您可以使用此数组公式将其全部放在一个单元格中:

=TEXTJOIN(",",TRUE,IFERROR(LOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE($A1,",",REPT(" ",999)),(ROW(INDIRECT("1:" & INT((LEN($A1)-LEN(SUBSTITUTE($A1,",","")))/2)+1))-1)*2*999+1,2*999),REPT(" ",999),",")),Sheet2!A:A,Sheet2!B:B),""))

作为数组公式,退出编辑模式时必须使用 Ctrl-Shift-Enter 而不是 Enter 来确认。如果操作正确,Excel 会在公式周围加上{}

需要注意的是,参考数据必须在查找列上排序:


1 如果您没有 Office 365 但想使用此公式,您可以将我的答案 HERE 中的代码放置在附加到的模块中,该代码将模仿 TEXTJOIN()工作表。然后使用上述公式

【讨论】:

  • Yesss! - 我试图弄清楚如何使用该公式组合,但无法弄清楚如何使 Substitute() 部分动态化。如果要返回总是三件事,那我就到了。这让我很困惑,因此我在上面的回答相当笨拙。我很高兴在这件事上给你我的雷声,干得好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多