将多个表行组合到主表中

每个人都快乐!

有一个问题,并希望你能帮助。 我有一个预算标签的预算电子表格。 在这个标签上大概有8个表格被分成不同的类别。 选项卡中的每个表都具有完全相同的列。 是否有一个非VBScript / MARCO的方式来创build一个主表,将所有的表合并到一个不同的表中的一个表。 这似乎是一个没有脑子,但我已经尝试了一切,我可以想到和网上find,似乎并没有一个体面的解决scheme,没有一个插件称为电力查询。

您可以使用透视表向导的function将多个范围(即您的表)合并到一个透视表中。

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

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

详细描述我在这里给出的答案是:

结合两张纸上的数据并在另一张纸上生成数据透视表

注意:如果您想保留原始表格名称或表格号码,您需要select以下选项:

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

2)使用表名input范围,例如Table4 [#All]

3)select你想要多less个页面字段1-4,并添加用于标识下面选定范围的项目标签,例如表4。

我不确定4项是最大的还是可以通过VBA扩展的。 不过你也可以使用PowerQuery或者UnionQuery。

下面的引用来自这里: http : //www.contextures.com/xlPivot08.html

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

PowerQuery:

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

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

联合查询:

如果无法将数据合并到一个工作表中,则另一种解决scheme是在Excel文件中创build命名范围,并使用Microsoft Query(MS Query)合并数据。

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

我知道你问了一个非VBA的方法,但为了完整性,我添加了另外一个也有VBA解决scheme的答案,因为它非常简单,速度非常快,而且是通用的。 所有你需要做的是剪切和粘贴这个代码到一个标准的代码模块,添加一个button,并分配它触发调用例程,给你的源表名称包括汇总表的全名,你很好走。

 Option Explicit 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 lRows 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 Set rDest = loDest.HeaderRowRange.Offset(1 + loDest.ListRows.Count).Resize(.ListRows.Count, loDest.ListColumns.Count) On Error Resume Next lRows = loDest.DataBodyRange.Rows.Count On Error GoTo 0 loDest.Resize loDest.Range.Resize(lRows + lo.DataBodyRange.Rows.Count) 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 = lo.Name 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 

当我按下这个button时,代码将遍及整个工作簿查看名称中包含目标表名称(在本例中称为“SomeName”的表)的表,然后通过它们的数据。 所以,如果你要添加新的tabes,那么只要你在表名中加上目的表的名字,他们就会被包含在内。 任何其他表(例如名为“DifferentName”的表将被忽略。

在这里输入图像说明

…这是结果:

在这里输入图像说明

如果您使用的是Excel 2013或更高版本,那么这是使用PowerQuery(现在在function区中称为“获取和转换”)的理想借口。 在excel间接函数的回答中,您可以看到与您的要求非常相似的内容, 以读取date并返回dynamic值

我强烈build议你去看看那个线程…即使由于某种原因你不能使用PowerQuery来处理这个特定的挑战,因为我认为值得一看的是使用PowerQuery来捣碎相同的表是多么简单,即使仅供将来参考。 它基本上是一个盒子里的VBA开发者。 这是一个VBA瘸子!