我希望这是正确的网站对于这个问题
我有一年的交货收据(60 多张表格,每张都在单独的工作表上),所有收据都有相同的标题,我想将它们全部添加到年度汇总表中。
我只需要Art-No.
和Description
总计Delivered Quantity
,但逐一查看每张表并将它们合计起来会花很长时间。不是每个订单上都有相同的产品,也不是在同一订单中。有些产品可能一年只出现一次,而其他产品则出现在每个订单中。这有点混乱。
本质Art-No.
上是一个产品ID,可以用来识别产品(以及Description
)。
我尝试使用 Power Query 进行合并,但它并不能整合数据,而只是将其附加起来。
我试过了数据透视表但他们不想听到“数据源引用无效”的声音
有没有更简单的方法可以做到这一点?
答案1
我认为您使用 Power Query 的方法是正确的。通常,步骤如下:
将每个表加载到 Power Query 中(这很麻烦,但我不知道有任何批量加载选项)。您可以将默认选项设置为仅加载连接,这样就不会出现每个表的 Power Query 版本的重复工作表。
在 Power Query 编辑器中打开第一个表。选择附加查询(不是合并)来自功能区的“合并”部分。
在“追加”对话框中,选择第二个表,然后单击“确定”。对已加载到 Power Query 的每个表重复此操作。现在,您要将 60 个表中的行添加到一个“超级表”中。
当所有已加载的表格都已添加后,将附加查询加载到 Excel。
使用附加查询表作为数据源来创建数据透视表。选择 Art-No. 和 Description 作为行标签(格式为表格布局,无小计),选择 Quantity 作为值。
答案2
如果所有数据都在一张表中,那么将数据透视表应用于其中以生成摘要将非常容易。手动将 60 多张表复制并粘贴到一张表中需要几分钟,但可以做到。
或者,您可以使用宏进行复制和粘贴。假设每张工作表都从 A1 开始,并且所有工作表都包含数据表,则此宏应该有效:
Sub Macro1()
NumSheets = Application.Sheets.Count
Sheets.Add After:=Sheets(Sheets.Count)
i = 1
Do While i <= NumSheets
Sheets(i).Select
If (i = 1) Then
Range("A1").Select
Else
Range("A2").Select
End If
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets(NumSheets + 1).Select
If (i = 1) Then
Range("A1").Select
Else
Range("A2").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
End If
ActiveSheet.Paste
i = i + 1
Loop
End Sub
答案3
这是一种不使用 Power Query 的方法。
对于任何给定的表格,您可以使用以下方法汇总特定产品(Art-No.)的交付数量求和函数例如,以下公式将在名为 Table1 的表格中给出 Art-No. 59792 的总交付数量。
`=SUMIF(Table1[Art-No.],"=59792",Table1[Delivered Quantity])`
您可以使用间接函数从另一个单元格中提取表格名称。例如,如果单元格 A2 包含“Table1”,则以下公式将产生与上述公式相同的结果
`=SUMIF(INDIRECT(A2"[Art-No.]"),"=59792",INDIRECT(A2&"[Delivered Quantity]"))`
因此,要创建一个新表,其中包含每个表中每种文章类型的总数,您可以执行以下操作:
- 将所有文章编号放在第一行,从 B1 开始。
- 将所有表格名称放在第一列,从 A2 开始。
- 将以下内容复制到B2中
=SUMIF(INDIRECT($A2&“[Art-No.]”),B$1,INDIRECT($A2&“[交付数量]”))
- 复制 B2 并粘贴到表格的其余部分。
答案4
这是一个不使用 Power Query 或数据透视表的选项:
正如您在评论中所述,您可以创建您想要的结果表,其中包含除Ordered qty.
和Delivered qty.
字段之外的所有内容。这意味着我们要做的就是使用Art-no.
作为唯一 ID 来汇总每张工作表的值。
步骤1:创建一个包含所有工作表名称的列表。由于文件中有很多工作表,因此可以使用一些 VBA 来完成此操作。
Sub SheetNames()
Dim ws As Worksheet
Dim r As Integer
Set ws = Worksheets.Add
For r = 1 To Worksheets.Count
ws.Cells(r, 1).Value = Worksheets(r).Name
Next
End Sub
第2步:创建一个引用工作表名称列表的命名范围。我将列表转换为表格,并以此为基础确定名称范围,但您不必这样做。
步骤3:Ordered qty.
创建不填写和值的基础结果表Delivered qty.
。如果你没有可用的表,最简单的方法可能是使用类似阿德莱德爵士发布以合并所有工作表、删除不需要的字段、清除所有数量值并删除重复项。您可能想知道如果只是按照该方法操作,为什么还需要这些,但下一步中的技巧太酷了,不能不分享。
步骤4:编写公式来一次性汇总所有工作表中的数据。首先,以下是可用于的公式Ordered qty.
:
=SUMPRODUCT(SUMIF(INDIRECT("'"&sheets&"'!"&"B2:B10000"),[@[Art-no.]],INDIRECT("'"&sheets&"'!"&"D2:D10000")))
这是一个特殊的SUMIF
包裹。使用 3D 参考SUMPRODUCT
进行工作的关键是函数和我们制作的图纸名称列表。以下是公式的各个部分:SUMIF
INDIRECT
INDIRECT("'"&sheets&"'!"&"B2:B10000")
这是一个标准INDIRECT
函数,只不过我们引用了我们在步骤 2 中创建的指向工作表名称列表的命名范围。这就是使其成为 3D 引用的原因。我选择了它,B2:B10000
但您可以根据需要调整/扩展它。只要两个函数中的范围大小相同,就可以很容易地使引用比所需的大得多,以确保不会遗漏任何内容INDIRECT
。它需要指向Art-no.
其他工作表中的列。[@[Art-no.]]
由于我将结果表变成 Excel 中的实际表格,因此这只是指向带有Art-no.
公式的当前行中的值。INDIRECT("'"&sheets&"'!"&"D2:D10000")
这与另一个相同,INDIRECT
但它指向Ordered qty.
列。SUMIF(~)
现在变成了SUMIF(Art-no. from every sheet, Art-no. in this row, Ordered qty. from every sheet)
SUMPRODUCT(~)
将SUMIF
返回一个数组而不是单个值,因此我们使用它来将数组中的所有值相加。
的公式Delivered qty.
是相同的,只是您应该更改D2:D10000
为G2:G10000
或任何需要指向Delivered qty.
其他工作表中的列的内容。
值得赞扬的是,我发现了这个方法CreditJet.net我觉得这太棒了。