如何聚合大型Excel文件中的行

时间:2018-05-03 13:38:39

标签: vba

我有一个包含大量行的大型excel文件。我想对这些具有相同标准的行进行求和(有4/5列标准和6/7列的事情要总结)。

  • 是否可以创建VBA来创建求和过程?
  • 是否可以在链接到主要文件的另一个Excel工作表中执行此操作而无需打开原始Excel文件(因为它需要花费大量时间才能打开)。

2 个答案:

答案 0 :(得分:0)

您可以同时执行这两项操作,但使用SumIfs函数或数据透视表进行求和可能更容易。但是,如果你在VBA上设置,这里有一些代码:

Sub SumNumber()
'Column F is data to sum
'Column B is year
'Column C is month

MsgBox Application.WorksheetFunction.SumIfs(Columns("F"), Columns("B"), "2018", Columns("C"), "April")

End Sub

如果要对多个列求和,只需复制具有不同初始范围(不是F列)的sumif。

示例:Sumifs(列(“F)... + SumIfs(列(”E“)...

(注意这实际上是在单元格中制作公式)

Here is a file包含此宏的一些示例数据。它还有一个数据透视表,可能是一个更好的选择。

在回答您的其他问题时,您可以从另一张表中进行链接。您只需要使用文件路径引用,但是当目录重命名,安全配置文件更改等时,这往往会中断。

答案 1 :(得分:0)

如果使用Excel for PC,则考虑直接在Excel工作簿上运行SQL,因为它可以连接到Jet / ACE引擎(Windows .dll文件)。然后,运行众所周知且使用过的聚合查询。

下面假设您有一个名为 OUTPUT 的工作表。请务必针对实际条件 Col#名称以及 SheetName 调整strSQL。如果空格和特殊字符位于列名称中,请将SELECTGROUP BY列括在方括号[]中或反对``

' ADO OBJECTS
Dim xlConn As Object, rs As Object
Dim icols As Long

Set xlConn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

' CURRENT WORKBOOK CONNECTION
xlConn.Open "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
              & "DBQ=" & ThisWorkbook.FullName & ";"

' AGGREGATE QUERY
strSQL = "SELECT Criteria1, Criteria2, Criteria3, Criteria4, " _
      & "   Sum(Col1) As TotalCol1, Sum(Col2) As TotalCol2, Sum(Col3) As TotalCol3," _
      & "   Sum(Col4) As TotalCol4, Sum(Col5) As TotalCol5, Sum(Col6) As TotalCol6" _
      & " FROM [SheetName$]" _
      & " GROUP BY Criteria1, Criteria2, Criteria3, Criteria4"

' OUTPUT RESULTS
rs.Open strSQL, xlConn

With Worksheets("OUTPUT")
    .Cells.Clear
    ' COLUMN HEADERS
    For icols = 0 To rs.Fields.Count - 1
        .Cells(1, icols + 1).Value = rs.Fields(icols).Name
    Next icols

    ' DATA ROWS
    .Range("A2").CopyFromRecordset rs
End With    

rs.Close
xlConn.Close