鉴于以下所有广泛的示例表,我们将如何识别:
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| | 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.我无法弄清楚如何识别它们之间的差距。我个人认为不可能,但我看到在这里回答问题的人做了一些非凡的事情。如果您认为不可能,请说出来。
答案 0 :(得分:2)
这些似乎在我向他们投掷的测试中存活下来。
在B4:B5中作为CSE数组的公式。
=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))
这个想法是建立一个可用细胞的子范围。例如,您需要找到一个小于第一个X到最后一个日期的第一个空格的单元格。你会在寻找第一个空白,
INDEX(2:2, 0, MATCH("X",2:2, 0)):INDEX(2:2, 0, MATCH(1E+99,1:1 ))
在第一组之后从第一个空白中减去1,调整起始位置,然后得到最后一个X的列。
我开始使用另一种方法,当第一个X在A2中时似乎有困难,但这些方法没有出现相同的错误。
¹数组公式需要用 Ctrl + Shift + Enter↵完成。如果输入正确,Excel将公式包装在大括号中(例如 {和} )。您不要自己键入大括号。一旦正确进入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。尝试并减少对更接近表示实际数据范围的范围的全列引用。数组公式以对数方式计算计算周期,因此将参考范围缩小到最小值是一种好习惯。有关详细信息,请参阅Guidelines and examples of array formulas。
答案 1 :(得分:2)
这是我的:
要查找任何组结束日期:
=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)是一个计数器,则解析为1或第一个。当它拖过它时会增加第二个结束日期然后是第三个结束日期,依此类推。
要获得第二个开始日期:
=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)))
与上面的计数器相同。
分别搜索模式"","x"
和"x",""
作为开始日期和结束日期。
为了让它变得动态,那么:
=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中需要一个空白列,否则它将失败。