过去,Excel 中的外部数据查询用QueryTable
s表示。
ListObjects
出现在某个时间点,但它们尚未与QueryTable
s 兼容并且无法包含它们。
在 Office 2007 中,它们不仅兼容,而且成为默认设置。从那时起,创建一个外部查询就意味着创建一个ListObject
, 并且QueryTable
被简化为它的内部组件。
“独立”的 QueryTables,没有包装在 ListObject 中,不能再用接口创建,但可以用代码创建,并且在新旧文件格式中都得到完美支持。
然后 Excel 2016 出现并引入了一个错误,在“独立”QueryTable 的情况下,在某些情况下会永久损坏工作簿。从错误中保存 QueryTables 的唯一方法是将它们包装在 ListObject 中。
所以我有 10k+ 旧版 Excel 文档,其中现有QueryTable
的 s 需要用ListObject
s 包装。重要的是,大多数查询表的右侧都有自动填写的公式。
使用 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 来做到这一点。