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) 中分发的。

https://support.microsoft.com/en-us/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544

更新: 这是 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 用户界面控件。

以下是完整的重现说明:

  1. 创建一个新的 Access 数据库。

  2. 创建一个新的 table Table1,其中包含字段 ID(长整型)和 MyText(文本)以及以下记录:

    ID: 1, MyText: A
    ID: 2, MyText: B
    
  3. 创建一个带有文本框 Text0 的新空表单 Form1 并保存。

  4. 打开表单并在文本框中输入 1。按“Tab”键“保存”值并保持表单打开。

  5. 使用以下 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;
    

    (是的,这种转换毫无意义,在查询中引用表单控件是不好的做法,但这只是一个最小的重现示例。)

  6. 执行交叉表查询以确认它有效。保存并关闭它。 (不要在设计视图中打开它,否则您必须在能够保存它之前修复一些不影响 SQL 的仅限设计时的内容。)

  7. 在 VBA 代码编辑器的 window 中立即执行:

     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "CrosstabQuery1", "C:\temp\repro.xlsx"
    

预期结果:交叉表查询结果导出到Excel.

实际结果(在安装了 KB4493206 的 Access 2013 上):错误“3251 - 此对象类型不支持操作”

我也在 Microsoft 论坛上 reported this bug

我通过禁用数据库缓存解决了这个问题。