将多个 Table 行组合成主 Table

Combine Multiple Tables Rows Into Master Table

大家周一快乐!

有问题希望能帮到你。我有一个包含预算选项卡的预算电子表格。在此选项卡上大约有 8 table 分为不同的类别。选项卡中的每个 table 都有完全相同的列。有没有一种 non-vbscript/marco 方法可以创建主 table,将所有 table 组合到不同选项卡中的单个 table。这似乎很容易,但我已经尝试了所有我能想到的并在网上找到的东西,如果没有一个叫做 power query 的插件,似乎没有一个像样的解决方案。

您可以使用数据透视table 向导的功能将多个范围(即您的 table)合并为一个数据透视table。

当提示您添加范围时,请使用 table 名称,语法如下:Table4[#All]

您需要 [#All] 来获取与 table 关联的所有数据。只需为每个要合并的 table 名称重复此操作即可。

我在此处的回答中给出了完整描述:

combining data from two sheets and generating pivot table in another sheet

注意:如果您想保留原始 table 姓名或 table 号码,您需要 select 选项:

1) "I will create the Page Fields"

2) 使用 table 名称输入范围,例如表 4[#全部]

3) Select 您想要多少个页面字段 1-4 并添加用于标识下面的 selected 范围的项目标签,例如表 4.

我不确定 4 项是否是最大值,或者是否可以通过 VBA 扩展。但是,您也可以使用 PowerQuery 或 UnionQuery。

以下引述来自这里:http://www.contextures.com/xlPivot08.html

我添加了一些大纲以防链接丢失。

PowerQuery:

如果您的 Excel 版本支持 Microsoft 的 Power Query 插件,您可以使用它将数据合并到两个或多个 table 中。 table 可以在同一个工作簿中,也可以在不同的文件中。

http://www.contextures.com/xlPivot08.html#videopowerquery

联合查询:

如果您无法在单个工作表上合并数据,另一种解决方案是在 Excel 文件中创建命名范围,然后使用 Microsoft Query (MS Query) 合并数据。

http://www.contextures.com/xlPivot08.html#union01

如果您有 Excel 2013 或更高版本,那么这是使用 PowerQuery 的完美借口,它现在在功能区中称为 'Get & Transform'。您可以在 excel indirect function to read dates and return dynamic values

的回答中看到与您的要求非常相似的内容

我强烈建议你去看看那个线程...即使出于某种原因你不能使用 PowerQuery 来应对这个特定的挑战,因为我认为值得看看将相同的表混在一起是多么简单使用 PowerQuery,即使只是为了将来参考。它基本上是一个 VBA 盒子里的开发人员。这是一个 VBA 的 gimp!

我知道您要求的不是 VBA 方式,但为了完整起见,我添加了另一个答案,该答案也有一个 VBA 解决方案,因为它非常简单,速度非常快,而且通用的。您需要做的就是将这段代码剪切并粘贴到标准代码模块中,添加一个按钮并分配它来触发调用例程,为您的源tables 命名包括摘要的全名table,你就可以开始了。

Sub CombineTables(loDest As ListObject, Optional lcSource As ListColumn)

Dim ws              As Worksheet
Dim lo              As ListObject
Dim lc              As ListColumn
Dim rDest           As Range
Dim lDestRows       As Long
Dim lSourceRows     As Long

Application.ScreenUpdating = False

If lcSource Is Nothing Then Set lcSource = loDest.ListColumns(1)
If loDest.ListRows.Count > 0 Then loDest.DataBodyRange.Delete

For Each ws In ActiveWorkbook.Worksheets
    For Each lo In ws.ListObjects
        If lo <> loDest Then
            With lo
                If InStr(.Name, loDest.Name & "_") > 0 Then
                    On Error Resume Next
                    lDestRows = loDest.ListRows.Count
                    On Error GoTo 0
                    lSourceRows = .ListRows.Count
                    If lSourceRows > 0 Then

                        'Work out where we want to paste the data to
                        Set rDest = loDest.HeaderRowRange.Offset(1 + lDestRows).Resize(lSourceRows)

                        'Resize the destination table
                        loDest.Resize loDest.Range.Resize(1 + lSourceRows + lDestRows)       

                        For Each lc In .ListColumns
                         Intersect(loDest.ListColumns(lc.Name).Range.EntireColumn, rDest).Value2 = lc.DataBodyRange.Value
                        Next lc
                        Set lc = Nothing
                        On Error Resume Next
                        Set lc = .ListColumns(lcSource.Name)
                        On Error GoTo 0
                        If lc Is Nothing Then Intersect(lcSource.Range, rDest.EntireRow).Value2 = ws.Name
                    End If
                End If
            End With
        End If
    Next lo
Next ws

Application.ScreenUpdating = True

End Sub

来电者是:

Sub CombineTables_Caller()
CombineTables [SomeName].ListObject, [SomeName].ListObject.ListColumns("Source")
End Sub

当我按下该按钮时,代码将在整个工作簿中查找名称包含目的地名称 table 的任何 table(在本例中 Table "SomeName"), 然后把他们的数据带过来。因此,如果您要添加新标签,那么只要您在它们的 Table 名称前加上目的地名称 table,它们就会被包括在内。任何其他 tables(例如名为 'DifferentName' 的将被忽略。

...结果如下: