【问题标题】:How to combine Excel data from 40 Workbooks with 25 Worksheets in each?如何将 40 个工作簿中的 Excel 数据与每个工作簿中的 25 个工作表结合起来?
【发布时间】:2015-05-12 15:19:58
【问题描述】:

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

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

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

例如如果选择了“Team 1”和“Jan-15”,数据透视表将显示 Team 1 的 1 月份数据。如果选择了“Team 5”和“Mar-15”,则将提取 Team 1 和 Team 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 日的数据,有时我需要团队 1 到 10 的 3 月 15 日的数据,有时我需要查看所有 40 个团队的数据过去 12 个月的数据。

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

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

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

是我的SQL代码错了,还是有更好的写法?

或者还有其他方法可以合并所有这些数据吗? (我只有 Excel,没有 Access!)

【问题讨论】:

  • 使用此方法可以在 SQL 查询中执行的联合数是有限制的。您是否有理由不能使用 VBA 来简单地复制值?
  • 您可以只从每个文件中提取数据,一次一个,然后将其粘贴到“主”电子表格中(对于使用复选框请求的所有文件)。然后每次粘贴之前,检查工作表中最后一行的数据。这样,查询不会变得太复杂,您将在主表中获得所有必需的数据。 (这个想法和马斯卡罗先生是一样的,但是我没有刷新页面看到他的建议)。

标签: sql vba excel odbc


【解决方案1】:

您的查询很好,正如错误所说,您只是创建了一个过于复杂的查询,让可怜的Jet* Engine 无法处理。我建议您将其分解为一个简单的循环,在该循环中将每个团队/月复选框组合作为单独的查询处理,每个将数据拉入您的主表并附加到您的末尾数据透视表所依据的数据集。

通过一些测试,您可能会确定您可以在不使数据库引擎不堪重负的情况下拉动一个团队一年,并编写您的代码以这种方式工作(例如,最多 12 个Union),但这会让你的代码更复杂。您可能会发现不必进行如此多的 SQL 查询,它会执行得更快一些,但话又说回来,因为它们更复杂,它们可能执行得更慢。

*是的,我知道它不再被称为“Jet”,但我选择让 Wiki 链接处理细线,尽管微软希望我们这样做,但大多数人可能仍然这样称呼它。

【讨论】:

  • 对不起,我的代表不够高,无法投票赞成你的答案 FreeMan :-)
【解决方案2】:

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

我今天使用发布的 cmets 设法解决了这个问题;使用 VBA 循环工作簿和工作表,使用复选框将每个工作表中的数据复制到另一个(报告)工作簿中的主工作表中,然后使用 VBA 从主数据创建数据透视表。

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

我认为最初我尝试使用 Query/SQL 使问题过于复杂,但我发现这是基于我事先在“网络”上进行的研究的方法。我认为复制所有数据可能过于耗时和困难,但事实证明并非如此。

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

希望这可以帮助将来的人!

NGH

【讨论】:

    猜你喜欢
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多