在表中使用指定的标题find两列,差异所有行然后计算平均?

我有一个信息表,我想创build一个函数,在表范围内find两个与我提供的头相匹配的列,然后将这两列的每一行之间的差异存储为一个数组。 得到这个数组后,我想要函数返回数组的平均值,最大值和最小值。 输出将是水平的,并放置在3个相邻的单元格中。

因为表格非常大,我不得不手动执行此操作,因此我必须得到两行的许多排列(435个排列)的差异和平均值,因此手动计算将过于冗长乏味。

Function MatchDiff(header1 As String, header2 As String, tbl As Range) As Variant() Dim c, r, a, Lcol As Single Dim temp_spreads(), temp_final() As Variant Dim Average As Double Dim tbl1, tbl2 As Range ReDim temp_diff(0) ReDim temp_final(0) For c = 1 To tbl.Columns.Count If header1 = tbl.Cells(1, c) Then tbl1 = tbl.Range(tbl.Cells(2, c), tbl.Cells(tbl.Rows.Count, c)) ElseIf header2 = tbl.Cells(1, c) Then tbl2 = tbl.Range(tbl.Cells(2, c), tbl.Cells(tbl.Rows.Count, c)) End If Next c For r = 1 To tbl1.Rows.Count temp_diff(UBound(temp_diff)) = (tbl1.Cells(r, 1).Value - tbl2.Cells(r, 1).Value) ReDim Preserve temp_diff(UBound(temp_diff) + 1) Next r Average = Application.WorksheetFunction.Average(temp_diff) temp_final(UBound(temp_final)) = Average ReDim Preserve temp_final(UBound(temp_final) + 1) Min = Application.WorksheetFunction.Min(temp_diff) temp_final(UBound(temp_final)) = Min ReDim Preserve temp_final(UBound(temp_final) + 1) Max = Application.WorksheetFunction.Max(temp_diff) temp_final(UBound(temp_final)) = Max ReDim Preserve temp_final(UBound(temp_final) + 1) Lcol = Range(Application.Caller.Address).Rows.Count For a = UBound(temp_final) To Lcol temp_final(UBound(temp_final)) = "" ReDim Preserve temp_final(UBound(temp_final) + 1) Next a ReDim Preserve temp_final(UBound(temp_final) - 1) MatchDiff = temp_final End Function 

这是我试图做的,但它返回一个无效的名称错误。 我是非常新的VBA(只使用Python和R),真的需要一些帮助。 提前致谢!

不需要VBA。

如果headers是表示标题标签的范围,则表示data的范围(不包括标题行)

 =INDEX(data,0,MATCH(header1,headers,0)) 

提供了一个数组,表示标题为header1的数据表的列。

所以,你的最大值,最小值和平均值可以简单地得到

 =MAX(INDEX(data,0,MATCH(header1,headers,0))-INDEX(data,0,MATCH(header2,headers,0))) =MIN(INDEX(data,0,MATCH(header1,headers,0))-INDEX(data,0,MATCH(header2,headers,0))) =AVERAGE(INDEX(data,0,MATCH(header1,headers,0))-INDEX(data,0,MATCH(header2,headers,0))) 

header1header2是你select的两个标题标签。

每个公式都需要使用CTL+SHIFT+ENTER作为数组公式CTL+SHIFT+ENTER而不是从公式栏提交时ENTER 。 公式将出现在公式栏的大括号{...}中,以确认它是一个数组公式。

既然你有435个排列,我猜你的数据表有30列。

如果你愿意,你可以很容易地产生所有435个可能的排列结果。

为此,创build一个435对(n,m)的列表,使得n小于mnm分别在范围1,…,30中。 创build从(1,2)(29,30)开始的列表。 现在MATCH(header1,headers,0)MATCH(header2,headers,0)可以简单地分别用公式中的nm来代替

 =MAX(INDEX(data,0,n)-INDEX(data,0,m)) =MIN(INDEX(data,0,n)-INDEX(data,0,m)) =AVERAGE(INDEX(data,0,n)-INDEX(data,0,m)) 

作为pair (n,m)所需的结果,这些公式应该再次以CTL+SHIFT+ENTER数组公式的formsCTL+SHIFT+ENTER

下图显示了对25行6列的示例数据表的全部15个排列应用此方法的结果。 在这里输入图像说明