如何识别一行中连续标记的单元格的两个单独范围

鉴于下面所有的广泛的示例表,如何确定:

  1. H列或上面的date作为第一组具有x的连续单元格的最后一个单元格。
  2. 上面的列M或date是第二组连续x的第一个单元。

+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ | | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | +---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ | 1 | 14/01/01 | 14/01/02 | 14/01/03 | 14/01/04 | 14/01/05 | 14/01/06 | 14/01/07 | 14/01/08 | 14/01/09 | 14/01/10 | 14/01/11 | 14/01/12 | 14/01/13 | 14/01/14 | 14/01/15 | 14/01/16 | | 2 | | | | x | x | x | x | x | | | | | x | x | x | | +---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ 

块之间的差距的最大尺寸是356.由于拼写错误,评论中的316的数量是错误的。

使用的公式:

首先识别整个x:

 =MATCH("x",$A2:$P2,0) 

识别最后的整体x:

 =MATCH("x",$A2:$P2,1) 

限制:

没有VBA,只有Excel的公式。
没有帮助细胞。
无法将x更改为其他标识符。
第一个块结束的一个单元格公式。
一个单元格公式为第二个块的开始。


当我为两个组使用两个不同的标识符时很容易,但是使用相同的标识符,我只能确定如何识别第一个和最后一个X.我无法弄清楚如何识别两者之间的差距。 我个人不认为这是可能的,但我看到在这里回答问题的人做了一些非凡的事情。 如果你不认为这是可能的,请说出来。

这些似乎能够在我向他们投掷的testing中幸存下来。

在B4:B5中作为CSEarray¹公式。

 =INDEX(INDEX(1:1, 0, MATCH("X", 2:2, 0)):INDEX(1:1, 0, MATCH(1E+99, 1:1)), 0, MATCH(TRUE, NOT(LEN(INDEX(2:2, 0, MATCH("X", 2:2, 0)):INDEX(2:2, 0, MATCH(1E+99, 1:1)))), 0)-1) =INDEX(INDEX(1:1, 0, MATCH(TRUE, NOT(LEN(INDEX(2:2, 0, MATCH("X", 2:2, 0)):INDEX(2:2, 0, MATCH(1E+99, 1:1)))), 0)+MATCH("X", 2:2, 0)-1):INDEX(2:2, 0, MATCH(1E+99, 1:1)), 0, MATCH("X", INDEX(2:2, 0, MATCH(TRUE, NOT(LEN(INDEX(2:2, 0, MATCH("X", 2:2, 0)):INDEX(2:2, 0, MATCH(1E+99, 1:1)))), 0)+MATCH("X", 2:2, 0)-1):INDEX(2:2, 0, MATCH(1E+99, 1:1)), 0)) 

这个想法是build立一个可用的细胞的子范围。 例如,您需要查找一个单元格,比从第一个X到最后一个date的第一个空格。 你会在寻找第一个空白,

 INDEX(2:2, 0, MATCH("X",2:2, 0)):INDEX(2:2, 0, MATCH(1E+99,1:1 )) 

在第一组之后,从第一个空白中减去1,调整起始位置,并得到最后一个X的列。

last_and第一

我从另一种方法开始,当第一个X在A2时似乎有困难,但是这些方法没有出现相同的错误。


¹ 数组公式需要使用Ctrl + Shift + Enter 来完成。 如果input正确,Excel将花括号包括在公式中(例如{} )。 你不要自己input大括号。 一旦正确input第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。 尝试和减less您的全列引用范围更接近代表实际数据的范围。 数组公式将计算周期对数化,所以最好将参考范围缩小到最小。 有关更多信息,请参阅数组公式的示例 。

这是我的:

find任何组结束date:

 =INDEX($A$1:$P$1,AGGREGATE(15,6,(COLUMN($A$1:$P$1))/(($A$2:$P$2="x")*($B$2:$Q$2 = "")),COLUMN(A:A))) 

列(A:A)在哪里是一个计数器,这个解决scheme为1或第一个。 当它拖动它将增加获得第二个结束date,然后第三个等等。

要获得第二个开始date,那么:

 =INDEX($A$1:$P$1,AGGREGATE(15,6,(COLUMN($A$1:$P$1)+1)/(($A$2:$P$2="")*($B$2:$Q$2 = "x")),COLUMN(B:B))) 

与上面的这个柜台一样。

这样search模式"","x""x",""分别作为开始date和结束date。

在这里输入图像说明

为了使其dynamic,那么:

 =INDEX($A$1:INDEX(1:1,MATCH(1e99,1:1)),AGGREGATE(15,6,(COLUMN($A$1:INDEX(1:1,MATCH(1e99,1:1))))/(($A$2:INDEX(2:2,MATCH(1e99,1:1))="x")*($B$2:INDEX(2:2,MATCH(1e99,1:1)+1) = "")),COLUMN(A:A))) 

 =INDEX($A$1:INDEX(1:1,MATCH(1E+99,1:1)),AGGREGATE(15,6,(COLUMN($A$1:INDEX(1:1,MATCH(1E+99,1:1)))+1)/(($A$2:INDEX(2:2,MATCH(1E+99,1:1))="")*($B$2:INDEX(2:2,MATCH(1E+99,1:1)+1) = "x")),COLUMN(B:B))) 

在阅读@ Jeeped的回答时,这可能是他开始的方法。 因为他是正确的,所以需要在A中有一个空白的列,否则会失败。