答案1
这里需要一个循环公式OFFSET
。
设置
因此,我们有一个标题行,并且数据位于 中,假设 。A2:ZZZZ38
我们只需将其放在 上Sheet1
。我们将在 上设置输出Sheet2
。
精确
从概念上讲,我们可以很容易地理解我们想要Sheet2!A2
(为了简单起见,我们以后就称这个单元A2
格为)重现Sheet1!A2
。在中,A3
我们想要下一个单元格,依此类推 - 直到我们查看了中的所有记录Sheet1!A
,然后我们想要返回到第一行,但超过 5 列。
这显然是一个案例OFFSET
。
公式
=OFFSET(Sheet1!A$2,MOD(ROW()-2,COUNTA(Sheet1!A:A)-1),ROUNDDOWN((ROW()-2)/(COUNTA(Sheet1!A:A)-1),0)*5)
演示
我的数据比你的小很多;但足以证明概念。
这里是Sheet1
:
输出Sheet2
:
解释
OFFSET
有三个部分。从哪里开始,向下移动多少行(垂直偏移),以及移动多少列(水平偏移)。
A-从哪里开始
Sheet1!A$2
非常简单。
B - 行偏移
MOD(ROW()-2,COUNTA(Sheet1!A:A)-1)
找出我们在哪一行并减去 2(我们从 开始A2
,我们希望A2
它是零偏移量)。将其除以我们要计数的记录数(此处表示显示的标题行),然后取余数。这只会生成一个从到的-1
函数0
[n-1]
n是行数,然后从 0 重新开始。
换句话说,对于包含 8 条记录的表,将返回:
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0 ...
C - 列偏移
ROUNDDOWN((ROW()-2)/(COUNTA(Sheet1!A:A)-1),0)*5
再次取值ROW()-2
,并再次除以记录数 - 但这次MOD
我们不是取该关系的余数,而是将其四舍五入为最接近的整数。这为我们提供了一个序列,该序列由等于记录数的 0 组成,后面跟着 1、2 等。然后将其乘以 5(参见下面的注释)。这提供了我们的列偏移量 - 每次循环行数重置时,我们都会跳过另外 5 列。
换句话说,对于包含 8 条记录的表,将返回:
0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 10 ...
再次重申公式:
=OFFSET(Sheet1!A$2,MOD(ROW()-2,COUNTA(Sheet1!A:A)-1),ROUNDDOWN((ROW()-2)/(COUNTA(Sheet1!A:A)-1),0)*5)
这将不受限制地进入和向下Sheet2!A2
复制A:E
。
注意:
- 5 是硬编码的,因为您声明了数据的属性,即列重复 5 次。如果需要,可以将其扩展为动态函数(或者,当然,如果重复列的数量固定且不是 5,则只需更改即可)。这可以留到以后再问。
- 尽管文件很大,但这个公式应该不会花费任何时间来处理。它确实包含整个列引用,但在里面,
COUNTA
我不知道思考这会减慢您的速度。如果确实如此,您可以轻松将每个实例更改为,COUNTA(Sheet1!A:A)
因为COUNTA(Sheet1!A2:A38)
从技术上讲我们已经知道数据的大小,甚至可以简单地将该值硬编码为 37,只要您恰好有 37 行,这种方法就可以奏效。 - 我花了一半的时间才把这个问题搞定,这一半时间都是在小心处理算术运算的顺序,并将公式的各个部分分成不同的列,以解决我遇到的问题——原来是缺少一对括号。从本质上讲,这其实很简单;只需要知道它
OFFSET
存在,然后计算出逻辑/算术,以了解如何生成需要偏移的对序列。