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
:
复制分组列 ID
和 Category
的所有内容,并粘贴到所需区域(即新的 sheet)。
使用功能区选项删除两个分组列的重复项:数据 > 删除重复项。
添加 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"
我正在尝试找到一种方法来汇总大型数据集(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
:
复制分组列
ID
和Category
的所有内容,并粘贴到所需区域(即新的 sheet)。使用功能区选项删除两个分组列的重复项:数据 > 删除重复项。
添加
锁定条件范围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"