对非连续命名范围求平均值

时间:2016-12-09 10:06:55

标签: excel excel-formula named-ranges

我试图平均非连续细胞。

Example of what I am trying to do

我取每行的A和C列的平均值。我试图做同样的但是有一个命名范围(包括A和C列),因为我的实际数据有数千个列,所以编写公式将很难让用户了解什么是平均值。< / p>

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

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

5 个答案:

答案 0 :(得分:4)

我不知道我是否遗漏了某些东西,但是这不像使用Excel相交算子那么简单吗?:

=AVERAGE(RangeAC 8:8) 

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

是否与MrExcel论坛中建议的VBA UDF相同?

答案 1 :(得分:0)

选项1: 让我们说你的范围的名称是my_data,就像这个:

![enter image description here

这是使用的公式:

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: 您的命名范围如下:

enter image description here

您需要2.和3.列的平均值。 (C&安培; d)。 这就是你得到它的方式:

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行的平均值,包括命名范围的所有列。

答案 2 :(得分:0)

你也不能在公式上附上名字吗?如果是,请转到“公式”选项卡,“定义名称”,然后键入“参考”框=平均值(A1,C1))。在名称框中,您可以将其命名为“Average”或您选择调用它的任何内容。如果您向右或向下拖动工作表,引用将继续不连续。我不确定这是不是你正在寻找的。

答案 3 :(得分:0)

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

埃里克先生在Excel先生提出the most elegant working solution - 只有一行VBA。

答案 4 :(得分:0)

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) )