在表中使用指定的标题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)))
header1
和header2
是你select的两个标题标签。
每个公式都需要使用CTL+SHIFT+ENTER
作为数组公式CTL+SHIFT+ENTER
而不是从公式栏提交时ENTER
。 公式将出现在公式栏的大括号{...}
中,以确认它是一个数组公式。
既然你有435个排列,我猜你的数据表有30列。
如果你愿意,你可以很容易地产生所有435个可能的排列结果。
为此,创build一个435对(n,m)
的列表,使得n
小于m
, n
, m
分别在范围1,…,30中。 创build从(1,2)
到(29,30)
开始的列表。 现在MATCH(header1,headers,0)
和MATCH(header2,headers,0)
可以简单地分别用公式中的n
和m
来代替
=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个排列应用此方法的结果。