对非连续的命名范围进行平均
Averaging over a Non-Contiguous Named Range
我正在尝试对不连续的单元格进行平均,如图所示。
我正在为每一行取 A 列和 C 列的平均值。我正在尝试做同样的事情,但使用命名范围(包括 A 和 C 列),因为我的实际数据有数千列,编写公式将是地狱,更不用说让用户了解正在平均的内容了。
显然,我不明白索引命名范围是如何工作的。我预计 index(RangeAC,2)
会给我 RangeAC 中的第二行值。相反,我得到了 A 列中的第二行。尝试 index(RangeAC,2,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)
立即 window returns 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 行的平均值,包括命名范围的所有列。
你能不能也给公式加上一个名字?如果是这样,请转到 "Formula" 选项卡,"Define Name" 并在 "Refers to" 框中键入 =Average(A1,C1))。在名称框中,您可以将其命名为 "Average" 或者您选择调用 it.The 的任何内容,如果您向右或向下拖动 sheet,引用将继续不连续。我不确定这是否正是您要找的。
感谢大家的帮助。这个问题让我花费的时间比我愿意花在它上面的时间要长得多。不连续的范围是 Excel 中的噩梦。
Excel 先生的 Eric 提议 the most elegant working solution - 只是 VBA.
的一行
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) )
我不知道我是否遗漏了什么,但这不是使用 Excel 相交运算符那么简单吗?:
=AVERAGE(RangeAC 8:8)
放入命名范围数据的第一行(在您的情况下似乎是 8:8),然后向下复制...
这与 MrExcel 论坛建议的 VBA UDF 不一样吗?
我正在尝试对不连续的单元格进行平均,如图所示。
我正在为每一行取 A 列和 C 列的平均值。我正在尝试做同样的事情,但使用命名范围(包括 A 和 C 列),因为我的实际数据有数千列,编写公式将是地狱,更不用说让用户了解正在平均的内容了。
显然,我不明白索引命名范围是如何工作的。我预计 index(RangeAC,2)
会给我 RangeAC 中的第二行值。相反,我得到了 A 列中的第二行。尝试 index(RangeAC,2,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)
立即 window returns 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 行的平均值,包括命名范围的所有列。
你能不能也给公式加上一个名字?如果是这样,请转到 "Formula" 选项卡,"Define Name" 并在 "Refers to" 框中键入 =Average(A1,C1))。在名称框中,您可以将其命名为 "Average" 或者您选择调用 it.The 的任何内容,如果您向右或向下拖动 sheet,引用将继续不连续。我不确定这是否正是您要找的。
感谢大家的帮助。这个问题让我花费的时间比我愿意花在它上面的时间要长得多。不连续的范围是 Excel 中的噩梦。
Excel 先生的 Eric 提议 the most elegant working solution - 只是 VBA.
的一行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) )
我不知道我是否遗漏了什么,但这不是使用 Excel 相交运算符那么简单吗?:
=AVERAGE(RangeAC 8:8)
放入命名范围数据的第一行(在您的情况下似乎是 8:8),然后向下复制...
这与 MrExcel 论坛建议的 VBA UDF 不一样吗?