Excel VBA 按用户 ID 和类别汇总大数据集

Excel VBA Summarize large data set by User ID and Category

我正在尝试找到一种方法来汇总大型数据集(15,000 行/50 列。这 50 列是 ID、类别(5 个唯一类别)和 4 年的每月总计。

每个 ID 可以有多次相同的类别(因为每月总计来自 3 个不同的数据源。

我最终需要做的是每个 id 最多可以有 5 行。有些会有 2 或 3 或 4。不是每个 ID 都有 5。

我正在考虑为每个类别的每个 ID 找到开始行和结束行。然后将 50 列中的每一列逐一求和,将总数写在起始行并删除每个类别的剩余行。

重复下一个 ID/类别组合。

以下是我想要达到的目标的后续示例。我想我可以做一个枢轴 table,然后通读枢轴 table(在写入数据之前),但我不确定这样会快得多。我对在 Excel 数据集上使用 SQL 非常陌生,并且只根据特定标准完成了 select。我曾尝试使用 SQL 并总结数据,但运气不佳(因为我不知道自己在做什么)。

如有任何建议,我们将不胜感激。提前感谢您提供的任何帮助.....

删除重复分组列后只需使用SUMIFS

  1. 复制分组列 IDCategory 的所有内容,并粘贴到所需区域(即新的 sheet)。

  2. 使用功能区选项删除两个分组列的重复项:数据 > 删除重复项。

  3. 添加 SUMIFS 与指向原始 sheet 的重复列表相邻的公式。要跨所有列传播,请将公式向下拖动到所有 15,000 行的第一个数字列,然后向下拖动到所有 50 列。请务必使用 $:

    锁定条件范围
    =SUMIFS(OriginalSheet!C2:C15000, OriginalSheet!$A:$A000, $A2, OriginalSheet!$B:$B000, $B2)
    =SUMIFS(OriginalSheet!D2:D15000, OriginalSheet!$A:$A000, $A2, OriginalSheet!$B:$B000, $B2)
    =SUMIFS(OriginalSheet!E2:E15000, OriginalSheet!$A:$A000, $A2, OriginalSheet!$B:$B000, $B2)
    ...
    

或者,对于另一种非VBA 解决方案,请考虑打开任何 MS Access 数据库并使用聚合查询直接从查询 SQL window 中查询工作簿。

请注意方括号 ([...]),因为您的特殊 Excel 日期列以数字开头并包含特殊字符。您可能需要 Excel 和记事本来构建包含全部 50 列的以下语句

SELECT [ID]
      , [Category]
      , SUM([01/01/2018]) AS SumOf01012018
      , SUM([02/01/2018]) AS SumOf02012018
      , SUM([01/01/2019]) AS SumOf01012019
      ...

FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\My\Excel\File.xlsx].[OriginalSheet$A1:AX15000]
GROUP BY [ID]
       , [Category]

您可以使用 Windows Excel 2010+ 和 Office 365

中提供的 Power Query 来执行此操作

使用 Power Query

  • Select 数据中的某个单元格 Table
  • Data => Get&Transform => from Table/Range
  • 当 PQ 编辑器打开时:Home => Advanced Editor
  • 记下第 2 行Table名称
  • 粘贴下面的 M 代码代替您看到的内容
  • 将第 2 行中的 Table 名称更改回最初生成的名称。
  • 阅读评论并探索 Applied Steps 以了解算法

M码

let
    Source = Excel.CurrentWorkbook(){[Name="Table35"]}[Content],

//Set Data Types
//First two columns are Text and others set to Currency
    colTypes = {{"ID", Text.Type},{"Category", Text.Type}} & 
        List.Transform(List.RemoveFirstN(Table.ColumnNames(Source),2), each {_, Currency.Type}),
    #"Changed Type" = Table.TransformColumnTypes(Source,colTypes),

//Unpivot the "date" columns to get them into a single column    
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"ID", "Category"}, "Attribute", "Value"),

//Group by ID, Category and Attribute(=>Date)
//If there is more than one entry for a subgroup, SUM the values
    #"Grouped Rows" = Table.Group(#"Unpivoted Other Columns", {"ID", "Category", "Attribute"}, {
        {"Sum", each List.Sum([Value]), Currency.Type}}),

//Pivot on Dates (Attribute column) with no aggregation
    #"Pivoted Column" = Table.Pivot(#"Grouped Rows", List.Distinct(#"Grouped Rows"[Attribute]), "Attribute", "Sum")
in
    #"Pivoted Column"