将多个表行组合到主表中

时间:2017-11-14 03:34:02

标签: excel office-2013

祝大家周一愉快!

有一个问题,希望你能提供帮助。我有一个预算标签的预算电子表格。在此选项卡上有大约8个表分为不同的类别。选项卡中的每个表都具有完全相同的列。是否有非vbscript / marco方法来创建一个主表,该表将所有表组合到不同选项卡中的单个表中。这看起来似乎没什么好事但是我已经尝试了我能想到的所有内容并在网上找到了,如果没有一个称为电源查询的插件,它似乎并不是一个不错的解决方案。

3 个答案:

答案 0 :(得分:2)

我知道你要求采用非VBA方式,但为了完整起见,我正在添加另一个也有VBA解决方案的答案,因为它简单易行,速度极快,而且通用。您需要做的就是将此代码剪切并粘贴到标准代码模块中,添加一个按钮并指定它以触发调用例程,为源表提供一个包含摘要表全名的名称,并且您对走。

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

当我按下该按钮时,代码将在整个工作簿中查找任何名称包含Destination表名称的表(在本例中为“SomeName”表),然后将其数据通过。因此,如果要添加新选项卡,则只要在其表名称前加上目标表的名称,就会包含它们。任何其他表(例如名为'DifferentName'的表将被忽略。

enter image description here

......这是结果:

enter image description here

答案 1 :(得分:1)

您可以使用pivottable向导的功能将多个范围(即您的表)合并到一个pivottable中。

当提示您添加范围时,请使用具有以下语法的表名:Table4[#All]

您需要[#All]来获取与该表相关联的所有数据。只需对要合并的每个表名重复此操作。

我在答案中给出的完整描述:

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

注意:如果要保留原始表名或表号,则需要选择选项:

1)“我将创建页面字段”

2)使用表格名称输入范围,例如表4 [#ALL]

3)选择您想要的页数字段1-4并添加用于标识下面所选范围的项目标签,例如表4

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

以下引用来自此处:http://www.contextures.com/xlPivot08.html

我包含一些大纲,以防链接丢失。

PowerQuery:

如果您的Excel版本支持Microsoft的Power Query加载项,则可以使用它来合并两个或多个表中的数据。这些表可以位于同一工作簿中,也可以位于不同的文件中。

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

Union Query:

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

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

答案 2 :(得分:0)

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

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

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