【问题标题】:Excel: Flashfill Offset Horizontal + VerticalExcel:Flashfill 偏移水平 + 垂直
【发布时间】:2020-04-06 05:38:35
【问题描述】:

所以我不是 VBA 的粉丝,而且我最近了解到,只要您的目标范围比您拥有的数据更长,就可以将 OFFSET 与 COUNTA 一起使用来快速填充范围。现在我希望能够同时为列和行实现这一点,其中行是平均的。这可以做到吗?我正在用头撞墙以找到一些逻辑来做到这一点,但只能设法以将行数与列数相乘的方式将其组合起来……当然,这是不希望的。

我在 Excel Online 中发布了一个最小可重现示例: https://onedrive.live.com/view.aspx?resid=63EC0594BD919535!1491&ithint=file%2cxlsx&authkey=!ALmV0VtFb7QZCvI

如果您看到 Cell J9 和 J11,您将看到我想要组合的内容。 J11 及以下的三行,我想在 J10 中取平均值,并且溢出/快速填充(如 J9 和 11 已经自动由于公式)它们从右到右,对于范围 A1- 中的数据一样多的列G4..

所以我在 A1-G4 中有标题的 数字 的原始数据,通过在 J9 中写 =OFFSET($A$1:$A$1,0,0,1,COUNTA($A$1:$EV$1)-1) 我得到从左到右填充的所有列标题,并通过写 @ J11 中的 987654324@ 我将第一列的行从上到下填充。也可以通过编写OFFSET(Days,1,0,COUNTA($A:$A)-1,COUNTA(Days)) 来组合它们,其中“Days”是=OFFSET($A$1:$A$1,0,0,1,COUNTA($A$1:$EV$1)-1)(为了便于阅读而在命名范围内)或OFFSET($A$1:$A$1,0,0,1,COUNTA($A$1:$EV$1)-1) 而不使用命名范围

作为一个想法,虽然我不确定如何实现它,但也许这可以以某种形式与=AVERAGE(OFFSET($A$1,1,0,COUNTA($A:$A)-1))结合使用以获取水平部分的列引用

=MID(ADDRESS(ROW(),COLUMN()),2,SEARCH("$",ADDRESS(ROW(),COLUMN()),2)-2)

..发现于https://superuser.com/questions/1259506/formula-to-return-just-the-column-letter-in-excel/1259507

【问题讨论】:

  • 嗨,伙计,我下载了你的文件副本,试图找出你的问题,看到 If you see Cell J9 and J11 you will see what I want to combine. The three rows in J11 and down, I want to average in J10 没有意义,因为 你使用了两次 J11 .能给我解释一下吗?
  • @TsiriniainaRakotonirina 嗨!因此,J9 是一个示例,说明如何输入偏移公式以使我的数据中标题的标题自动向右扩展,与标题一样多的列(如果您愿意,可以使用“for 循环” - 如果您寻找用于迭代的编程语言) - 只需在 J9 中输入公式。 J11 是相同的,只是它垂直重复。我想要的结果是在 J10 中输入一个取 J11 平均值的公式(因此可以将其视为用 average() 公式将 J11 中的公式包装起来),但随后也具有 J9 中公式的效果,这意味着我想要..
  • ..J11 获得的平均值,迭代了尽可能多的数据列。在一个单元格中使用一个公式:J10。由于 Excel 公式不是一种成熟的编程语言,内置了所谓的“for 循环”,我不确定这是否可能,但话又说回来,算法/高级逻辑不是我的强项。这就是我问的原因,如果可能的话,我也许也能够理解它并利用逻辑不仅为此,甚至可能理解其他复杂的概念。
  • 我也有一种感觉,J21中的公式可能是解锁我想要的结果的关键的一部分,因为它不返回列的标题,而是列名,这意味着它可能以某种方式作为间接引用工作:=MID(ADDRESS(ROW(),COLUMN(OFFSET($A$1:$A$1,0,0,1,COUNTA($A$1:$EV$1)-1))),2,SEARCH("$",ADDRESS(ROW(),COLUMN(OFFSET($A$1:$A$1,0,0,1,COUNTA($A$1:$EV$1)-1))),2)-2) (当然可以通过使用命名引用来清理)
  • 总之,如果我理解你的话:- J9:N9 is getting its value from A1:E1- J11:NXX is getting its value from A2:EXX(并且行扩展)- J10:N10 is supposed to be the average of J11:NXX不是吗?

标签: excel offset


【解决方案1】:

现在,根据你的解释,这是我的测试截图:

A1 部分:Exxx

我已经将该部分转换为一个名为 «TblData» 的表格,具有许多优点:

  1. 它会自动扩展,无需任何额外的努力/公式
  2. 我们可以通过表[@1], [@2],[@3], [@4], [@5]自动归属的列来识别数据

J9 节:N9

作为表名的副本,我使用了下面的公式来检索它:

=INDEX(TblData[#Headers],1,COLUMN(A1))    '<--- This is for J9
=INDEX(TblData[#Headers],1,COLUMN(E1))    '<--- This is for N9

J11 节:Nxx

作为表格内容的副本,我使用以下公式填充内容:

=INDEX(TblData,ROW($A1),MATCH(J$9,TblData[#Headers],0))   '<--- This is on J11
=INDEX(TblData,ROW($A3),MATCH(N$9,TblData[#Headers],0))   '<--- This is on N13

J10 节:N10

现在这是平均中有趣的部分,所以这是我用于它的公式:

=AVERAGE(TblData[1])  '<--- This is on J10
=AVERAGE(TblData[5])  '<--- This is on N10

注意:(1) 与其使用 J10:N10 下面的内容,我更喜欢重用表格,因为它会随着更多行的添加而自动扩展。 (2) 除非真的有必要,否则我觉得从 J9:Nxxx 再次复制 A1:Exxx 也是一项双重工作,因为您可以将 Table 用于您需要的任何内容,并且维护较少.

请在我更新这些项目后找到附件:

文件链接:https://drive.google.com/open?id=1wRbpUxg0XLpfGqdvMF4fNKXDrL7xPPWs

我们可以在下面提供更多信息以获取更多信息。希望你能发挥更大的能力:)

【讨论】:

  • 表格的好处很好,但不幸的是对于这个例子它不起作用,因为即使表格展开,您也必须手动展开结果 - 这意味着如果添加了新列到数据,那么你将不得不在 O10 中写 =AVERAGE(TblData[6]) 等等。这正是我想要避免的事情,因此我始终可以保证所有结果都包含在内,而无需手动调整。这更像是一个实验,看看是否有可能以两种方式迭代,以某种方式分别处理每次迭代中的平均值计算..
  • ..就像在使用编程语言时一样,例如在 JavaScript 中你有一个“For Loop”。如果我能够使用我知道的编程语言,我会这样做,尽管我不会因为工作环境(这意味着 VBA 是不可能的另一个原因,而不是对于具有多个用户的文档不可靠,许多没有经验)。
  • 如果你保持你的结构并且仍然使用J9:N13,通过表格和我给你的公式,你现在可以将平均公式更改为=AVERAGE(J11:J13) [J10 中的公式] 和 =AVERAGE(N11:N13) [N10 中的公式] 因为J9:N9 上的公式已经使用公式=INDEX(TblData[#Headers],1,COLUMN(A1)) 来搜索您的列。 您不需要做任何事情,只需在右侧添加 Column。
  • 以下是我与您分享的内容的更新,我在其中添加了新列,并自行查看是否有效。 drive.google.com/open?id=1wRbpUxg0XLpfGqdvMF4fNKXDrL7xPPWs
  • 我完全明白这一点。但是,必须向右复制是这个问题的核心,因此必须这样做并不能解决问题。我可以通过多种方式轻松解决这个问题,最终结果必须最终复制到右侧。
【解决方案2】:

对不起,伙计,我不知道你要计算什么。如果添加 J9+J11 有意义,那么您可以将 J9 和 J11 中的两个公式用加号连接起来。经过深思熟虑,我决定假设您的问题不是公式之一,而是公式写作 - 简称“参考”。因此,我为您准备了这个答案,希望对您有所帮助。

基于您的命名范围Days 我建议您使用此公式创建一个动态命名范围Data。 [数据]=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))

由此定义的范围在两个方向上都是动态的。但是,请记住 OFFSET 是不稳定的(减慢您的工作表),您可能希望将其使用限制在这个公式中,并且可能从 A2 开始范围,但我会诱使您打破规则。现在您可以使用 INDEX 函数来引用 Data 范围。

= INDEX(Data, [Row number], [Column number]) 定义单个单元格。但是通过将列或行设置为零,您可以定义整个列或行。 =INDEX(Data,0,1) 定义 Data 范围的第 1 列,=INDEX(Data,1,0) 定义其第一行。 =INDEX(OFFSET(Data,1,0),0,1) 定义范围的第一列从其原始位置向下移动了一行。我推荐替代方案并从 A2 开始 Data 范围,如果需要,可能会为第一行声明另一个范围。

=AVERAGE(INDEX(Data,0,1)) 将绘制与您在工作表中已有的平均值相同的平均值,前提是数据是从 A2 开始定义的。为了好玩,=AVERAGE(INDEX(OFFSET(Data,1,0),0,1)) 会在不改变范围定义的情况下做同样的事情。

=COLUMN() 返回此公式所在列的编号。因此,您可以在 G 列中输入 =COLUMN()-6,复制到右侧并从 1 开始计数。(您可以使用ROW() 函数。)应用于您的公式时,=AVERAGE(INDEX(Data,0,COLUMN()-6)) 将返回第 1 列(如果在 G 列中输入)的平均值,以及从第 2、3、4 列等复制到右侧的平均值。

正如我所说,我没有充分理解您的要求,无法得出结论,但我认为使用上述方法将为您提供一种工具,可将公式复制到您的示例右侧的表格中.如果您能详细说明您的要求,我可能会提供更多帮助。

【讨论】:

  • 我要实现的是J9和J11的组合,也就是在J10中只输入一个自动填充到右边的公式(这样我就不用手动复制到右边了,因为每次我使用工作表时,数据的列数都会发生变化)。行也是如此 - 这就是为什么我想使用偏移量来获取一列中的所有数据,但还要使用偏移量来扩展到与我拥有的数据一样多的列。我不想使用枢轴或 VBA,因为枢轴需要手动刷新并且可能会被遗忘,而且 VBA 很容易被我的工作表的没有经验的用户破坏。
  • 我只想要一个计算,所以偏移量减慢工作表的事实并不重要,因为它也是一个相对较小的数据样本量。
  • 你只是在重复我已经不明白的事情。前进的方法是使用我提供的公式,然后告诉我在什么时候它没有达到你想要的效果。
  • =INDEX(OFFSET(Data,1,0),0,1)=INDEX(OFFSET(OFFSET($A$1,0,0,COUNTA($A:$A),COUNTA($1:$1)),1,0),0,1) 写出来,给我第 1-4 行数据,所以比数据多一行。我现在使用的=OFFSET($A$1,1,0,COUNTA($A:$A)-1) 没有,它只给出A 列中垂直的数据行。这意味着你建议的=AVERAGE(INDEX(OFFSET(Data,1,0),0,1)) 的公式与我已经使用的=AVERAGE(OFFSET($A$1,1,0,COUNTA($A:$A)-1)) 相比是一样的。还有..
  • =AVERAGE(INDEX(Data,0,COLUMN()-6)) 取第 5 列或 E 列的平均值,包括标题。因此,如果标题为 5,数据行为 754、774 和 650,那么您的平均数为 545.75,而不是 726。您看过我的示例吗?我不知道如何更好地解释它。我想输入一个公式单元格 J10,并希望它取 A 列的平均值并将其放入该单元格中,然后我希望 K10 是 B 列的平均值,L10 是 C 列的平均值,依此类推,无需在 J10 以外的任何其他单元格中输入公式。就像您的示例向下扩展一样,我也
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多