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

Posted

技术标签:

【中文标题】Excel VBA 按用户 ID 和类别汇总大型数据集【英文标题】:Excel VBA Summarize large data set by User ID and Category 【发布时间】:2021-09-06 14:02:23 【问题描述】:

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

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

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

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

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

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

任何建议将不胜感激。提前感谢您提供的任何帮助.....

【问题讨论】:

您可以在 Power Query 中轻松做到这一点(在 Windows Excel 2010+ 和 Office365 中可用)。 @RonRosenfeld..........我将其添加到宏中。当我第二次运行它时,它说查询已经存在。所以,经过一番研究。我找到了一些代码来刷新我认为可行的查询。我担心的是我希望每次运行宏时行数都会改变。一次可能是 16,000 行,然后是 12,000 行。我不希望每次都一样。第一次跑的时候。我设置了确切行数的范围。下次会有所不同。我该如何解决。完成后是否删除查询。然后下次加?谢谢 查询使用表名引用访问数据。添加/删除行时,表格将自动调整大小。只要你的代码不绕过它,应该不是问题。 @RonRosenfeld .....感谢您的帮助....感谢您的建议... 【参考方案1】:

您可以使用 Windows Excel 2010+ 和 Office 365 中提供的 Power Query 来完成此操作

使用 Power Query

选择数据表中的某个单元格 Data => Get&Transform => from Table/Range 当 PQ 编辑器打开时:Home => Advanced Editor 记下第 2 行中的表 Name 粘贴下面的 M 代码代替您看到的内容 将第 2 行中的表名称更改回最初生成的名称。 阅读 cmets 并探索 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"

【讨论】:

@RonRosenfeld ......谢谢............我以前没有使用过 Power Query。我试过了,将 M 代码复制到高级编辑器后出现错误。它说“找不到表格的‘类别’列。感谢您提供的信息.... @Shaves M 区分大小写。所以你可能需要把代码从Category改成CATEGORY @RonRosenfeld ......谢谢。我今天会检查一下。感谢帮助............ @RonRosenfeld ............做到了......这很棒,而且真的会加快这个过程。感谢您的帮助...........【参考方案2】:

在对分组列进行重复数据删除后,只需使用SUMIFS

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

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

    在指向原始工作表的去重列表旁边添加SUMIFS 公式。要在所有列中传播,请将公式向下拖动到所有 15,000 行的第一个数字列,然后再拖动到所有 50 列。请务必使用$ 锁定条件范围:

    =SUMIFS(OriginalSheet!C2:C15000, OriginalSheet!$A$2:$A$15000, $A2, OriginalSheet!$B$2:$B$15000, $B2)
    =SUMIFS(OriginalSheet!D2:D15000, OriginalSheet!$A$2:$A$15000, $A2, OriginalSheet!$B$2:$B$15000, $B2)
    =SUMIFS(OriginalSheet!E2:E15000, OriginalSheet!$A$2:$A$15000, $A2, OriginalSheet!$B$2:$B$15000, $B2)
    ...
    

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

请注意方括号 ([...]),因为您的特殊 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]

【讨论】:

@Parfait............感谢您的快速回复。我将尝试这些选项,看看什么最有效。再次感谢您的帮助......

以上是关于Excel VBA 按用户 ID 和类别汇总大型数据集的主要内容,如果未能解决你的问题,请参考以下文章

使用 excel vba 计算每行中的重复值和报告重复数

如何按前 N 个类别与“所有其他”和总计进行汇总?

按行数拆分大型excel文件

Excel VBA怎么实现整行/列的遍历

易失性用户定义函数未按预期重新计算(VBA/Excel)

在EXCEL中用VBA怎样操作WORD文档中嵌入的EXCEL表格?