TransferSpreadsheet 错误 3251 Operation Not Supported
TransferSpreadsheet Error 3251 Operation Not Supported
我有代码可以将 MS Access (201613) 查询结果导出到 Excel 已工作多年的电子表格中。
这是代码(没有发布我在上面的所有变量定义):
strSQL = "select[query].* FROM [query] "
Set qdf = dbs.CreateQueryDef("MKTShare", strSQL)
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "MKTShare", "\path\file.xlsx", _
True, ""
DoCmd.DeleteObject acQuery, "MKTShare"
给出的错误是 3251 - 此对象类型不支持操作
试了两台机器,一台运行ning WIN10,一台WIN7。同样的结果。真正奇怪的是,这个问题主要出现在交叉表查询中。 “标准”select 查询没有问题。如果我将 xtabquery 转换为 table 然后导出 table,没问题,但这是一个非常低效的解决方案,因为我在循环中有很多查询非常大的数据集 运行ning .
如果我从 Access 中 运行 查询,查询会显示很好的结果。问题出在传输电子表格方法上。
它发生在昨天 Windows 更新之后。
我尝试使用 Output 解决方法,但它不适用于预填充的 Excel 模板,因为它搞砸了要导出到的整个文件。
我昨天刚 运行 进入这个确切的问题。昨天安装的 Windows 更新的网页中有线索。 Jet/ACE 似乎添加了一个新的与安全相关的注册表项,以防止连接到远程源。不确定为什么 T运行sferSpreadsheet Export 中的交叉表查询会受到影响(一定是 t运行sfer 电子表格工作原理的幕后),但我可以通过此更新成功 运行 我的命令已卸载。
这里是 link 更新。它是在办公室安全更新 (KB4493206) 中分发的。
更新: 这是 2021 年 5 月 Office MSI 版本安全更新中引入的错误。微软知道它并正在修复错误。引用 MVP Tom van Stiphout 在 MS Answers thread 中的回答:
I heard back from MSFT. This is an issue with A2013 and A2016 MSI, and will be likely be fixed in the July update.
我们有同样的问题。我做了更多的调试并设法创建了一个最小的可重现示例。显然,问题只发生
- 在 Access 2013 中安装了 KB4493206(可能在 Access 2016 MSI 中也安装了相应的 KB,但我无法验证,因为我只有 Access 2016 的 C2R 版本),
- 当使用
DoCmd.TransferSpreadsheet
和 导出 交叉表 查询时
- 查询引用了 Access 用户界面控件。
以下是完整的重现说明:
创建一个新的 Access 数据库。
创建一个新的 table Table1
,其中包含字段 ID
(长整型)和 MyText
(文本)以及以下记录:
ID: 1, MyText: A
ID: 2, MyText: B
创建一个带有文本框 Text0
的新空表单 Form1
并保存。
打开表单并在文本框中输入 1
。按“Tab”键“保存”值并保持表单打开。
使用以下 SQL 创建一个新的交叉表查询 CrosstabQuery1
:
PARAMETERS [Forms]![Form1]![Text0] Long;
TRANSFORM First(Table1.MyText) AS FirstValueOfMyText
SELECT Table1.ID
FROM Table1
WHERE ((([Forms]![Form1]![Text0])=1))
GROUP BY Table1.ID
PIVOT Table1.ID;
(是的,这种转换毫无意义,在查询中引用表单控件是不好的做法,但这只是一个最小的重现示例。)
执行交叉表查询以确认它有效。保存并关闭它。 (不要在设计视图中打开它,否则您必须在能够保存它之前修复一些不影响 SQL 的仅限设计时的内容。)
在 VBA 代码编辑器的 window 中立即执行:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "CrosstabQuery1", "C:\temp\repro.xlsx"
预期结果:交叉表查询结果导出到Excel.
实际结果(在安装了 KB4493206 的 Access 2013 上):错误“3251 - 此对象类型不支持操作”
我也在 Microsoft 论坛上 reported this bug。
我通过禁用数据库缓存解决了这个问题。
我有代码可以将 MS Access (201613) 查询结果导出到 Excel 已工作多年的电子表格中。
这是代码(没有发布我在上面的所有变量定义):
strSQL = "select[query].* FROM [query] "
Set qdf = dbs.CreateQueryDef("MKTShare", strSQL)
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "MKTShare", "\path\file.xlsx", _
True, ""
DoCmd.DeleteObject acQuery, "MKTShare"
给出的错误是 3251 - 此对象类型不支持操作
试了两台机器,一台运行ning WIN10,一台WIN7。同样的结果。真正奇怪的是,这个问题主要出现在交叉表查询中。 “标准”select 查询没有问题。如果我将 xtabquery 转换为 table 然后导出 table,没问题,但这是一个非常低效的解决方案,因为我在循环中有很多查询非常大的数据集 运行ning .
如果我从 Access 中 运行 查询,查询会显示很好的结果。问题出在传输电子表格方法上。
它发生在昨天 Windows 更新之后。
我尝试使用 Output 解决方法,但它不适用于预填充的 Excel 模板,因为它搞砸了要导出到的整个文件。
我昨天刚 运行 进入这个确切的问题。昨天安装的 Windows 更新的网页中有线索。 Jet/ACE 似乎添加了一个新的与安全相关的注册表项,以防止连接到远程源。不确定为什么 T运行sferSpreadsheet Export 中的交叉表查询会受到影响(一定是 t运行sfer 电子表格工作原理的幕后),但我可以通过此更新成功 运行 我的命令已卸载。
这里是 link 更新。它是在办公室安全更新 (KB4493206) 中分发的。
更新: 这是 2021 年 5 月 Office MSI 版本安全更新中引入的错误。微软知道它并正在修复错误。引用 MVP Tom van Stiphout 在 MS Answers thread 中的回答:
I heard back from MSFT. This is an issue with A2013 and A2016 MSI, and will be likely be fixed in the July update.
我们有同样的问题。我做了更多的调试并设法创建了一个最小的可重现示例。显然,问题只发生
- 在 Access 2013 中安装了 KB4493206(可能在 Access 2016 MSI 中也安装了相应的 KB,但我无法验证,因为我只有 Access 2016 的 C2R 版本),
- 当使用
DoCmd.TransferSpreadsheet
和 导出 交叉表 查询时
- 查询引用了 Access 用户界面控件。
以下是完整的重现说明:
创建一个新的 Access 数据库。
创建一个新的 table
Table1
,其中包含字段ID
(长整型)和MyText
(文本)以及以下记录:ID: 1, MyText: A ID: 2, MyText: B
创建一个带有文本框
Text0
的新空表单Form1
并保存。打开表单并在文本框中输入
1
。按“Tab”键“保存”值并保持表单打开。使用以下 SQL 创建一个新的交叉表查询
CrosstabQuery1
:PARAMETERS [Forms]![Form1]![Text0] Long; TRANSFORM First(Table1.MyText) AS FirstValueOfMyText SELECT Table1.ID FROM Table1 WHERE ((([Forms]![Form1]![Text0])=1)) GROUP BY Table1.ID PIVOT Table1.ID;
(是的,这种转换毫无意义,在查询中引用表单控件是不好的做法,但这只是一个最小的重现示例。)
执行交叉表查询以确认它有效。保存并关闭它。 (不要在设计视图中打开它,否则您必须在能够保存它之前修复一些不影响 SQL 的仅限设计时的内容。)
在 VBA 代码编辑器的 window 中立即执行:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "CrosstabQuery1", "C:\temp\repro.xlsx"
预期结果:交叉表查询结果导出到Excel.
实际结果(在安装了 KB4493206 的 Access 2013 上):错误“3251 - 此对象类型不支持操作”
我也在 Microsoft 论坛上 reported this bug。
我通过禁用数据库缓存解决了这个问题。