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 代码复制到高级编辑器后出现错误。它说“找不到表格的‘类别’列。感谢您提供的信息.... @ShavesM
区分大小写。所以你可能需要把代码从Category
改成CATEGORY
@RonRosenfeld ......谢谢。我今天会检查一下。感谢帮助............
@RonRosenfeld ............做到了......这很棒,而且真的会加快这个过程。感谢您的帮助...........【参考方案2】:
在对分组列进行重复数据删除后,只需使用SUMIFS
:
复制分组列ID
和Category
的所有内容,并粘贴到所需区域(即新工作表)。
使用功能区选项删除两个分组列的重复项:数据 > 删除重复项。
在指向原始工作表的去重列表旁边添加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 和类别汇总大型数据集的主要内容,如果未能解决你的问题,请参考以下文章