在非连续的命名范围上进行平均

我试图平均非连续的单元格如图所示。

我正在尝试做的例子

我正在取每列的A和C列的平均值。 我正在尝试做同样的,但与命名范围(包括列A和C),因为我的实际数据有成千上万的列,这将是地狱编写公式,更不用说为用户了解什么是平均。

显然,我不明白如何索引命名的范围工作。 我期望这个index(RangeAC,2)能给我RangeAC中第二行的值。 相反,我得到列A中的第二行。尝试index(RangeAC,2,2)导致错误。

有可能得到这个平均值的命名范围,还是我需要一个不同的方法?

我不知道我是否错过了一些东西,但不是像使用Excel相交运算符一样简单吗?

 =AVERAGE(RangeAC 8:8) 

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

是不是像MrExcel论坛上的VBA UDF一样?

选项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)并给出命名范围的第五行的平均值,包括命名范围的所有列。

你能不能给一个公式附上一个名字? 如果是的话,进入“公式”选项卡,“定义名称”并input“引用”框=平均值(A1,C1))。 在名称框中,您可以将其命名为“平均”或您select调用它的任何内容。如果您向右或向下拖动参考,参考文献将继续不连续。 我不确定这是不是你正在寻找的。

我感谢大家的帮助。 这个问题花了我很多的时间,比我愿意花费的时间还要长。 不连续的范围是Excel中的噩梦。

埃里克先生提出了最优雅的工作解决scheme – 只有一行VBA。

Index函数参考表格的第三个参数可以用来指定区域编号:

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

或者RangeAC没有从第1行开始,如下所示:

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