工作表中的VBA搜索列标题并在另一个工作表中返回SUM

时间:2016-11-17 14:34:51

标签: excel vba excel-vba

我想从表1到表2获取数据,参考列标题和VBA 例如:(EXCEL文件)
enter image description here

因此,如果我想找到带有标准1的fun1 person A的总和,那么命令必须在表1中找到标题“fun of fun 1”,并选择仅在标准1下的数据并总结在表2单元格D5中。 (通过使用列标题引用而不是单元格引用。表格范围是A2:U80。谢谢。

Public Sub Match()




ThisWorkbook.Sheets("Sheet1").Activate


Range("Sheet2!B3") = Application.Sum(Application.Index(Range("A:G"), 0, Application.Match("Crit1" & "Fun1personA", Range("A2:G2"), 0)))
End Sub

我已经尝试过代码,但失败了。我知道我已经包含了关于crit1的Row参考,但我不确定如何将其应用于公式。

任何人都可以帮我吗?提前致谢

1 个答案:

答案 0 :(得分:0)

你可以用公式做到这一点。 我假设你的例子中的表格涵盖范围A1:E10。

首先,我们需要使用MATCH公式找到正确的列:
=MATCH("Fun2PersonA",$1:$1,0) - 这将返回3,因为Fun2PersonA位于C列。

接下来,我们需要知道表中有多少行。假设A列中的标准除了单元格A1之外没有空格,我们可以使用COUNTA:
=COUNTA($A:$A)+1 - 这将返回10.

以上两个公式将在最终结果中使用几次,因此可能更容易使用辅助单元格来存储结果(我只是称它们为ColumnRefLastRowRef的可读性而不是实际的单元格引用。

现在设置对C列中第一个单元格和最后一个单元格的引用 =INDEX($1:$1,,ColumnRef)将引用标头,而=INDEX($1:$1048576,RowRef,ColumnRef)将引用最后一个单元格。

由于这些可以用作参考,而不只是值=SUM(INDEX($1:$1,,ColumnRef):INDEX($1:$1048576,RowRef,ColumnRef))将对该列中的所有内容求和。这与撰写=SUM(C1:C10)相同。

但是你想使用SUMIF,所以我们也需要引用A栏中的标准 =INDEX($A:$A,RowRef)将引用A列中的最后一个单元格,因此$A$1:INDEX($A:$A,RowRef)将引用A列中的所有值。

最终公式:

最后一步是将它们全部放在最终的公式中:
=SUMIF($A$1:INDEX($A:$A,RowRef),"Crit1",INDEX($1:$1,,ColumnRef):INDEX($1:$1048576,RowRef,ColumnRef))
这与撰写=SUMIF($A$1:$A$10,"Crit1",$C$1:$C$10)

相同

对于VBA解决方案:

Public Function SumCriteria(FunPerson As String, Criteria As String) As Double

    Dim rTable As Range
    Dim rCol As Range
    Dim rCriteria As Range
    Dim LastRow As Long
    Dim LastCol As Long

    'Update Sheet1 to the sheet name with your table.
    With ThisWorkbook.Worksheets("Sheet1")
        'You may have to change how to find the last row/column depending
        'on any extra data on the sheet.
        LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
        LastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
        Set rTable = .Range(.Cells(1, 1), .Cells(LastRow, LastCol))

        'EDIT:  You could set your table as below if it's a static size.
        'Set rTable = .Range("A2:U80")

        'The first statement finds the FunPerson heading
        Set rCol = rTable.Rows(1).Find(What:=FunPerson, LookIn:=xlValues, LookAt:=xlWhole)
        If Not rCol Is Nothing Then
            SumCriteria = Application.WorksheetFunction.SumIf(rTable.Columns(1), Criteria, rTable.Columns(rCol.Column))
        Else
            SumCriteria = CVErr(xlErrValue)
        End If
    End With
End Function

此方法查看A列和第1行以获取表的尺寸,然后使用SUMIF计算数字。

您可以将其用作工作表公式:=SumCriteria("Fun1PersonA","Crit1")
或在VBA内:

Public Sub Test()
    Dim a As Double
    a = SumCriteria("Fun1PersonA", "Crit1")
End Sub