Jorda Asked: 2019-04-13 14:10:10 +0800 CST2019-04-13 14:10:10 +0800 CST 2019-04-13 14:10:10 +0800 CST 将每第 n 列堆叠在一起 772 这可能是一个微不足道的问题,但我无法弄清楚。我有一个包含重复列的数据集,我需要找出一种方法将每第 n 列堆叠在彼此之下。所以如果我们考虑这个: 我们可以看到我们有重复的列,我需要我的数据像这样相互堆叠: 我的重复列是一个常量,所以我将始终有 5 个重复列。对此的任何帮助将不胜感激! microsoft-excel macros 1 个回答 Voted Best Answer Alex M 2019-04-13T15:16:34+08:002019-04-13T15:16:34+08:00 这里需要一个循环OFFSET公式。 设置 所以我们有一个标题行和数据,比方说,A2:ZZZZ38。我们就把这个放在Sheet1. 我们将在 上设置输出Sheet2。 精确度 从概念上讲,我们很容易理解我们想要Sheet2!A2(以下为了简单起见,我们简称为这个单元格A2)重现Sheet1!A2。InA3我们想要下一个单元格,依此类推 - 直到我们查看了 中的所有记录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存在然后计算出逻辑/算术以了解如何生成您需要抵消的对序列的问题。
这里需要一个循环
OFFSET
公式。设置
所以我们有一个标题行和数据,比方说,
A2:ZZZZ38
。我们就把这个放在Sheet1
. 我们将在 上设置输出Sheet2
。精确度
从概念上讲,我们很容易理解我们想要
Sheet2!A2
(以下为了简单起见,我们简称为这个单元格A2
)重现Sheet1!A2
。InA3
我们想要下一个单元格,依此类推 - 直到我们查看了 中的所有记录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
注意事项
COUNTA
我认为这不会减慢您的速度。如果是这样,您可以轻松地将每个实例更改为COUNTA(Sheet1!A:A)
,COUNTA(Sheet1!A2:A38)
因为从技术上讲我们已经知道数据的大小,或者甚至可以将该值硬编码为 37,只要您恰好有 37 行,它就可以工作。OFFSET
存在然后计算出逻辑/算术以了解如何生成您需要抵消的对序列的问题。