在一行中查找一个string,并在Excel中删除它

我有一个类似于下面的表格

si id abcde 1 123 abc bcd abc def efg 2 234 bcd cde def efg fgh 3 345 cde efg efg abc ghi 

我想要做的是发现如果string“abc”存在于一行,如果存在删除它,并复制后续列到其位置,即在第一行“abc”存在于列A,所以我想删除它并移动到Col AD​​。 在第二行中,“abc”不存在,所以这一行应该保留原样,但在第三行中,“abc”在Col D中,因此它应该被删除,并且“ghi”应该被粘贴在它的位置上,从而离开列E空。

我能用MATCH做到这一点,但这里的MATCHMATCH只能find第一个出现,而不是后面的。

有没有办法使用Excel的公式,而不是vba。

您不能使用公式(在注释中提到)退出数据,但是如果您希望自动删除项目的数据副本在原始表格被修改时更新表格,则可以这样做。 我会将结果数据粘贴在input数据的下方,但是如果您想要,可以将其粘贴在另一个表格上。

我们从这开始:

  | A | B | C | D | E | F | G | ---+-------+-------+-------+-------+-------+-------+-------+-- 1 | si id abcde 2 | 1 123 abc bcd abc def efg 3 | 2 234 bcd cde def efg fgh 4 | 3 345 cde efg efg abc ghi 5 | 6 | 7 | 8 | 9 | 10 | 

第一步:在A6中put =A1

步骤2:将A6复制到B6:G6,A7:A10和B7:B10

现在工作表看起来像这样:

  | A | B | C | D | E | F | G | ---+-------+-------+-------+-------+-------+-------+-------+-- 1 | si id abcde 2 | 1 123 abc bcd abc def efg 3 | 2 234 bcd cde def efg fgh 4 | 3 345 cde efg efg abc ghi 5 | 6 | si id abcde 7 | 1 123 8 | 2 234 9 | 3 345 10 | 

步骤3:在C7中input这个数组公式(记得按Alt-Shift-Enter而不是按Enter键):

 =IFERROR(INDEX($C2:$G2,1,SMALL(IF($C2:$G2<>"abc",COLUMN($C2:$G2)-2),COLUMN(A1))),"") 

步骤4:将C7复制到D7:G7和C8:G9

现在工作表看起来像这样:

  | A | B | C | D | E | F | G | ---+-------+-------+-------+-------+-------+-------+-------+-- 1 | si id abcde 2 | 1 123 abc bcd abc def efg 3 | 2 234 bcd cde def efg fgh 4 | 3 345 cde efg efg abc ghi 5 | 6 | si id abcde 7 | 1 123 bcd def efg 8 | 2 234 bcd cde def efg fgh 9 | 3 345 cde efg efg ghi 10 | 

怎么运行的:

=IF($C2:$G2<>"abc",COLUMN($C2:$G2)-2)在值不是abc的地方生成一个数值数组,其值为abc。 -2很重要,因为数据左侧有两个标题列。

=SMALL(IF($C2:$G2<>"abc",COLUMN($C2:$G2)-2),COLUMN(A1))返回数组中返回的第n个最小数 – 它跳过所有的FALSE值。

=INDEX($C2:$G2,1,SMALL(IF($C2:$G2<>"abc",COLUMN($C2:$G2)-2),COLUMN(A1)))返回值的位置第n个最小的数字 – 如果由于过滤出的项目而没有值,则返回错误

=IFERROR(INDEX($C2:$G2,1,SMALL(IF($C2:$G2<>"abc",COLUMN($C2:$G2)-2),COLUMN(A1))),"")返回值并用空单元格replace错误。