【问题标题】:Averaging over a Non-Contiguous Named Range在非连续命名范围内求平均值
【发布时间】:2016-12-09 10:06:55
【问题描述】:

我正在尝试平均所示的非连续单元格。

我对每一行取 A 列和 C 列的平均值。我正在尝试做同样的事情,但使用命名范围(包括列 A 和 C),因为我的实际数据有数千列,编写公式将是地狱,更不用说让用户了解平均的内容了。

显然,我不明白索引命名范围的工作原理。我希望index(RangeAC,2) 会给我 RangeAC 中的第二行值。相反,我得到了 A 列中的第二行。尝试 index(RangeAC,2,2) 会导致错误。

是否可以通过命名范围获得这个平均值,还是我需要不同的方法?

【问题讨论】:

  • 可能有 2 个命名范围和数组公式 {=(A1:A9/C1:C9)/2}
  • ops .. 我的意思是 + 选择整个目标范围 D1:D9,输入 =(A1:A9+C1:C9)/2,然后 Ctrl + Shift + Enter

标签: excel excel-formula named-ranges


【解决方案1】:

我不知道我是否遗漏了什么,但这不是像使用 Excel 相交运算符那么简单吗?:

=AVERAGE(RangeAC 8:8) 

放入命名范围数据的第一行(在您的情况下似乎是 8:8),然后复制下来...

这与 MrExcel 论坛中建议的 VBA UDF 不一样吗?

【讨论】:

  • 这与 =AVERAGE((A:A,C:C) 8:8)=AVERAGE((A8,C8)) 相同,当我在 Google 表格中尝试时,结果为 #ERROR!,但不确定为什么它在 VBA 中有效
  • 不确定您的意思?这是一个原生 Excel 公式...我没有使用 Google 表格或 VBA
  • 没关系 .. 在 Excel Online 中工作 =AVERAGE((A:A,C:C) 2:2) +1
  • @MacroMarc 感谢您的回复。我不知道我可以使用带有空格的“AVERAGE”。我正在标记你的答案。再次感谢!
  • 很高兴为您提供帮助。 'Space'其实是Excel范围交集运算符,可以在很多函数中使用...
【解决方案2】:

选项 1: 假设您的范围名称是my_data,就像这样:

这是要使用的公式:

Public Function calculate_avg(rng As Range) As Double

    calculate_avg = WorksheetFunction.Average(Range(rng.Cells(1, 1).Address, Cells(rng.Rows.Count + rng.Cells(1, 1).Row - 1, rng.Columns.Count + rng.Cells(1, 1).Column - 1).Address))

End Function

选项 2: 您的命名范围如下:

您需要 2. 和 3. 列的平均值。 (光盘)。 这是你得到它的方式:

Option Explicit

Public Function calculate_avg(rng As Range, Optional l_starting_col As Long = 1, Optional l_end_col As Long = 1) As Double

    Dim my_start    As Range
    Dim my_end      As Range

    Set my_start = Cells(rng.Cells(1, 1).Row, l_starting_col + rng.Cells(1, 1).Column - 1)
    Set my_end = Cells(rng.Cells(rng.Rows.Count, l_end_col).Row, rng.Columns.Count - rng.Cells(1, l_end_col).Column + l_end_col)

    'Debug.Print my_start.Address
    'Debug.Print my_end.Address

    calculate_avg = WorksheetFunction.Average(Range(my_start, my_end))

End Function

您将起始列和结束列作为参数传递。因此是这样的: ?calculate_avg([my_test_big],2,3) 在即时窗口中返回 72,5。同样可以用作Excel公式。祝你好运! :)+

选项 3

Public Function calculate_avg_row(rng As Range, Optional l_row As Long = 1) As Double

    Dim my_start    As Range
    Dim my_end      As Range

    Set my_start = Cells(rng.Cells(l_row, 1).Row, rng.Cells(l_row, 1).Column)
    Set my_end = rng.Cells(l_row, rng.Columns.Count)

    Debug.Print my_start.Address
    Debug.Print my_end.Address

    calculate_avg_row = WorksheetFunction.Average(Range(my_start, my_end))

End Function

这个是这样工作的: calculate_avg_row([test_rng],5) 并给出命名范围第 5 行的平均值,包括命名范围的所有列。

【讨论】:

  • 感谢您的回答。我尝试了这两个函数,它们给了我命名范围中第一列的平均值(即 1 到 7 的平均值,即 4),但我的命名范围在 A 列中包含 1 到 7,在列中包含 3 到 9 C,所以总体平均值为 5。但除此之外,我试图获得每行的平均值,例如,对于第一行,A 和 C 的平均值将为 2 (=(1+3)/2 )。
  • 顺便说一句,你真的是“Piya samo belo vino”还是只是在听 Upsurt?在编辑之前在其中一张纸上注意到它;)
  • 我认为您没有理解 2. 示例中的可选变量的概念。例如,如果你想要第二列到第四列的平均值,你应该写 calculate_avg(my_range,2,4) 在我的例子中,72.5 是 C 到 D 的平均值。我喜欢 Upsurt :D
  • 也许我仍然没有得到它,但如果我必须手动输入列,那么我不需要命名范围。我使用命名范围的想法是为了避免使用诸如=average(a2,c2,e2,g2,y2,z2....) 之类的公式。相反,我将 A2:A10 和 C2:C10 和 E2:E10 等放入名为 Range1 的命名范围中。那么我可以说 Range1 第一行的平均值,但它不起作用......
  • 可能我听不懂你。我的函数仅适用于每列的平均值。例如,如果您有一个命名范围,并且您想要从命名范围的第二列到命名范围的第四列的平均值,那么它可以工作。你有什么想法?你有一个命名范围,你想要那里的平均值?
【解决方案3】:

您不能也为公式附加名称吗?如果是这样,请转到“公式”选项卡,“定义名称”并在“参考”框中键入 =Average(A1,C1))。在名称框中,您可以将其命名为“平均”或您选择的任何名称。如果您向右或向下拖动工作表,引用将继续不连续。我不确定这是否正是您想要的。

【讨论】:

    【解决方案4】:

    感谢大家的帮助。这个问题花费的时间比我愿意花在它上面的时间要长得多。非连续范围是 Excel 中的噩梦。

    Excel 先生的 Eric 提议 the most elegant working solution - 仅一行 VBA。

    【讨论】:

    • 链接中的 VBA UDF 与 @MacroMarc 答案相同(空格用于 Excel 中的相交)。如果您仍然更愿意使用 UDF,请将 ActiveSheet.Rows(r) 更改为 rng.Worksheet.Rows(r),因为它可能会在其他工作表处于活动状态时进行计算。
    【解决方案5】:

    Index function Reference form的第三个参数可用于指定区号:

    = AVERAGE( INDEX(RangeAC, ROW()), INDEX(RangeAC, ROW(), , 2) )
    

    或者如果RangeAC 不是从第 1 行开始,类似:

    = AVERAGE( INDEX(RangeAC, ROW()-ROW(RangeAC)+1), INDEX(RangeAC, ROW()-ROW(RangeAC)+1, , 2) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多