如何将40个工作簿中的Excel数据与25个工作表组合在一起?

时间:2015-05-12 15:19:59

标签: sql excel vba excel-vba odbc

我有40个Excel工作簿,每个工作簿包含25个工作表,其中包含A列中的数据:Q和可变行数(小于5000行)。

40个工作簿中的每一个代表1个团队。 25个工作表中的每一个都是1个月的数据,这些工作表被命名为“Jan-15”,“Feb-15”等......到'Dec-16',所以到目前为止显然只有5张工作表有数据(因为它现在是5月15日)。每个工作簿都是为将来的数据而设置的。

我需要将所有数据放到一个地方,我认为最好使用数据透视表。到目前为止,我已经设置了一个包含VBA代码的附加工作簿,以将所需数据提取到一个数据透视表中。它通过在每个团队的工作表上设置复选框以及每个月的更多复选框来实现此目的。如果选中该复选框(= TRUE),则将拉出该团队和月份的数据。

E.g。如果选择“Team 1”和“Jan-15”,数据透视表将显示Team 1的January数据。如果选择“第5队”和“3月15日”,那么第1组和第5组的1月和3月数据将被提取。

这是否在VBA中通过编译所需数据的SQL字符串(我的SQL知识仅限于2天的研究!),例如:

SELECT * 
  FROM `Team 13.xlsx`.[JAN-15$] 
UNION ALL 
SELECT * 
  FROM `Team 13.xlsx`.[FEB-15$] 
UNION ALL 
SELECT * 
  FROM `Team 13.xlsx`.[MAR-15$] 
UNION ALL 
SELECT * 
  FROM `Team 15.xlsx`.[JAN-15$] 
UNION ALL 
SELECT * 
  FROM `Team 15.xlsx`.[FEB-15$] 
UNION ALL 
SELECT * 
  FROM `Team 15.xlsx`.[MAR-15$]"  
   etc....

有时候我只需要看一下团队​​3的1月15日和2月15日的数据,有时候我需要3到10月份的团队1到10的数据,有时候我需要看到所有40个团队的数据过去12个月的数据。

然而,我现在正在努力,因为这只适用于一定数量的选择。我一次只需要选择最多12个月,所以我限制了可以选择的“月份”复选框的数量,但我无法选择所有40个团队和所有12个月,因为我收到错误消息那说

  

运行时错误“1004”:[Microsoft] [ODBC Excel驱动程序]查询过于复杂。

如果我只选择10个团队和5个月,或40个团队和1个月,则查询运行正常,但我需要更多。

我的SQL代码是错误的,还是有更好的方法来编写它?

还是有其他方法可以合并所有这些数据吗? (我只有Excel,而不是Access,我可以使用!)

2 个答案:

答案 0 :(得分:2)

您的查询很好,就像错误所说的那样,只是为穷人Jet* Engine创建的查询太复杂了。我建议你把它分解成一个简单的循环,你将每个团队/月复选框组合作为一个单独的查询处理,每一个都将数据拉入你的主表,追加到你的结尾创建数据透视表的数据集。

通过一些测试,您可以确定您可以将团队拉出一年而不会压倒数据库引擎,并编写代码以便以这种方式工作(例如,最多12 Union个),但这会使你的代码更复杂。您可能会发现它不会执行如此多的SQL查询会更快地执行,但是再次,因为它们更复杂,它们可能执行得更慢。

*是的,我知道它并未被称为" Jet"更多,但我选择让维基链接处理好细节,尽管微软希望我们这样做,大多数人仍然可能称之为。

答案 1 :(得分:0)

感谢回答此问题的人们。非常感谢您的帮助和经验: - )

我已经设法使用发布的评论对此进行排序;使用VBA循环浏览工作簿和工作表,使用复选框将每个工作表中的数据复制到另一个(报表)工作簿中的主工作表中,然后使用VBA从主数据创建数据透视表。

感谢 FreeMan 发布回答,但遗憾的是我的SQL和查询技能非常有限,我不明白或不知道如何实施您的建议!所以我认为我的VBA解决方案对我来说最容易做到并且有效。

我认为最初我试图使用Query / SQL过于复杂,但我发现这是基于我预先搜索'网络的研究的方法。我认为复制所有数据可能太费时间和困难,但事实证明并非如此。

我可以发布用于检查复选框的代码,打开文件,选择工作表,复制数据并创建数据透视表,如果有人需要这样做的话。

希望将来可以帮助某人!

NGH