3

过去,Excel 中的外部数据查询用QueryTables表示。
ListObjects出现在某个时间点,但它们尚未与QueryTables 兼容并且无法包含它们。

在 Office 2007 中,它们不仅兼容,而且成为默认设置。从那时起,创建一个外部查询就意味着创建一个ListObject, 并且QueryTable被简化为它的内部组件。

“独立”的 QueryTables,没有包装在 ListObject 中,不能再用接口创建,但可以用代码创建,并且在新旧文件格式中都得到完美支持。

然后 Excel 2016 出现并引入了一个错误,在“独立”QueryTable 的情况下,在某些情况下会永久损坏工作簿。从错误中保存 QueryTables 的唯一方法是将它们包装在 ListObject 中。


所以我有 10k+ 旧版 Excel 文档,其中现有QueryTable的 s 需要用ListObjects 包装。重要的是,大多数查询表的右侧都有自动填写的公式。

使用 Excel 界面,将查询包装在列表中很简单(在查询结果中激活一个单元格,Insert- Table- Ok)并且可以像预期的那样工作,留下一个功能齐全的列表,从查询中获取其数据。

将此操作记录为宏会产生:

ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$5:$D$9"), , xlYes).Name = _
    "Table_Query_from_MS_Access"

然而,在不做任何修改的情况下执行这段代码会产生一个 Frankenstein 查询表:它在外部看起来像一个列表对象,但它不起作用,无法刷新,无法编辑,显示旧式属性对话框,列表对象报告它是一个xlSrcRange而不是xlSrcQuery由接口创建的列表报告。

像电子一样,它会干扰自身(列表对象部分与查询表部分重叠并因此拒绝刷新,即使它们应该是相同的 - 回想一下查询表右侧有公式,它们现在也必须是列表的一部分):

在此处输入图像描述

很明显,在转换表格时,界面比宏记录器捕获的要多得多。

我尝试ListObjects.Add使用各种参数进行调用,提供 aRange作为源、aWorkbookConnection作为源、aQueryTable作为Connection源 - 只要它与现有的 QueryTable 重叠,它就不起作用。

我已经研究过取消链接现有的 QueryTable 并从头开始重新创建 ListObject ,但这会导致表格周围的公式出现各种问题。

QueryTable以编程方式用 a包装现有的完整、正确的代码ListObject是什么,与接口的功能完全匹配?

目前在我看来,我将不得不通过直接操作我讨厌的 xslx 格式中的 XML 来做到这一点。

4

2 回答 2

1

我无法以编程方式将 QueryTable 包装在 ListObject 中,但我可以为 Microsoft 的 Excel 2016/2019 QueryTable 错误提供缓解措施,因为避免其影响似乎是您的真正目标。

  1. Event 1 Software 的闭源 3rd-party Excel 加载项 - 根据我的经验,这通常可以解决问题,但我只有几份报告仍然受到影响。您需要 2.11 或更高版本。您可以使用公式检查加载的加载项的版本:=XLQT3Version()

  2. 更改报告设计以降低 Microsoft 错误的风险(来源:报告设计的广泛工作,包括在没有安装任何事件 1 产品的系统上):

2.1 确保您的 QueryTable 的标题不是 QueryTable 的一部分。您仍然可以在表格上方有一个手动标题。

2.2 在 QueryTable 的第一行上方(QueryTable 和手动表头之间)插入一个空白行。

2.3 在新的空白行中,粘贴 QueryTable 所需的所有格式和公式。

2.4 将新行的高度设置为“3”。这将防止标头被完全或部分复制到 QueryTable 的正文中。相反,该错误将导致将所需的格式和公式复制到 QueryTable 中,而不是破坏 oueryTable 的那些部分。重要提示:您不得隐藏行或将行高设置得太低。这样做会消除它的保护作用。

2.5 刷新前禁用所有数据过滤器。您可以在刷新完成后重新应用它们。如果您需要自动执行此操作,请挂钩 QueryTable 的刷新之前/之后事件,或者使用删除它们的宏,开始刷新,然后恢复它们。

2.6 分组的行和小计也应该在刷新之前删除,然后恢复。刷新后。分组列是可以的。

  1. Manual finagle(来源:Event 1 Software 的技术支持):

3.1 打开一个受影响的文档,该文档在错误损坏后尚未保存。也就是说,一个未损坏但将被 MS 错误损坏的文档。

3.2 不允许文档连接到数据源或刷新。取消任何登录请求。

3.3 等待至少 4 秒。

3.4 刷新 QueryTable(如果需要登录)。

3.5 再次刷新 QueryTable(有时是第三次。

于 2019-11-19T22:42:56.940 回答
0

尝试将我的查询表 CSV 转换为表时遇到了同样的问题。我没有找到将查询表转换为列表对象的直接方法,但由于我的信息是静态的,因此我使用了一个简单的解决方法。

  1. 使用 querytable 方法创建临时工作表以导入数据
  2. 将临时工作表中的数据复制到计划工作表中
  3. 隐蔽复制数据到表中,然后插入公式

如果您的 XML 数据不是动态的并且不需要保持到外部数据的链接,那么这可能对您有用。否则,这将不是一个有效的解决方法。

于 2018-04-13T20:21:29.020 回答